VBA 运行 时间错误类型不匹配
VBA Run time error type mismatch
我从编译器收到以下消息
"Run-time error '13': Type mismatch"
它突出显示了以下行:
If Cells(k, j + 1) = "T1" ...
我不明白为什么会出现此错误。它循环通过的单元格都是文本格式。有人可以解释如何更正此代码吗?请注意,这只是程序的一部分。
Sub TestSub2()
Dim i As Integer, j As Integer, k As Integer, k2 As Integer
'i ->tier table row counter
'j ->column counter
'k ->"Reading Date" and "PM Executed?" table row counter
'---TIER 1 TABLE---
k = 102
k2 = 84
For i = 21 To 35
k = k + 1
k2 = k2 + 1
For j = 26 To 148
If Cells(k, j + 1) = "T1" Or "T1, T2" Or "T2, T1" Or "T1, T3" Or "T3, T1" Or "T1, T2, T3" Or "T1, T3, T2" Or "T2, T1, T3" Or "T2, T3, T1" Or "T3, T1, T2" Or "T3, T2, T1" Then
'then
Cells(i, 8) = Cells(i, j) And Cells(i, 9) = Cells(k2, j + 1)
End If
Next j
Next i
"Or" 运算符需要分隔布尔表达式,而不是等式右侧的值。像这样更改它:
val = Cells(k, j + 1)
If val = "T1" Or val = "T1, T2" Or val = "T2, T1" Or val = "T1, T3" Or val = "T3, T1" Or val = "T1, T2, T3" Or val = "T1, T3, T2" Or val = "T2, T1, T3" Or val = "T2, T3, T1" Or val = "T3, T1, T2" Or val = "T3, T2, T1" Then
Or
和 And
是 Logical Operators in vba,因此用于比较两个或多个表达式和 return 一个 Boolean
值。
如果你想在同一行执行两个语句,你可以使用冒号 :
来实现,如下所示:
Cells(i, 8).Value = Cells(i, j).Value: Cells(i, 9).Value = Cells(k2, j + 1).Value
然而,这通常会降低代码的可读性,因此在 vba 中并未广泛使用。
还有其他使用布尔比较的方法,例如 Select Case
或较少使用的 Like
运算符用于有限的 regex 模式匹配。例如:
If Cells(k, j + 1).Value Like "T[1-3]((, T[1-3])+)?" Then
'// Do something
Else
'// Do something Else
End If
或者可能是 Select Case
块:
Select Case Cells(k, j + 1).Value
Case "T1", "T1, T2", "T2, T1", "T1, T3", "T3, T1" '// etc...
'// Do Something
'// You could include further tests such as...
Case "Test 1", "Test Another"
'// Also do something...
'// Or code for the chance that none of the conditions are met:
Case Else
'// Nothing matched - do something else.
End Select
然而,您的原始代码需要看起来更像这样:
If Cells(k, j + 1).Value = "T1" Or Cells(k, j + 1).Value = "T1, T2" Or _
Cells(k, j + 1).Value = "T2, T1" Or Cells(k, j + 1).Value = "T1, T3" Or _
Cells(k, j + 1).Value = "T3, T1" Or Cells(k, j + 1).Value = "T1, T2, T3" Or _
Cells(k, j + 1).Value = "T1, T3, T2" Or Cells(k, j + 1).Value = "T2, T1, T3" Or _
Cells(k, j + 1).Value = "T2, T3, T1" Or Cells(k, j + 1).Value = "T3, T1, T2" Or _
Cells(k, j + 1).Value = "T3, T2, T1" Then
Cells(i, 8).Value = Cells(i, j).Value
Cells(i, 9).Value = Cells(k2, j + 1).Value
End If
如您所见,这变得相当费力,因此我建议使用其他方法之一进行比较。
我从编译器收到以下消息
"Run-time error '13': Type mismatch"
它突出显示了以下行:
If Cells(k, j + 1) = "T1" ...
我不明白为什么会出现此错误。它循环通过的单元格都是文本格式。有人可以解释如何更正此代码吗?请注意,这只是程序的一部分。
Sub TestSub2()
Dim i As Integer, j As Integer, k As Integer, k2 As Integer
'i ->tier table row counter
'j ->column counter
'k ->"Reading Date" and "PM Executed?" table row counter
'---TIER 1 TABLE---
k = 102
k2 = 84
For i = 21 To 35
k = k + 1
k2 = k2 + 1
For j = 26 To 148
If Cells(k, j + 1) = "T1" Or "T1, T2" Or "T2, T1" Or "T1, T3" Or "T3, T1" Or "T1, T2, T3" Or "T1, T3, T2" Or "T2, T1, T3" Or "T2, T3, T1" Or "T3, T1, T2" Or "T3, T2, T1" Then
'then
Cells(i, 8) = Cells(i, j) And Cells(i, 9) = Cells(k2, j + 1)
End If
Next j
Next i
"Or" 运算符需要分隔布尔表达式,而不是等式右侧的值。像这样更改它:
val = Cells(k, j + 1)
If val = "T1" Or val = "T1, T2" Or val = "T2, T1" Or val = "T1, T3" Or val = "T3, T1" Or val = "T1, T2, T3" Or val = "T1, T3, T2" Or val = "T2, T1, T3" Or val = "T2, T3, T1" Or val = "T3, T1, T2" Or val = "T3, T2, T1" Then
Or
和 And
是 Logical Operators in vba,因此用于比较两个或多个表达式和 return 一个 Boolean
值。
如果你想在同一行执行两个语句,你可以使用冒号 :
来实现,如下所示:
Cells(i, 8).Value = Cells(i, j).Value: Cells(i, 9).Value = Cells(k2, j + 1).Value
然而,这通常会降低代码的可读性,因此在 vba 中并未广泛使用。
还有其他使用布尔比较的方法,例如 Select Case
或较少使用的 Like
运算符用于有限的 regex 模式匹配。例如:
If Cells(k, j + 1).Value Like "T[1-3]((, T[1-3])+)?" Then
'// Do something
Else
'// Do something Else
End If
或者可能是 Select Case
块:
Select Case Cells(k, j + 1).Value
Case "T1", "T1, T2", "T2, T1", "T1, T3", "T3, T1" '// etc...
'// Do Something
'// You could include further tests such as...
Case "Test 1", "Test Another"
'// Also do something...
'// Or code for the chance that none of the conditions are met:
Case Else
'// Nothing matched - do something else.
End Select
然而,您的原始代码需要看起来更像这样:
If Cells(k, j + 1).Value = "T1" Or Cells(k, j + 1).Value = "T1, T2" Or _
Cells(k, j + 1).Value = "T2, T1" Or Cells(k, j + 1).Value = "T1, T3" Or _
Cells(k, j + 1).Value = "T3, T1" Or Cells(k, j + 1).Value = "T1, T2, T3" Or _
Cells(k, j + 1).Value = "T1, T3, T2" Or Cells(k, j + 1).Value = "T2, T1, T3" Or _
Cells(k, j + 1).Value = "T2, T3, T1" Or Cells(k, j + 1).Value = "T3, T1, T2" Or _
Cells(k, j + 1).Value = "T3, T2, T1" Then
Cells(i, 8).Value = Cells(i, j).Value
Cells(i, 9).Value = Cells(k2, j + 1).Value
End If
如您所见,这变得相当费力,因此我建议使用其他方法之一进行比较。