比较两个字符串时类型不匹配

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 作为范围。如果范围对象可能是 EmptyNothing ,那么您还需要检查它们。

编辑:将 .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 索引器需要整数值或字符串。如果 Sheet2ThisWorkbook 中作品 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 插件项目)。