我是vba的新手,我正努力尝试根据合并单元格的值来启动宏。在网上环顾四周,我能够走得很远,但是我不断收到错误13类型不匹配的信息。有没有一种方法可以将变体与字符串进行比较,或者默认情况下将单元格设置为非变体?我曾尝试在Target.Value上使用CStr,但没有运气。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set Target = Range("B2:D2")
If Target.Value = "1756-L82E" Then
Call p_1756
End If
End Sub
答案 0 :(得分:0)
我一直收到错误13类型不匹配的提示。有没有办法将变体与字符串[...]进行比较?
如果可以将variant子类型强制转换为字符串,那么您无需做任何事情,VBA会很乐意进行隐式类型转换,并使您成为要与该字符串文字进行比较的字符串。
问题在于Variant
实际上可以是任何东西,并且不保证可以安全地转换为String
。例如,Variant/Error
会完全导致您遇到的错误-类型不匹配错误。
If Target.Value = "1756-L82E" Then
一种解决方案是使用Text
属性而不是Value
。如果该单元格包含一个#REF!
错误,则文本值将为“ #REF!”,并且很高兴与任何其他字符串文字进行比较。
另一种解决方案可能是验证Variant
子类型,并确保它不是Error
-IsError
函数正是这样做的:
If IsError(Target.Value) Then Exit Sub
'here target.value is safe to compare
现在,还有另一个问题:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set Target = Range("B2:D2")
您在SelectionChange
处理程序中; Target
参数持有对所选单元格的引用-通常是该处理程序中最重要的一条信息。
要做的第一件事是用一个硬编码的多单元格范围覆盖它:变量子类型是Variant()
,即Variant
值的二维数组,每个值代表该值单个细胞。
那是为什么您遇到类型不匹配的原因:您试图一次获取多个单元格的Value
,返回一个Variant()
,然后尝试将该数组与字符串文字进行比较。
我怀疑您正在寻找这样的东西:
If Application.Intersect(Target, Me.Range("B2:D2")) Is Nothing Then Exit Sub
'Target is somewhere in B2:D2
If IsError(Target.Value) Then Exit Sub
'Target is holding a not-an-error value
If Target.Value = "1756-L82E" Then Call p_1756
虽然不确定,但是很难说出您实际上在尝试做什么。请注意,Call
关键字是多余的,但是我建议重命名p_1756
过程以使用描述性的有意义的名称,然后再删除冗余的Call
关键字:
If Target.Value = "1756-L82E" Then CreateReportOrWhatever