如何可靠地生成实现和接口到接口类型的对象的工作表?

时间:2013-09-09 13:40:37

标签: excel vba excel-vba excel-2010

在将实现我自己设计的接口的工作表转换为与接口相同类型的对象时,我遇到了类型错误。虽然这些不是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 MismatchSet oITest = oWks引起的。任何人都可以告诉我(1)为什么会发生这种情况,以及(2)我能做些什么来使接口得到正确识别?

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

1 个答案:

答案 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,但它每次都有效。