如何根据单元格值调用宏?

时间:2019-12-13 19:34:35

标签: excel vba loops type-mismatch

我是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 

1 个答案:

答案 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