我正在尝试搜索由另一个模块生成的表,并删除不包含字符串"REPAIR_RTS"
的行。我从这个网站尝试了几种方法,但每次将搜索值更改为"REPAIR_RTS"
(表示CASE ...的行)时,我都会出现类型不匹配。
以下是我最近的尝试。
Public Sub Test()
lastRow = Range("D65000").End(xlUp).row
For i = lastRow To 2 Step -1
Select Case Cells(i, 4).Value
Case "REPAIR_RTS"
'Do nothing
Case Else
Cells(i, 8).EntireRow.Delete
End Select
Next i
End Sub
我还是VBA的新手,所以我很难排除故障。我也对其他方法持开放态度,我正在努力学习新的方法,因为我继续我的第一份分析师工作。
答案 0 :(得分:3)
最简单的方法是首先测试错误......
错误......不。
只需将Cells(i, 4).Value
更改为Cells(i, 4).Text
。
尽管如此,.Text
可能会很痛苦,因为它会准确地返回所显示的内容。
从Cells(i, 4).Value
到CStr(Cells(i, 4).Value)
的变化不那么容易。但是,它应该完全符合您的要求。
如果您还有任何问题,请问:D
答案 1 :(得分:1)
您无法将错误值(例如#N/A
)与字符串进行比较 - 这就是产生"类型不匹配的问题"错误。
最简单的方法是首先测试错误,然后继续测试特定字符串,如果它不是错误:
Public Sub Test()
Dim lastRow As Long
Dim i As Long
With Worksheets("Chargable Vendors")
lastRow = .Cells(.Rows.Count, "D").End(xlUp).row
For i = lastRow To 2 Step -1
If IsError(.Cells(i, 4).Value) Then
.Rows(i).Delete
Else
Select Case .Cells(i, 4).Value
Case "REPAIR_RTS"
'Do nothing
Case Else
.Rows(i).Delete
End Select
End If
Next i
End With
End Sub
另一种方法是在Select Case
语句中包含针对字符串测试的每个错误值之前的特定测试,例如
Select Case .Cells(i, 4).Value
Case CVErr(xlErrNA), CVErr(xlErrDiv0), CVErr(xlErrName), CVErr(xlErrValue) 'etc
.Rows(i).Delete
Case "REPAIR_RTS"
'Do nothing
Case Else
.Rows(i).Delete
End Select
但我发现单IsError
更容易测试所有这些。
注意:
这也可以使用If
语句而不是Select Case
语句来完成:
Public Sub Test()
Dim lastRow As Long
Dim i As Long
With Worksheets("Chargable Vendors")
lastRow = .Cells(.Rows.Count, "D").End(xlUp).row
For i = lastRow To 2 Step -1
If IsError(.Cells(i, 4).Value) Then
.Rows(i).Delete
ElseIf .Cells(i, 4).Value <> "REPAIR_RTS" Then
.Rows(i).Delete
End If
Next i
End With
End Sub