【问题标题】:Multiple ranges in one VBA For loop?一个VBA For循环中有多个范围?
【发布时间】:2017-02-10 21:12:22
【问题描述】:

我是 VBA 的初学者,我试图仅突出显示 N 和 AA 列中的空单元格。可以在一个 For 循环中使用多个范围来代替下面的代码吗?

Private Sub CommandButton22_Click()
    'HIGHLIGHT
    Dim cell As Range

    For Each cell In Range("N")
        If cell.Value = vbNullString Then
            cell.Interior.ColorIndex = 6
        End If
    Next cell

    For Each cell In Range("AA")
        If cell.Value = vbNullString Then
            cell.Interior.ColorIndex = 6
        End If

    Next cell
End Sub

【问题讨论】:

    标签: vba excel for-loop


    【解决方案1】:

    编辑为加入 SpecialCells 方法,并受益于 Thomas Inzina 解决方案所指出的 UsedRange

    使用Range对象的SpecialCells()方法,避免循环

    Private Sub CommandButton22_Click()
        'HIGHLIGHT
        Intersect(Union(Range("N:N"), Range("AA:AA")), ActiveSheet.UsedRange).SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = 6
    End Sub
    

    【讨论】:

      【解决方案2】:

      您可以通过组合两个范围地址来简单地创建一个非连续范围,例如:

      For Each cell In Range("N:N,AA:AA")
      
      Next
      

      但是使用 Intersect 方法将范围修剪到工作表的已使用部分会更有效:

      For Each cell In Intersect(Range("N:N,AA:AA"), ActiveSheet.UsedRange)
          If cell.Value = vbNullString Then
              cell.Interior.ColorIndex = 6
          End If
      Next
      

      【讨论】:

      • 谢谢!它像梦一样工作。 UsedRange 还修复了我的空单元格不在数据范围内的问题。非常感谢您的帮助!
      【解决方案3】:

      是的。使用Application.Union 方法。这将返回 Areas / 选择中区域或连续单元格块的集合。

      以下代码有效。

      Private Sub CommandButton22_Click()
      'HIGHLIGHT
      
      Dim cell As Range
      Dim target As Range
      
          Set target = Application.Union(ActiveSheet.Range("N:N"), ActiveSheet.Range("AA:AA"))
      
          For Each area In target.Areas
              For Each cell In area
                  If cell.Value = vbNullString Then
                      cell.Interior.ColorIndex = 6
                  End If
              Next cell
          Next area
      End Sub
      

      它会为整个列着色。如果您只想为子集着色,例如:从两列中的行 1022,然后将联合行更改为类似这样的内容

      Set target = Application.Union(ActiveSheet.Range("N10:N22"), ActiveSheet.Range("AA10:AA22"))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 2018-08-24
        • 1970-01-01
        • 2021-01-09
        相关资源
        最近更新 更多