【问题标题】:VBA excel code to delete the rows if N/A is found如果发现 N/A,VBA excel 代码删除行
【发布时间】:2012-05-16 04:36:55
【问题描述】:

我正在寻找一种方法来查找整个列中的N/A 单元格,然后在找到N/A 时删除整行。我找到了这个 VBA 代码,但它对我不起作用,因为它只选择一列。请帮忙(我在 Excel Mac 2011 中处理大约 300000 行)

Sub DeleteBlankARows() 
    With Application 
        .Calculation = xlCalculationManual 
        .ScreenUpdating = False 
        Dim r As Long 
        For r = Cells(Rows.Count, 11).End(xlUp).Row To 1 Step -1 
            If Cells(r, 11) = "" Then Rows(r).Delete 
        Next r 
        .Calculation = xlCalculationAutomatic 
        .ScreenUpdating = True 
    End With 
End Sub 

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    另一种方法是使用Find 快速测试哪些单元格是NA()(我假设您正在测试=NA() 作为公式单元格 - 我可以更新它们,或者也可以是文本)

    此代码使用SpecialCells 仅搜索错误值。

    Sub GetNA()
    Dim rng1 As Range
    Dim rng2 As Range
    Dim rng3 As Range
    Dim strFA As String
    
    On Error Resume Next
    Set rng1 = ActiveSheet.UsedRange.SpecialCells(xlFormulas, xlErrors)
    On Error GoTo 0
    
    If rng1 Is Nothing Then
        MsgBox "No NA() cells"
        Exit Sub
    End If
    
    With rng1
        Set rng2 = .Find("=NA()", LookIn:=xlFormulas)
        If Not rng2 Is Nothing Then
            strFA = rng2.Address
            Set rng3 = rng2.EntireRow
            Do
                Set rng2 = .FindNext(rng2)
                Set rng3 = Union(rng3, rng2.EntireRow)
            Loop While Not rng2 Is Nothing And rng2.Address <> strFA
        End If
        If Not rng3 Is Nothing Then rng3.Delete
    End With
    
    End Sub
    

    【讨论】:

    • 也不错。如果没有太多#N/A 但要检查的单元格范围很大,这可能会更快。然而,我读过find seems to be quite slow
    • @JMax 这是来自 Charles 的一个很好的链接。但正如文章所述,Find 是多列搜索的一种方式(顺便说一句,它可以处理部分匹配、区分大小写、格式匹配等 - 这使得它比其他方法更通用)。尽管对于单列搜索,AutoFilter 是文章中的一个明显例外
    【解决方案2】:

    试试这个(在 Windows XP / Excel 2007 上测试,但它应该可以在 Mac / Office 2011 上工作):

    Option Explicit
    
    Sub DeleteNARows()
        Dim r As Long
        Dim iCol As Long
        With Application
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .DisplayAlerts = False
            For iCol = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
                For r = Cells(Rows.Count, iCol).End(xlUp).Row To 1 Step -1
                    If Application.WorksheetFunction.IsNA(Cells(r, iCol)) Then Rows(r).Delete
                Next r
            Next iCol
            .Calculation = xlCalculationAutomatic
            .ScreenUpdating = True
            .DisplayAlerts = True
        End With
    End Sub
    

    请注意,您可以(并且可能必须)在代码开头更改要检查 fot #N/A 的列

    【讨论】:

    • 谢谢!但我怎样才能让它自动运行并检查所有列?就像我一直到 UH 专栏一样!
    • 非常感谢您的帮助。我试过这个编辑过的代码,它说“Excel无法计算公式”
    • 以前的版本可以用吗?我认为当代码删除行时您可能有一个circular reference。我们可以删除警报(我将编辑我的代码)但这最终不会解决问题
    • @JMax 如果我不想删除整行怎么办?我只想删除#N/A之前的项目即:abc abc abc #N/A, I want to delete the 3 abc away
    • @user1204868:您可以将Rows(r).Delete 部分更改为您想要清除的任何内容。如果你不能成功,你可以尝试并提出一个新问题
    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2022-10-07
    • 1970-01-01
    • 2018-02-21
    相关资源
    最近更新 更多