比较两个字符串时类型不匹配
Type mismatch when comparing two strings
我有以下代码将用户窗体 (GUI) 上的组合框与工作簿 sheet2 上填充的单元格进行比较,我收到 "type mismatch" 错误。这一切都有效,直到另一个子将一些数据转移到 sheet 上比较的单元格中 2.
我的问题在于 if Worksheets(sheet2).cells(1,i).value = LCase(GUI.superCB.Value) then
Worksheets(sheet2).cells(1,i).value
现在在手表中显示为 Variant/Integer 这让我觉得当数据移动时它改变了那个单元格的 "style"。
Private Sub NextButton_Click() ''' adds check boxes to frame
Dim i As Integer
'Dim superColm As Integer
For i = 5 To 12
If Worksheets(Sheet2).Cells(1, i).Value = LCase(GUI.superCB.Value) Then 'problem line is right here
superColm = i
Exit For
Else
End If
Next i
NextButton.Visible = False
superCB.Visible = False
Run.Visible = True
Frame1.Visible = True
Dim chk As Control
Dim idx As Integer
Dim lastrow As Integer
lastrow = Worksheets(Sheet2).Cells(Rows.Count, superColm).End(xlUp).Row
For idx = 1 To lastrow - 1
Set chk = GUI.Frame1.Controls.add("Forms.CheckBox.1", idx, True)
'set chk = gui.Frame1.Controls.Add(
chk.Visible = True
chk.Left = 5
chk.Top = (idx - 1) * (chk.Height + 2)
chk.Caption = Cells(idx + 1, superColm) & " " & idx
Next
With Me.Frame1
.ScrollBars = fmScrollBarsVertical
If lastrow <= 10 Then
.ScrollHeight = .InsideHeight * 1.5
ElseIf lastrow <= 15 Then
.ScrollHeight = .InsideHeight * 2.25
ElseIf lastrow <= 20 Then
.ScrollHeight = .InsideHeight * 3
ElseIf lastrow <= 25 Then
.ScrollHeight = .InsideHeight * 3.9
ElseIf lastrow <= 30 Then
.ScrollHeight = .InsideHeight * 4.75
ElseIf lastrow <= 35 Then
.ScrollHeight = .InsideHeight * 5.35
Else
.ScrollHeight = .InsideHeight * 6.25
End If
.ScrollWidth = .InsideWidth * 9
End With
End Sub
如果我有 sheet 2 作为活动的 sheet Cells(1,i).value
将起作用,但是我需要最终对用户隐藏 sheet 2。通过这项工作,我认为单元格样式不是问题。
我试过 Excel.Workbooks("Shawn_sch_v1.2.xlsm").worksheets(sheet2).cells(1,i).value
和所有内容,直到基本单元格()希望它缺少 sheet 参考,但没有任何帮助。
这将通过首先检查范围对象数据类型来解决。
Worksheets(Sheet2).Cells(1, i).Value
是范围对象。这可以在每次修改范围时更改数据类型,具体取决于修改方式。
LCase(GUI.superCB.Value)
这似乎是一个表单控件。如果范围是整数,他们无法比较。
尝试这样的事情:
Dim i As Integer
Dim iRange as String
'Dim superColm As Integer
`This is untested
For i = 5 To 12
iRange = Worksheets(sheet2).Cells(1, i).Text
If iRange = LCase(GUI.superCB.Value) Then 'problem line is right here
superColm = i
Exit For
Else
End If
Next i
思路是首先确保数据类型相同。
您可能需要使用 .Text
或 .Value2
而不是 .Value
作为范围。如果范围对象可能是 Empty
或 Nothing
,那么您还需要检查它们。
编辑:将 .Value
更改为 .Text
Edit2:这个答案不正确。
A String
可以安全地与 VBA 中的任何其他数据类型进行比较... except Error
.
将 Variant/Error
与任何东西进行比较都会引发 类型不匹配 错误。
此代码正在隐式访问任何 ActiveSheet
是:
chk.Caption = Cells(idx + 1, superColm) & " " & idx
Cells
应该符合您要使用的特定 Worksheet
对象。如果活动 sheet 包含无法强制转换为 String
的值(例如 #VALUE!
或 #REF!
),则会引发 类型不匹配 错误。
Worksheets(Sheet2).Cells(1, i).Value = ...
这里 Sheet2
是一个 标识符 。 Worksheets
索引器需要整数值或字符串。如果 Sheet2
是 ThisWorkbook
中作品 sheet 的代码名称,则无需从 Worksheets
中取消引用它 - 只需使用它:
Sheet2.Cells(1, i).Value = ...
Worksheet
class 没有 默认值 属性,所以 Debug.Print Worksheets(Sheet2)
抛出错误 438 object 不支持此 属性 或方法 - 随后的成员调用如 .Cells(1, i)
,也会抛出 type mismatch 错误。如果你没有一个 Sheet2
字符串变量保存一个 worksheet 名称,我怀疑这就是你现在遇到的错误......这意味着上面的一切都等着咬你: )
如果Sheet2
是包含有效sheet名称的字符串变量,您可以使用IsError
函数来验证是否Variant
是一个 Variant/Error
:
If Not IsError(Sheet2.Cells(1, i).Value) Then
' value is safe to compare against a string
Else
' comparing the cell value to anything will throw error 13
End If
最后,我建议不要将 Rows
用作全局变量,因为它已经是一个全局范围的标识符([_Global].Rows
,暗指 ActiveSheet
)。现在,在不破坏代码的情况下,用 Find/Replace 重命名该变量将非常困难:Rubberduck 的 "rename" 重构可能有助于安全地完成此操作(免责声明:我管理OSS VBIDE 插件项目)。
我有以下代码将用户窗体 (GUI) 上的组合框与工作簿 sheet2 上填充的单元格进行比较,我收到 "type mismatch" 错误。这一切都有效,直到另一个子将一些数据转移到 sheet 上比较的单元格中 2.
我的问题在于 if Worksheets(sheet2).cells(1,i).value = LCase(GUI.superCB.Value) then
Worksheets(sheet2).cells(1,i).value
现在在手表中显示为 Variant/Integer 这让我觉得当数据移动时它改变了那个单元格的 "style"。
Private Sub NextButton_Click() ''' adds check boxes to frame
Dim i As Integer
'Dim superColm As Integer
For i = 5 To 12
If Worksheets(Sheet2).Cells(1, i).Value = LCase(GUI.superCB.Value) Then 'problem line is right here
superColm = i
Exit For
Else
End If
Next i
NextButton.Visible = False
superCB.Visible = False
Run.Visible = True
Frame1.Visible = True
Dim chk As Control
Dim idx As Integer
Dim lastrow As Integer
lastrow = Worksheets(Sheet2).Cells(Rows.Count, superColm).End(xlUp).Row
For idx = 1 To lastrow - 1
Set chk = GUI.Frame1.Controls.add("Forms.CheckBox.1", idx, True)
'set chk = gui.Frame1.Controls.Add(
chk.Visible = True
chk.Left = 5
chk.Top = (idx - 1) * (chk.Height + 2)
chk.Caption = Cells(idx + 1, superColm) & " " & idx
Next
With Me.Frame1
.ScrollBars = fmScrollBarsVertical
If lastrow <= 10 Then
.ScrollHeight = .InsideHeight * 1.5
ElseIf lastrow <= 15 Then
.ScrollHeight = .InsideHeight * 2.25
ElseIf lastrow <= 20 Then
.ScrollHeight = .InsideHeight * 3
ElseIf lastrow <= 25 Then
.ScrollHeight = .InsideHeight * 3.9
ElseIf lastrow <= 30 Then
.ScrollHeight = .InsideHeight * 4.75
ElseIf lastrow <= 35 Then
.ScrollHeight = .InsideHeight * 5.35
Else
.ScrollHeight = .InsideHeight * 6.25
End If
.ScrollWidth = .InsideWidth * 9
End With
End Sub
如果我有 sheet 2 作为活动的 sheet Cells(1,i).value
将起作用,但是我需要最终对用户隐藏 sheet 2。通过这项工作,我认为单元格样式不是问题。
我试过 Excel.Workbooks("Shawn_sch_v1.2.xlsm").worksheets(sheet2).cells(1,i).value
和所有内容,直到基本单元格()希望它缺少 sheet 参考,但没有任何帮助。
这将通过首先检查范围对象数据类型来解决。
Worksheets(Sheet2).Cells(1, i).Value
是范围对象。这可以在每次修改范围时更改数据类型,具体取决于修改方式。
LCase(GUI.superCB.Value)
这似乎是一个表单控件。如果范围是整数,他们无法比较。
尝试这样的事情:
Dim i As Integer
Dim iRange as String
'Dim superColm As Integer
`This is untested
For i = 5 To 12
iRange = Worksheets(sheet2).Cells(1, i).Text
If iRange = LCase(GUI.superCB.Value) Then 'problem line is right here
superColm = i
Exit For
Else
End If
Next i
思路是首先确保数据类型相同。
您可能需要使用 .Text
或 .Value2
而不是 .Value
作为范围。如果范围对象可能是 Empty
或 Nothing
,那么您还需要检查它们。
编辑:将 .Value
更改为 .Text
Edit2:这个答案不正确。
A String
可以安全地与 VBA 中的任何其他数据类型进行比较... except Error
.
将 Variant/Error
与任何东西进行比较都会引发 类型不匹配 错误。
此代码正在隐式访问任何 ActiveSheet
是:
chk.Caption = Cells(idx + 1, superColm) & " " & idx
Cells
应该符合您要使用的特定 Worksheet
对象。如果活动 sheet 包含无法强制转换为 String
的值(例如 #VALUE!
或 #REF!
),则会引发 类型不匹配 错误。
Worksheets(Sheet2).Cells(1, i).Value = ...
这里 Sheet2
是一个 标识符 。 Worksheets
索引器需要整数值或字符串。如果 Sheet2
是 ThisWorkbook
中作品 sheet 的代码名称,则无需从 Worksheets
中取消引用它 - 只需使用它:
Sheet2.Cells(1, i).Value = ...
Worksheet
class 没有 默认值 属性,所以 Debug.Print Worksheets(Sheet2)
抛出错误 438 object 不支持此 属性 或方法 - 随后的成员调用如 .Cells(1, i)
,也会抛出 type mismatch 错误。如果你没有一个 Sheet2
字符串变量保存一个 worksheet 名称,我怀疑这就是你现在遇到的错误......这意味着上面的一切都等着咬你: )
如果Sheet2
是包含有效sheet名称的字符串变量,您可以使用IsError
函数来验证是否Variant
是一个 Variant/Error
:
If Not IsError(Sheet2.Cells(1, i).Value) Then
' value is safe to compare against a string
Else
' comparing the cell value to anything will throw error 13
End If
最后,我建议不要将 Rows
用作全局变量,因为它已经是一个全局范围的标识符([_Global].Rows
,暗指 ActiveSheet
)。现在,在不破坏代码的情况下,用 Find/Replace 重命名该变量将非常困难:Rubberduck 的 "rename" 重构可能有助于安全地完成此操作(免责声明:我管理OSS VBIDE 插件项目)。