如何在vba中用控件模块实现满足条件的单元格填充相应的颜色

如图,如何将符合条件(某一行中最大的值)的单元格填充相应的颜色(如果最大值是属于第5列则填充红色,最大值在第6列则填充绿色,第7列则蓝色,第8列粉色,要求可以实时完成填色,第1到第4列也有数据,而且数据会随着时间的推移增加行数,如果不能实时填色至少要保证可以用模块控件手动完成填色谢谢!(要求VBA代码实现,不是函数公式)

'把下面代码,复制到对应的工作表下。仅当A至D列发生改变时,E至H列自动填充颜色。
'本来想用Find函数,但容易出问题,它随着查找功能的默认值会发生变化。
'代码中,也考虑了最大值发生改变的情况,不会重复填充颜色。
 Private Sub Worksheet_Change(ByVal Target As Range)
   lb = Asc(Split(Target.Address, "$")(1))
   Dim rng As Range
   Colors = Array(3, 4, 41, 39)
   If 65 <= lb And lb <= 68 Then
     For i = 1 To [E65536].End(xlUp).Row
        c = 0
        Max = Application.Max(Range("E" & i & ":H" & i))
        For Each rng In Range("E" & i & ":H" & i).Cells
            If rng.Value = Max Then
                Range("E" & i & ":H" & i).Interior.ColorIndex = 0
                rng.Interior.ColorIndex = Colors(c)
                Exit For
            End If
            c = c + 1
        Next
    Next
   End If
End Sub
'我人一直在,哪不符合要求,可以Hi我,或回复也行。

追问

能解释一下第二句“lb = Asc(Split(Target.Address, "$")(1))”的意思吗?

另外,为什么会出现下图的情况,只有第5列出现,第6,7,8没有出现

追答

Target.Address为触发该事件的的单元格区域地址,格式为$A$1这种类型
Split(Target.Address, "$")(1)为取第一个$字符后面的字符,该句就是取得当前编辑的列,比如A列
asc为取得A的ASC字符码,方便后面If 65 <= lb And lb <= 68 ,65为A,68为D

额,max函数会返回第一个最大的单元格值,四个单元格都相同,默认会填充第一个。
我帮你再改下。

追问

那麻烦你了,为什么在过程的前面如果出现 Option Explicit 就会不能运算?

追答

Option Explicit是强制所有变量必须声明,否则程序会出错。
另外,你每一列的最后一行都相同吗?
如果都想相同,请把[E65536].End(xlUp).Row修改为[A65536].End(xlUp).Row
以A列为参考,取得本表的最后一行,所在的行号。

追问

这个修改很好用,但是有个问题,当我删除第1到第4列的数据后,第5到第8列的颜色不会恢复原来的无色状态,怎么解决这个问题?

追答

哦,这个还真没考虑到,再帮你改下吧

温馨提示:答案为网友推荐,仅供参考