【问题标题】:Excel, Highlight a series of consecutive duplicate valuesExcel,突出显示一系列连续的重复值
【发布时间】:2014-11-12 18:54:44
【问题描述】:

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

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 和 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”,则加分

【问题讨论】:

    标签: vba excel user-defined-functions


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      我们将使用 sub 而不是 函数。 这个 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

      这是用多列调用它的修改(在本例中为 BG

      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) 通常用于向单元格返回值,而不是用于一般单元格更新。

      【讨论】:

      • 谢谢,按照 b 列的描述工作。调用 sub 的最佳方法是什么,它可以通用吗?我喜欢使用函数的想法,因为这样我就可以转到列的底部,使用我的函数(如公式),然后将其复制到其他列。我有许多列号可变的文件。
      【解决方案3】:

      您也可以使用条件格式来做到这一点。

      如果您上面列出的数据在范围 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)
      

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

      【讨论】:

        猜你喜欢
        • 2017-01-31
        • 2017-12-27
        • 2016-06-19
        • 2020-01-27
        • 2012-04-18
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多