我在if语句中使用两个Variant的行收到'运行时error13类型不匹配。
另一篇文章说,可以通过将我的值读入Variants而不是Ranges来解决此问题,因为它们可能是“错误”。这没有效果,我仍然收到相同的错误。
是什么导致错误?任何帮助表示赞赏。
Sub FillPartNumRev()
Dim i As Long, ii As Long
Dim v1 As Variant, v2 As Variant
Dim q1 As Variant, q2 As Range
Dim r1 As Long, r2 As Long, r3 As Long
Dim c1 As Long, c2 As Long, c3 As Long
Workbooks("IPIC-DATA3.xlsx").Activate
Do While i < 5000 & ii < 5000
r1 = 8: c1 = 1
r3 = 8: c3 = 3
i = 8
ii = 8
With ActiveWorkbook.Worksheets("Sheet1")
Set v1 = .Range(.Cells(r1, c1), .Cells(r2, c2))
Set v2 = .Range(.Cells(r3, c3), .Cells(r3, c3))
Set q1 = .Range(.Cells(i, 1), .Cells(i, 2))
Set q2 = .Range(.Cells(ii, 3), .Cells(ii, 3))
End With
If q1.Value <> v1.Value & q2.Value <> "" Then
'>>>error on this line
v1.Copy q1
ElseIf q1.Value <> "" & q2.Value = "" Then
r1 = r1 + 7
r2 = r2 + 7
End If
r4 = r4 + 1
c4 = c4 + 1
r5 = r5 + 1
c5 = c5 + 1
r3 = r3 + 1
c3 = c3 + 1
i = i + 1
ii = ii + 1
Loop
End Sub
以下是最小,完整和可验证的示例:
Sub mcvExample()
Dim x As Range
Dim y As Range
Dim q1 As Range
Dim q2 As Range
Workbooks("YOUR-WORKBOOK-NAME-HERE.xlsx").Activate
'Please create a workbook in the same format & have it open
With ActiveWorkbook.Worksheets("Sheet1")
Set q1 = .Range(.Cells(1, 1), .Cells(1, 1))
Set q2 = .Range(.Cells(2, 3), .Cells(2, 3))
End With
If x < 10 & y < 10 Then
x = x + 1
y = y + 1
End If
End Sub
答案 0 :(得分:2)
另一篇文章说,可以通过将我的值读入Variants而不是Ranges来解决此问题,因为它们可能是“错误”。
Range
不会读取任何值; Range
是单元格,而不仅仅是其值:
Dim foo As Range
Set foo = sheet.Range("A1")
将单元格的值读取到String
中是一种假设:
Dim foo As String
foo = sheet.Range("A1").Value
如果Value
无法转换为String
,则会出现类型不匹配错误。
与将单元格的值与某些字符串文字进行比较时相同:
If sheet.Range("A1").Value <> "" Then
如果无法将Value
转换为String
进行比较,则会出现类型不匹配错误。
“将值读入变量”确实是解决方案:
Dim foo As Variant
foo = sheet.Range("A1").Value
现在,此foo
将是给定字符串Variant/String
的{{1}}或给定数字Value
的{{1}}或Variant/Double
给定日期Value
...或给Variant/Date
给错误Value
。
这意味着您仍然不能认为这会起作用:
Variant/Error
因为从Value
局部变量中读取If foo <> "" Then
与从Variant/Error
中直接读取Variant
没什么不同。
您需要消除变体子类型为Variant/Error
的可能性,以便继续使用值进行操作:
Range.Value
但这不是您在这里拥有的。
Error
If Not IsError(foo) Then
'type conversion is safe
If foo <> "" Then ' or If CStr(foo) <> "" Then, for an explicit conversion
'...
End If
Else
'foo contains an error value
End If
是一个跨越两个像元的Set q1 = .Range(.Cells(i, 1), .Cells(i, 2))
对象引用:因此,其q1
将是一个2D变体数组。
Range
由于Value
也跨越多个像元,因此其Set v1 = .Range(.Cells(r1, c1), .Cells(r2, c2))
'...
If q1.Value <> v1.Value [1] & q2.Value <> "" [2] Then
也将是2D变体数组。因此,您试图在两个2D变量数组[1]之间应用不等式运算符v1
,但是您不能这样做。然后,您尝试在2D变体数组和字符串[2]之间应用相同的运算符Value
,但是您也不能这样做。
如果要比较数组中的每个单个值,则需要嵌套循环以检查每个单个值。