【问题标题】:Error in VBA: Choosing discontinuous cell ranges in the loopVBA 中的错误:在循环中选择不连续的单元格范围
【发布时间】:2021-07-30 23:48:34
【问题描述】:

我的要求是根据 C 列单元格中的文本输入更改一行中不同单元格的单元格背景颜色。这适用于工作表中的所有行。

下面是代码:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long

For i = 4 To 1800
Range("D" & i, "AW" & i).Interior.ColorIndex = 0


If Range("C" & i) = "Open" Then
    Range("F" & i & ":H" & i, "K" & i, "L" & i, "AA"&i, "AD"&i, "AF"&i).Interior.ColorIndex = 15
ElseIf Range("C" & i) = "Boil" Then
    Range("I" & i, "S" & i).Interior.ColorIndex = 15
    
End If

Next i

End Sub

但这会给出错误,说“参数数量错误或属性分配无效。让我知道我哪里出错了。我是 VBA 新手,这非常令人沮丧。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我不喜欢将太多东西连接在一起,而是使用令牌替换方法:

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim i As Long
        
        Me.Range("D4", "AW1800").Interior.ColorIndex = 0 'faster like this...
        For i = 4 To 1800
            Select Case Me.Range("C" & i).Value
                Case "Open"
                    Me.Range(Replace("F?:H?,K?,L?,AA?,AD?,AF?", "?", i)).Interior.ColorIndex = 15
                Case "Boil"
                    Me.Range("I" & i, "S" & i).Interior.ColorIndex = 15
            End Select
        Next i
    
    End Sub
    

    【讨论】:

    • v 是错字吗?好像没有在任何地方使用过。我喜欢令牌替换方法,学到了新东西!
    • 喜欢令牌替换,我将使用它! +1
    • 看到如此简洁的解决方案总是很高兴。
    • 感谢您的帮助。
    • @RaymondWu - 是的一个孤立变量;已删除,谢谢。
    【解决方案2】:

    如果您(真的)需要处理所有范围以防发生任何变化,请使用下一种方式。它应该非常快,将所有案例放在联合范围中并在最后一次格式化它们:

    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim i As Long, rngD As Range, rngO As Range, rngB As Range
        
        For i = 4 To 1800
            If rngD Is Nothing Then
                Set rngD = Range("D" & i, "AW" & i)
            Else
                Set rngD = Union(rngD, Range("D" & i, "AW" & i))
            End If
            Select Case Range("C" & i)
                Case "Open"
                    If rngO Is Nothing Then
                        Set rngO = Range("F" & i & ":H" & i & ",K" & i & ",L" & i & ",AA" & i & ",AD" & i & ",AF" & i)
                    Else
                        Set rngO = Union(rngO, Range("F" & i & ":H" & i & ",K" & i & ",L" & i & ",AA" & i & ",AD" & i & ",AF" & i))
                    End If
                Case "Boil"
                    If rngB Is Nothing Then
                        Set rngB = Range("I" & i, "S" & i)
                    Else
                        Set rngB = Union(rngB, Range("I" & i, "S" & i))
                    End If
            End Select
        Next i
         If Not rngD Is Nothing Then rngD.Interior.ColorIndex = 0
         If Not rngO Is Nothing Then rngO.Interior.ColorIndex = 15
         If Not rngO Is Nothing Then rngO.Interior.ColorIndex = 15
    End Sub
    

    但是,作为这样的事件,上面的代码应该放在一个标准模块中并且只运行一次,并且该事件应该只处理更改的单元格。 Target我的意思是……

    那么您真的需要为所有工作表中的任何更改触发此处理吗?如果不是,就像我想的那样,代码应该限制处理更改的范围。

    【讨论】:

      【解决方案3】:

      在 Range 中只允许使用两个参数。 也不需要更新到整个文档。目标值指定已更改的值,因此循环遍历所有单元格,这些单元格的更改速度更快。只有改变单元格的列是三列(C列有形成命令),代码才需要运行。

      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim i As Long
      Dim rng As Range
      
      For Each rng In Target
          If rng.Column = 3 Then
              i = rng.Row
              
              Range("D" & i, "AW" & i).Interior.ColorIndex = 0
              
              If Range("C" & i) = "Open" Then
                   Range("F" & i & ":H" & i).Interior.ColorIndex = 15
                   Range("K" & i, "L" & i).Interior.ColorIndex = 15
                   Range("AA" & i, "AD" & i).Interior.ColorIndex = 15
                   Range("AF" & i).Interior.ColorIndex = 15
                   
              ElseIf Range("C" & i) = "Boil" Then
                  Range("I" & i, "S" & i).Interior.ColorIndex = 15
                  
              End If
      
          End If
      Next rng
      
      End Sub
      

      【讨论】:

        【解决方案4】:

        错误是由于在“打开”场景中提供给Range 的参数过多。

        目前还不清楚您要更改ColorIndex 的哪一列,因此下面的代码将执行以下操作:

        • “打开” - 将 F 列更改为 H、K、L、AA、AD 和 AF。

        • “煮沸” - 将 I 列更改为 S。

        Private Sub Worksheet_Change(ByVal Target As Range)
            Dim i As Long
            
            For i = 4 To 1800
                Range("D" & i, "AW" & i).Interior.ColorIndex = 0
                
                Select Case Range("C" & i)
                    Case "Open"
                        Range("F" & i & ":H" & i & ",K" & i & ",L" & i & ",AA" & i & ",AD" & i & ",AF" & i).Interior.ColorIndex = 15
                    Case "Boil"
                        Range("I" & i, "S" & i).Interior.ColorIndex = 15
                End Select
            Next i
        
        End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-16
          • 1970-01-01
          • 2021-01-09
          • 2017-04-03
          • 1970-01-01
          • 2018-05-11
          相关资源
          最近更新 更多