2

在将实现我自己设计的接口的工作表转换为与接口相同类型的对象时,我遇到了类型错误。虽然这些不是 100% 可靠的(有时演员工作),但我无法确定情况背后的任何押韵或原因。

该问题在简化的环境中仍然存在,并且可以通过以下步骤清楚地看到(至少在 Excel 2010 中):

创建一个新工作簿,添加一个类模块,将其设为 public-non-createable 并将其命名为 ITest,创建一个名为 Tools 的标准模块(尽管我相信它可以有任何名称)并将以下内容粘贴到 ITest、Tools 的代码模块中, 和 Sheet1 分别为:

测试:

Option Explicit

Public Function Test() As Boolean

End Function

工具:

Option Explicit

Public Function IsRangeInSheetImplementingTest(rngIn As Excel.Range) As Boolean
    Dim oWks As Object
    Dim oITest As ITest

    On Error Resume Next
    Set oWks = rngIn.Worksheet
    Set oITest = oWks
    If Err.Number <> 0 Then
        IsRangeInSheetImplementingTest = False
    Else
        IsRangeInSheetImplementingTest = True
    End If

End Function

表 1:

Option Explicit

Implements ITest


Public Function ITest_Test() As Boolean
    ITest_Test = True
End Function

您应该会发现调用IsRangeInSheetImplementingTest(Range("A1"))返回False。注释掉On Error Resume Next表明这是由于Type Mismatch在线Set oITest = oWks. 谁能告诉我(1)为什么会发生这种情况以及(2)我能做些什么来使界面得到正确识别?

作为旁注,有时将相同的调用放在工作簿中的单元格中会产生正确的结果 - 但只是有时。对这里发生的事情感到非常困惑 - 非常感谢任何帮助!

4

1 回答 1

0

我无法回答您问题的第一部分(“为什么”),但是在我自己为此苦苦挣扎之后,我找到了解决方法。

我在用于实现接口的每个工作表模块中都构建了一个 Connect 函数(在您的示例中为 ITest)。然后我稍后用它来设置 ITest 的一个实例。

连接功能非常简单:

' Place in the worksheet that implements the ITest interface
Public Function Connect() As ITest
  Set Connect = Me
End Function

在你的IsRangeInSheetImplementingTest替换

Set oWks = rngIn.Worksheet

Set oWks = rngIn.Worksheet.Parent.Sheets(rngIn.Worksheet.Name).Connect

它很丑,但每次都有效。

于 2014-04-11T01:56:36.657 回答