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

时间:2018-12-11 20:29:39

标签: excel vba type-mismatch

我有以下代码,该代码将userform(GUI)上的组合框与工作簿的sheet2上的填充单元进行比较,并且出现“类型不匹配”错误。这一切一直有效,直到另一个子程序将一些数据移入工作表2中要比较的单元格中。

我的问题在于if Worksheets(sheet2).cells(1,i).value = LCase(GUI.superCB.Value) then

Worksheets(sheet2).cells(1,i).value现在在手表中以Variant / Integer的形式出现,这使我认为,当数据移动时,它会更改该单元格的“样式”。

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

但是,如果我有工作表2作为活动工作表Cells(1,i).value可以工作,那么最后我需要使用户隐藏工作表2。这项工作使我认为单元格样式不是问题。

我尝试去Excel.Workbooks("Shawn_sch_v1.2.xlsm").worksheets(sheet2).cells(1,i).value,直到基本cell()的所有内容都希望它缺少图纸参考,但没有任何帮助。

2 个答案:

答案 0 :(得分:2)

可以安全地将String与VBA中的任何其他数据类型进行比较... 除了 Error

Variant/Error与任何内容进行比较都会引发类型不匹配错误。

此代码隐式访问任何ActiveSheet

chk.Caption = Cells(idx + 1, superColm) & "   " & idx

Cells应该使用您要使用的特定Worksheet对象限定。如果活动工作表中包含不能强制为String的值(例如#VALUE!#REF!),则将引发类型不匹配错误。

Worksheets(Sheet2).Cells(1, i).Value = ...

这里Sheet2标识符Worksheets索引器需要一个整数值或一个字符串。如果Sheet2ThisWorkbook中工作表的代号,则无需从Worksheets取消引用它,只需使用它即可:

Sheet2.Cells(1, i).Value = ...

Worksheet类没有默认属性,因此Debug.Print Worksheets(Sheet2)抛出错误438 对象不支持该属性或方法 -以及随后的成员调用,例如.Cells(1, i),也会引发类型不匹配错误。如果您没有一个包含工作表名称的Sheet2字符串变量,那么我怀疑那是您当前遇到的错误...这意味着上面的所有内容都在等着您:)

如果Sheet2是包含有效工作表名称的字符串变量,则可以使用IsError函数来验证Variant是否为{{ 1}}:

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)。现在,要在不破坏代码的情况下使用查找/替换重命名该变量将非常困难:Rubberduck的“重命名”重构可能有助于安全地执行此操作(免责声明:我管理OSS VBIDE add-在项目中)。

答案 1 :(得分:0)

此问题将通过首先检查范围对象数据类型来解决。

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:这个答案不正确。