Excel VBA:当另一个单元格包含特定文本或字符串时,如何清除指定单元格的内容
如果某个单元格包含特定文本,我在查找VBA代码以删除多个特定单元格时遇到一些问题。该电子表格也可以运行近100k行,但会因数据拉动而有所不同 特定VBA将能够执行以下操作: 如果单元格J3等于#N/A、空白或0,则清除单元格J3:K3和P3:X3的内容,然后重复此操作,直到到达第J列底部 提前谢谢 当另一个单元格包含特定文本或字符串时,如何清除指定单元格的内容 “我在查找VBA代码时遇到一些问题” 这些链接包含VBA代码,您可以在尝试时不再有困难时使用这些代码。它们包含可以粘贴到项目中并根据需要修改的示例 范围是工作表中一个或多个单元格的组。您可以对某个范围执行操作,该操作将影响该范围内的所有单元格Excel VBA:当另一个单元格包含特定文本或字符串时,如何清除指定单元格的内容,excel,vba,Excel,Vba,如果某个单元格包含特定文本,我在查找VBA代码以删除多个特定单元格时遇到一些问题。该电子表格也可以运行近100k行,但会因数据拉动而有所不同 特定VBA将能够执行以下操作: 如果单元格J3等于#N/A、空白或0,则清除单元格J3:K3和P3:X3的内容,然后重复此操作,直到到达第J列底部 提前谢谢 当另一个单元格包含特定文本或字符串时,如何清除指定单元格的内容 “我在查找VBA代码时遇到一些问题” 这些链接包含VBA代码,您可以在尝试时不再有困难时使用这些代码。它们包含可以粘贴到项目中并根据需要
循环是指程序重复相同的步骤序列,通常直到满足特定条件 如果要更改例程中的一组单元格,我更喜欢将值放入数组中。这通常会使过程更快 首先设置工作表和范围对象。请注意,以下代码当前正在使用此处工作表的索引1:
Set ws=thiswoolk.Worksheets(1)
。如果这不是您个人需要的工作表,则您需要更改此工作表
然后将整个区域的单元格内容放入数组中。正如我前面提到的,这个过程比一次调整一个单元格要快
循环数组,检查特定错误值#N/A
或其他条件。如果此条件匹配,则将输入另一个循环,该循环将快速循环行中的“列”,该行将仅删除指定列中的值
完成后,将数组重写回工作表
Sub main()
Dim ws As Worksheet, rng As Range, dataArr() As Variant
Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("J3:X" & ws.Cells(ws.Rows.Count, "J").End(xlUp).Row)
' Place the entire contents of worksheet range into an array
dataArr = rng.Value
Dim i As Long, x As Long, clearRow As Boolean
For i = LBound(dataArr) To UBound(dataArr)
If IsError(dataArr(i, 1)) Then
If dataArr(i, 1) = CVErr(xlErrNA) Then clearRow = True
ElseIf dataArr(i, 1) = vbNullString Or dataArr(i, 1) = 0 Then
clearRow = True
End If
' Loop thru the columns (x) of the current row (i)
If clearRow Then
For x = 1 To 15
Select Case x
Case 1, 2, 7 To 15
dataArr(i, x) = ""
End Select
Next x
clearRow = False
End If
Next i
' Re-write the entire array back to the worksheet in one step
rng.Value = dataArr
End Sub
在+100k行时,嵌套循环将迭代+1.1m次,同时更改+400k元素,您选择此方法有什么特殊原因吗?似乎循环增加了+700k次迭代,但没有提供值。通过将标志替换为对过程的调用(该过程将vbNullString显式分配给这4个元素),可以轻松避免此问题。不是判断,只是好奇。有效的问题,但在106k行完成。重新写入工作表花费的时间更长。话虽如此,自从我买了我的个人电脑以来,我没有改变过任何重要的硬件,这台电脑现在已经有十多年的历史了——其中大部分已经不再得到制造商的支持,并且正在使用通用的Windows 10驱动程序。顺便说一句,不管判断与否,我总是乐于接受建设性的批评和改进建议。所以我真的很感谢你的评论:-)。
Sub main()
Dim ws As Worksheet, rng As Range, dataArr() As Variant
Set ws = ThisWorkbook.Worksheets(1)
Set rng = ws.Range("J3:X" & ws.Cells(ws.Rows.Count, "J").End(xlUp).Row)
' Place the entire contents of worksheet range into an array
dataArr = rng.Value
Dim i As Long, x As Long, clearRow As Boolean
For i = LBound(dataArr) To UBound(dataArr)
If IsError(dataArr(i, 1)) Then
If dataArr(i, 1) = CVErr(xlErrNA) Then clearRow = True
ElseIf dataArr(i, 1) = vbNullString Or dataArr(i, 1) = 0 Then
clearRow = True
End If
' Loop thru the columns (x) of the current row (i)
If clearRow Then
For x = 1 To 15
Select Case x
Case 1, 2, 7 To 15
dataArr(i, x) = ""
End Select
Next x
clearRow = False
End If
Next i
' Re-write the entire array back to the worksheet in one step
rng.Value = dataArr
End Sub