Excel 更有效的替代方案

Excel 更有效的替代方案,excel,vba,Excel,Vba,我试图得到一个比这个更快、更高效的代码,因为随着时间的推移,范围会增加很多,所以我需要替换每一个 宏将通过列的每个单元格查找值“Monday”,如果找到,它将在列a的前一个单元格中返回值“Substract” Sub ForEachTest() Dim Rng As Range Set Rng = Range("B3:B1000") For Each cell In Rng If cell.Value = "Monday" Then cell.Offset(0, -1) =

我试图得到一个比这个更快、更高效的代码,因为随着时间的推移,范围会增加很多,所以我需要替换每一个

宏将通过列的每个单元格查找值“Monday”,如果找到,它将在列a的前一个单元格中返回值“Substract”

Sub ForEachTest()

Dim Rng As Range

Set Rng = Range("B3:B1000")

For Each cell In Rng

  If cell.Value = "Monday" Then
     cell.Offset(0, -1) = "Substract"
  End If

Next cell

End Sub

通过过滤数据并处理生成的可见数据集,可以避免循环

列B=Monday
时,这将仅修改
列A
中的单元格。所有其他细胞保持原样



在VBA中而不是在工作表上循环:

Sub faster()
    Dim arr()

    arr = Range("A3:B1000")

    For i = LBound(arr, 1) To UBound(arr, 1)
        If arr(i, 2) = "Monday" Then arr(i, 1) = "Substract"
    Next i

    Range("A3:B1000") = arr
End Sub
编辑#1:

此版本解决了BigBen的问题,即不应覆盖列B,以保留该列中的任何公式。此处仅覆盖列A

Sub faster2()
    Dim arr(), brr()

    arr = Range("A3:A1000")
    brr = Range("B3:B1000")

    For i = LBound(brr, 1) To UBound(brr, 1)
        If brr(i, 1) = "Monday" Then arr(i, 1) = "Substract"
    Next i

    Range("A3:A1000") = arr
End Sub
尝试使用Evaluate

Sub Test()
With Range("A3:A" & Cells(Rows.Count, 2).End(xlUp).Row)
    .Value = Evaluate("IF(" & .Offset(, 1).Address & "=""Monday"",""Substract"","""")")
End With
End Sub

当它不是
Monday
范围(“A3:A1000”)。公式=“=IF(B3=“”Monday”“”、“Substract”“)”
?使用公式而不是循环。如果不想修改非
Monday
的单元格,您可以为
Monday
筛选范围,然后将前一列中的所有可见单元格转换为
Subtract
如果数据在表格中,则可以将公式自动添加到新行。“真是不可思议的美味!”BigBen看到我的编辑了吗?非常感谢。我有一个问题:最后的“范围”(“A3:A1000”)=arr”是什么?我不理解它的用法(正如前面所说的),但是如果我删除它,代码就不起作用了@Jorge,这条语句用数组值填充A列的整个块。
Sub Test()
With Range("A3:A" & Cells(Rows.Count, 2).End(xlUp).Row)
    .Value = Evaluate("IF(" & .Offset(, 1).Address & "=""Monday"",""Substract"","""")")
End With
End Sub