繁体   English   中英

为什么在这里出现类型不匹配错误?

[英]Why am I getting a type mismatch error here?

我创建一个新模块并插入以下代码:

Sub test()
   Set wsData = ThisWorkbook.Worksheets("Data")
   sCount = wsData.Columns(14).SpecialCells(xlCellTypeBlanks).Count
   msgbox sCount
End Sub

在工作表“数据”中,我有以下代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.CountLarge = 1 Then
        If Not Intersect(Target, Range("K:M")) Is Nothing And Target.Value <> "" Then
            'code
        End if
    End if
End Sub

当我运行test()If Not Intersect(Target, Range("K:M")) Is NothingIf Not Intersect(Target, Range("K:M")) Is Nothing收到类型不匹配错误,因为Target错误类型。

为什么会这样呢?

为什么测试触发变更事件? 如果手动过滤数据表的第14列以仅保留空白单元格,则不会出现相同的错误!

类型不匹配的问题是Target.Cells超过一个单元。 因此, Target.Value <> ""引发类型不匹配,因为不能将多个单元格与""进行比较。 请参阅MsgbBox以及单元格数:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.CountLarge = 1 Then
        If Target.Cells.CountLarge > 1 Then MsgBox Target.Cells.CountLarge
        If Not Intersect(Target, Range("K:M")) Is Nothing And Target.Value <> "" Then
            'code
        End If
    End If
End Sub

根据业务逻辑,可能有几种解决方案。

  • 最简单的方法是编写If Target.Cells.CountLarge > 1 Then Exit Sub_SelectionChange事件中If Target.Cells.CountLarge > 1 Then Exit Sub

  • 另一种方法是禁用周围的事件

sCount = wsData.Columns(14).SpecialCells(xlCellTypeBlanks).Count像这样:


Sub TestMe()
   Set wsData = ThisWorkbook.Worksheets("Data")
   Application.EnableEvents = False
   sCount = wsData.Columns(14).SpecialCells(xlCellTypeBlanks).Count
   Application.EnableEvents = True
   msgbox sCount
End Sub

我几乎把这个问题重复了一下。

我会以相反的顺序回答您的两个问题,以便您更好地理解。

为什么测试触发变更事件?

我已经在导致Excel 2010中的SheetSelectionChange事件的SpecialCells中对此进行了解释

当我运行test()子程序时,如果目标不正确,则在If Not Intersect(Target,Range(“ K:M”))Nothing上收到类型不匹配错误。 为什么会这样呢?

Test过程触发Worksheet_SelectionChange事件时,您的代码将失败

If Not Intersect(Target, Range("K:M")) Is Nothing And Target.Value <> "" Then

这是因为Target.Value <> ""SpecialCells(xlCellTypeBlanks).Count的罪魁祸首SpecialCells(xlCellTypeBlanks).Count可能返回多个单元格。

如果您将上述行分为两行,则不会出现错误

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.CountLarge > 1 Then Exit Sub
    If Not Intersect(Target, Range("K:M")) Is Nothing Then
        If Target.Value <> "" Then
             'code
        End If
    End If
End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM