检查错误或vbNullStringtypes不匹配

我有一些数据,我想循环处理任何包含任何内容或错误的单元格。

我试过的代码是在下面,它给我一个Type mismatch因为我不能比较Error 2042vbNullString

 ' // doesn't work when value is #NA For row = 1 To 10 If Sheet1.Cells(row, 1) = vbNullString Or IsError(Sheet1.Cells(row, 1)) Then 'do something End If Next row 

首先,我尝试在Or切换逻辑,看它是否跳过,只要它find一个True但是它首先评估两个语句。

我想到了其他一些方法,但是没有一个看起来是最好的方法。 我确定必须有一个简单,干净的方法来做到这一点?

 ' Option 1 For row = 1 To 10 If IsError(Sheet1.Cells(row, 1)) Then 'do something ElseIf Sheet1.Cells(row, 1) = vbNullString Then 'do the same stuff End If Next row 'Option 2 For row = 1 To 10 On Error Resume Next If Sheet1.Cells(row, 1) = vbNullString Then On Error GoTo 0 'do something End If Next row 'Option 3 Dim testValue As Variant If IsError(Sheet1.Cells(row, 1)) Then testValue = vbNullString Else testValue = Sheet1.Cells(row, 1) End If For row = 1 To 10 If testValue = vbNullString Then 'do something End If Next row 

也许选项2是最好的select,但是对于阅读我的代码的人来说,这并不意味着什么(也是,我从不想失去真正的错误)。

为了testing的目的,你可以假设我的数据看起来像这样( A1:A10

 1 2 4 #N/A 6 #N/A 9 10 

只需制作自己的数据validationfunction并调用:

 Public Function IsEmptyOrError(test As Variant) As Boolean If IsError(test) Then Exit Function IsEmptyOrError = CStr(test) = vbNullString End Function 

调用代码:

 For Row = 1 To 10 If IsEmptyOrError(Sheet1.Cells(row, 1)) Then 'do something End If Next Row 

我会select1,但你可以试试这个。 顺便说一句,不要使用行作为variables名称,因为它是一个VBA属性。 (不要问我为什么这个工作,如果没有。)

 Sub x() Dim Row1 As Long For Row1 = 1 To 10 Select Case True Case IsError(Sheet1.Cells(Row1, 1)), Sheet1.Cells(Row1, 1) = vbNullString 'do something End Select Next Row1 End Sub 

编辑添加第二种方法

  • AutoFilter()方法:

     With Sheet1 '<--| reference your sheet With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp)) '<--| reference its column A cells from row 1 down to last not empty one .AutoFilter Field:=1, Criteria1:="", Operator:=xlOr, Criteria2:="#N/A" '<--| filter referenced range on its 1st (and only) column with "" or "#N/A" values If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then '<--| if any filterd cells other than header With .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible) '<--| reference filtered cells skipping header 'do something with referenced range containing all wanted values End With End If End With .AutoFilterMode = False End With 
  • SpecialCells()方法:

     Dim myRng As Range With Sheet1 Set myRng = GetErrorsAndBlanks(.Range("A1", .Cells(.Rows.Count, "A").End(xlUp))) If Not myRng Is Nothing Then 'do something with 'myRng' End If End With 

    你会在哪里使用GetErrorsAndBlanks ()函数:

     Function GetErrorsAndBlanks(rng As Range) As Range With rng Set GetErrorsAndBlanks = .Resize(1, 1).Offset(.Rows.Count, .Columns.Count) '<--| initialize select range with a dummy cell, to be taken away before exiting On Error Resume Next Set GetErrorsAndBlanks = Union(GetErrorsAndBlanks, .SpecialCells(xlCellTypeConstants, xlErrors)) '<--| try and get "error" cells deriving from constants Set GetErrorsAndBlanks = Union(GetErrorsAndBlanks, .SpecialCells(xlCellTypeFormulas, xlErrors)) '<--| try and get "error" cells deriving from formulas Set GetErrorsAndBlanks = Union(GetErrorsAndBlanks, .SpecialCells(xlCellTypeBlanks)) '<--| try and get "blank" cells Set GetErrorsAndBlanks = Intersect(GetErrorsAndBlanks, .Cells) '<--| take "dummy" cell away End With End Function