在将实现我自己设计的接口的工作表转换为与接口相同类型的对象时,我遇到了类型错误。虽然这些不是100%可靠(有时是演员作品),但是当它有或没有时,我无法找出背后的任何押韵或理由。
问题在简化的环境中仍然存在,并且可以通过以下步骤清楚地看到(至少在Excel 2010中):
创建一个新工作簿,添加一个类模块,使其成为public-non-createable并称之为ITest,创建一个名为Tools的标准模块(虽然我相信这可以有任何名称)并将以下内容粘贴到代码模块中分别是ITest,Tools和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
Sheet 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)我能做些什么来使接口得到正确识别?
作为旁注,有时在工作簿中的单元格中放置相同的调用会得到正确的结果 - 但有时只是。很困惑这里发生了什么 - 非常感谢任何帮助!
答案 0 :(得分:0)
我无法回答你问题的第一部分(“为什么”)但是在我自己挣扎之后,我找到了解决方法。
我在每个工作表模块中构建了一个Connect函数,用于实现接口(在您的示例中为ITest)。然后我用它来设置ITest的一个实例。
Connect功能非常简单:
' 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
这是UGLY,但它每次都有效。