Excel VBA:当另一个单元格包含特定文本或字符串时,如何清除指定单元格的内容

Excel VBA:当另一个单元格包含特定文本或字符串时,如何清除指定单元格的内容,excel,vba,Excel,Vba,如果某个单元格包含特定文本,我在查找VBA代码以删除多个特定单元格时遇到一些问题。该电子表格也可以运行近100k行,但会因数据拉动而有所不同 特定VBA将能够执行以下操作: 如果单元格J3等于#N/A、空白或0,则清除单元格J3:K3和P3:X3的内容,然后重复此操作,直到到达第J列底部 提前谢谢 当另一个单元格包含特定文本或字符串时,如何清除指定单元格的内容 “我在查找VBA代码时遇到一些问题” 这些链接包含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