为什么我在这里收到类型不匹配错误?



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

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()sub 时,我在If 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事件中。

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

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中的工作表选择更改事件

当我运行 test(( sub 时,我收到一个类型不匹配错误,如果不相交(目标,范围("K:M"((什么都没有,因为目标类型错误。 为什么会这样?

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

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

这是因为Target.Value <> ""是罪魁祸首,因为SpecialCells(xlCellTypeBlanks).Count可能会返回多个细胞。

如果将上述行分成 2 行,则不会收到错误

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

最新更新