首页 > 解决方案 > 范围数组的类型不匹配错误;转置相交逻辑

问题描述

  1. 如何解决类型不匹配错误(指示)?

  2. 如果我想将 sub限制在指定范围内,为什么要更改If Not IntersectIf Intersect退出 sub?

    Private Sub Workbook_SheetBeforeDoubleClick(ByVal sH As Object, ByVal Target As Range, Cancel As Boolean)
        ' Exclude specified ranges
        Dim rExcl(1) As Range, i As Integer, r As Range
        Set rExcl(0) = Range("Table1"): Set rExcl(1) = Range("Table2")
        For i = 0 To 1
            For Each r In rExcl(i)
                If r.Parent Is sH Then
                    If Not Intersect(Target, r) Is Nothing Then Exit Sub    ' Type mismatch error
                End If
            Next
        Next
    End Sub
    

标签: excelvba

解决方案


您的代码以您呈现的方式运行没有任何问题,它也将以您尝试理解的方式运行,但分别具有不同的含义:

你应该明白它Intersect返回一个“范围”,上面的代码检查它是否Range存在。换句话说,这部分应该理解为“如果两个范围相交”。

这部分If Intersect(Target, r) Is Nothing Then Exit Sub的意思是“如果两个范围不相交”(这样的最终相交不存在)。

如果您指的是真实表,则在提到的两个变体中都不应存在任何“类型不匹配”。如果您将不同的对象(不是范围)命名为“TableX” ,它可能会出现...

请尝试插入下一行代码:

Debug.Print TypeOf rExcl(0) Is Range, TypeOf rExcl(1) Is Range: stop

后:

Set rExcl(0) = Range("Table1"): Set rExcl(1) = Range("Table2")

它在即时窗口中返回什么?

编辑

您无法“重现 Debug.Print 中的错误”,因为甚至没有到达该行...

您的工作簿中存在冲突。如果双击的单元格是您声称为“奇怪”的单元格,则有您在问题中向我们展示的 Workbook 事件和另一个Worksheet_BeforeDoubleClick尝试关闭 Excel 应用程序的事件...

首先触发工作表事件,并且不再触发工作簿事件,因为代码尝试退出 Excel 应用程序。尝试将Exit Sub作为 Worksheet 事件中的第一行代码,然后再次尝试双击。

以后不会有什么不好的了...


推荐阅读