Excel 从另一个文本等于#N/a的工作表中删除一行

Excel 从另一个文本等于#N/a的工作表中删除一行,excel,vba,Excel,Vba,我已经为用户构建了一系列VBA宏来完成一些步骤。我构建了一个按钮,用户可以单击该按钮删除任何包含#N/a的行。我前面的一个步骤将其设置为纯文本值 执行该操作时,它看起来像是在运行,但只是将我的视图移动到我试图清理的工作表中,实际上并没有删除任何行 我尝试过切换部分代码,而不是=以喜欢 Sub DeleteNAsOnFrank_Click() Dim Firstrow As Long Dim Lastrow As Long Dim Lrow As Long Dim CalcMode As Long

我已经为用户构建了一系列VBA宏来完成一些步骤。我构建了一个按钮,用户可以单击该按钮删除任何包含#N/a的行。我前面的一个步骤将其设置为纯文本值

执行该操作时,它看起来像是在运行,但只是将我的视图移动到我试图清理的工作表中,实际上并没有删除任何行

我尝试过切换部分代码,而不是=以喜欢

Sub DeleteNAsOnFrank_Click()
Dim Firstrow As Long
Dim Lastrow As Long
Dim Lrow As Long
Dim CalcMode As Long
Dim ViewMode As Long

With Application
    CalcMode = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
End With

With Sheets("Frank Import Full List")
    .Select
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView
    .DisplayPageBreaks = False
    Firstrow = .UsedRange.Cells(1).Row
    Lastrow = .UsedRange.Rows(.UsedRange.Rows.Count).Row
    For Lrow = Lastrow To Firstrow Step -1
        With .Cells(Lrow, "A")
            If Not IsError(.Value) Then
                If .Value = "#N/A" Then .EntireRow.Delete
            End If
        End With
    Next Lrow
End With

ActiveWindow.View = ViewMode
With Application
    .ScreenUpdating = True
    .Calculation = CalcMode
End With
End Sub
我希望它删除
工作表(“Frank Import Full List”)上包含文本
If.Value=“#N/A”Then.EntireRow.delete
的任何行

'Code...
For Lrow = Lastrow To Firstrow Step -1
    If Application.WorksheetFunction.IsNA(.Cells(Lrow, "A")) Then .Rows(Lrow).EntireRow.Delete
Next Lrow
'Code...
试试下面的方法

'Code...
For Lrow = Lastrow To Firstrow Step -1
    If Application.WorksheetFunction.IsNA(.Cells(Lrow, "A")) Then .Rows(Lrow).EntireRow.Delete
Next Lrow
'Code...
将代码更改为

    With .Cells(Lrow, "A")
        If IsError(.Value) Then .EntireRow.Delete
    End With
但是,我建议使用更好的方法删除这些单元格。使用自动筛选,而不是循环和删除您的代码将更快。也可以代替usedrange。使用实际范围。用于查找最后一行并使用该范围

Dim ws As Worksheet
Dim delRange As Range
Dim lRow As Long

Set ws = ThisWorkbook.Sheets("Frank Import Full List")

With ws
    .AutoFilterMode = False
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row

    With .Range("A1:A" & lRow)
        .AutoFilter Field:=1, Criteria1:="#N/A"
        Set delRange = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
    End With

    If Not delRange Is Nothing Then delRange.Delete

    .AutoFilterMode = False
End With
在行动中

将代码更改为

    With .Cells(Lrow, "A")
        If IsError(.Value) Then .EntireRow.Delete
    End With
但是,我建议使用更好的方法删除这些单元格。使用自动筛选,而不是循环和删除您的代码将更快。也可以代替usedrange。使用实际范围。用于查找最后一行并使用该范围

Dim ws As Worksheet
Dim delRange As Range
Dim lRow As Long

Set ws = ThisWorkbook.Sheets("Frank Import Full List")

With ws
    .AutoFilterMode = False
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row

    With .Range("A1:A" & lRow)
        .AutoFilter Field:=1, Criteria1:="#N/A"
        Set delRange = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
    End With

    If Not delRange Is Nothing Then delRange.Delete

    .AutoFilterMode = False
End With
在行动中


您知道,您可以使用Autofilter一次性删除所有这些行,而不是循环和删除<代码>工作表(“Frank Import Full List”)。范围(“A1:A”&Lastrow)。自动筛选字段:=1,标准1:=“#N/A”,用于查找最后一行。您没有删除,因为您的
If not iError(.Value)
正在跳闸,因为
N/A
是一个错误。删除该测试,它应该可以工作。您知道,您可以使用Autofilter一次性删除所有这些行,而不是循环和删除<代码>工作表(“Frank Import Full List”)。范围(“A1:A”&Lastrow)。自动筛选字段:=1,标准1:=“#N/A”,用于查找最后一行。您没有删除,因为您的
If not iError(.Value)
正在跳闸,因为
N/A
是一个错误。删除该测试,它应该可以工作。使用自动筛选(您的方法)与将范围传递到数组并循环通过该数组的速度相比有多快?最好是自己尝试并找到它:)顺便说一句,在这种情况下,不建议使用数组,因为您必须处理2个操作。清除数组行,转置后,注意空格。您可以处理数组本身中的行,但仍然是“2个操作”。正确。我得亲自去测试看看。顺便说一句,无论是数组还是自动筛选,它们都比在循环中删除行要好:D。使用循环删除行还有一种方法。它被称为联合方法,一旦循环结束,你就可以删除它。哦,我同意所有列出的方法都比我建议的好。。。但它是有效的;)使用自动筛选(您的方法)与将范围传递到数组并循环通过该数组的速度相比有多快?最好是自己尝试并找到它:)顺便说一句,在这种情况下不建议使用数组,因为您将必须处理2个操作。清除数组行,转置后,注意空格。您可以处理数组本身中的行,但仍然是“2个操作”。正确。我得亲自去测试看看。顺便说一句,无论是数组还是自动筛选,它们都比在循环中删除行要好:D。使用循环删除行还有一种方法。它被称为联合方法,一旦循环结束,你就可以删除它。哦,我同意所有列出的方法都比我建议的好。。。但它是有效的;)