Excel,突出显示一系列连续的重复值

时间:2014-11-12 18:54:45

标签: excel vba excel-vba user-defined-functions

我有一个服务器可用性脚本,在.csv文件中报告0或1。我正在尝试在Excel 2010中创建VBA用户定义函数来分析文件中的每个列(服务器),并突出显示连续3次出现“1”的所有实例。

Time        srv1  srv2  srv3  srv4
2:01:00 AM     0     0     0     0    
2:21:00 AM     1     0     0     0    
2:41:00 AM     1     0     0     0    
3:01:00 AM     1     0     0     0    
3:21:00 AM     1     0     0     0    
3:41:00 AM     0     0     0     0    
4:01:00 AM     0     0     0     0    

我是VBA& amp;的新手UDF,但这是我尝试过的(没有成功):

Function HighlightConsecutive(ByRef rng As Range, myNum) As Long
Dim a, i As Long
a = rng.Value
For i = 1 To UBound(a, 2) - 1
    If (a(1, i + 1) = myNum) * (a(1, i) = myNum) Then
        CountConsecutive = CountConsecutive + 1
    End If
    If (CountConsecutive >= 3) Then
        ActiveCell.Interior.Color = RGB(255, 0, 0)
    End If
Next
End Function

我还尝试了一系列不同的公式和条件格式的解决方案,如SO和其他地方所见,但它坦率地看起来很笨重而且不够强大

实际文件包含16列@ 720行,我将分析其中的许多列。我的目的是使用过滤来查看突出显示的单元格。

如果函数可以忽略更大的'1'

系列中的单个'0',则可获得额外的功劳

3 个答案:

答案 0 :(得分:2)

这将遍历所有列:(编辑:直到到达最后一列)

Sub ColorCells()
    Dim cl As Long, N As Long, i As Long, LastCL As Long
    N = Cells(Rows.Count, "A").End(xlUp).Row
    LastCL = Cells(2, Columns.Count).End(xlToLeft).Column
    For cl = 2 To LastCL
    For i = 3 To N
        Set r1 = Cells(i, cl)
        Set r2 = r1.Offset(-1, 0)
        Set r3 = r1.Offset(-2, 0)
        If r1.Value = 1 And r2.Value = 1 And r3.Value = 1 Then
            Union(r1, r2, r3).Interior.Color = RGB(255, 0, 0)
        End If
    Next i
    Next cl
End Sub

答案 1 :(得分:1)

我们将使用 sub 而不是函数。此子查看列 B

Sub ColorCells()
    Dim cl As String, N As Long, i As Long
    cl = "B"
    N = Cells(Rows.Count, cl).End(xlUp).Row
    For i = 3 To N
        Set r1 = Cells(i, cl)
        Set r2 = r1.Offset(-1, 0)
        Set r3 = r1.Offset(-2, 0)
        If r1.Value = 1 And r2.Value = 1 And r3.Value = 1 Then
            Union(r1, r2, r3).Interior.Color = RGB(255, 0, 0)
        End If
    Next i
End Sub

您可以将其改编为其他列。

修改#1

以下是使用多列调用它的修改(在此示例中 B 通过 G

Sub ColorCells(cl As Variant)
        Dim N As Long, i As Long
        N = Cells(Rows.Count, cl).End(xlUp).Row
        For i = 3 To N
            Set r1 = Cells(i, cl)
            Set r2 = r1.Offset(-1, 0)
            Set r3 = r1.Offset(-2, 0)
            If r1.Value = 1 And r2.Value = 1 And r3.Value = 1 Then
                Union(r1, r2, r3).Interior.Color = RGB(255, 0, 0)
            End If
        Next i
End Sub

Sub MAIN()
    For i = 2 To 6
        Call ColorCells(i)
    Next i
End Sub

VBA 函数( UDF s)通常用于将值返回到单元格而不是一般的单元格更新。

答案 2 :(得分:1)

您也可以使用条件格式来执行此操作。

如果您在上面列出的数据位于范围A2:E9(需要顶部的缓冲区行,因为您稍后会看到),那么您可以选择范围B3:E9并创建一个新的规则和Use a formula to determine which cells to format并输入以下公式:

=OR(SUM(B1:B3)=3,SUM(B2:B4)=3,SUM(B3:B5)=3)

至于您的额外信用,可以这样做,但您需要提供更好的标准。