VBA:具有两个条件的If语句的错误13

时间:2018-07-12 15:55:21

标签: excel vba runtime-error

我在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

1 个答案:

答案 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,但是您也不能这样做。

如果要比较数组中的每个单个值,则需要嵌套循环以检查每个单个值。