Excel 更有效的替代方案
我试图得到一个比这个更快、更高效的代码,因为随着时间的推移,范围会增加很多,所以我需要替换每一个 宏将通过列的每个单元格查找值“Monday”,如果找到,它将在列a的前一个单元格中返回值“Substract”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) =
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