我怎样才能将一个工作表,实现和接口可靠的接口types的对象?

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

这个问题仍然存在于一个简化的环境中,可以通过以下步骤清楚地看到(至less在Excel 2010中):

创build一个新的工作簿,添加一个类模块,使其公共不可创build,并调用它ITest,创build一个称为工具(尽pipe我相信这可能有任何名称)的标准模块,并将以下粘贴到ITest,工具和Sheet1分别为:

ITEST:

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 

工作表Sheet1:

 Option Explicit Implements ITest Public Function ITest_Test() As Boolean ITest_Test = True End Function 

你应该发现调用IsRangeInSheetImplementingTest(Range("A1"))返回FalseOn Error Resume Next注释表明,这是由于Type Mismatch行上Set oITest = oWks 。 谁能告诉我(1)为什么会发生这种情况?(2)我能做些什么来使界面正确识别?

作为一个方面说明,有时在工作簿中的一个单元格中放置相同的调用给出了正确的结果 – 但只是有时。 非常困惑,这是怎么回事 – 任何帮助,非常感谢!

我不能回答你的问题的第一部分(“为什么”),但经过自己的努力,我find了解决办法。

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

连接function非常简单:

 ' 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 

这是丑陋的,但每次都有效。