gpt4 book ai didi

vba - 如何可靠地将实现和接口(interface)的工作表转换为接口(interface)类型的对象?

转载 作者:行者123 更新时间:2023-12-04 21:05:58 25 4
gpt4 key购买 nike

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

问题在简化的环境中仍然存在,并且可以通过执行以下步骤(至少在 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 表明这是由于 Set oITest = oWks 行上的 Type Mismatch 造成的。谁能告诉我 (1) 为什么会这样,以及 (2) 我该怎么做才能正确识别界面?

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

最佳答案

我无法回答你问题的第一部分(“为什么”),但在我自己努力解决之后,我找到了解决方法。

我在每个用于实现接口(interface)(在您的示例中为 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

它很丑陋,但每次都能正常工作。

关于vba - 如何可靠地将实现和接口(interface)的工作表转换为接口(interface)类型的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18699566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com