我有以下代码,该代码将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()的所有内容都希望它缺少图纸参考,但没有任何帮助。
答案 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
索引器需要一个整数值或一个字符串。如果Sheet2
是ThisWorkbook
中工作表的代号,则无需从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
作为范围。如果范围对象可能是Empty
或Nothing
,那么您还需要检查这些对象。
编辑:将.Value
更改为.Text
Edit2:这个答案不正确。