检查错误或vbNullStringtypes不匹配
我有一些数据,我想循环处理任何包含任何内容或错误的单元格。
我试过的代码是在下面,它给我一个Type mismatch
因为我不能比较Error 2042
与vbNullString
。
' // 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