Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 接口问题_Excel_Vba_Interface_Ms Office - Fatal编程技术网

Excel 接口问题

Excel 接口问题,excel,vba,interface,ms-office,Excel,Vba,Interface,Ms Office,我试图实现一个新类,该类正在Excel VBA中实现两个接口,但我遇到了编译问题,因为接口的成员在实现类中似乎没有正确实现(它们不可调用) 接口如下所示: ICrawlable: Option Explicit Public Function GetCrawler() As ICrawler End Function Option Explicit Public Function Equals(CompareObject As Variant) As Boolean End Funct

我试图实现一个新类,该类正在Excel VBA中实现两个接口,但我遇到了编译问题,因为接口的成员在实现类中似乎没有正确实现(它们不可调用)

接口如下所示:

ICrawlable

Option Explicit

Public Function GetCrawler() As ICrawler

End Function
Option Explicit

Public Function Equals(CompareObject As Variant) As Boolean

End Function
IEquatable

Option Explicit

Public Function GetCrawler() As ICrawler

End Function
Option Explicit

Public Function Equals(CompareObject As Variant) As Boolean

End Function
然而,
ICrawler
还包含一个返回接口的函数
ICrawler

Option Explicit

Public Property Get CurrentItem() As Variant

End Property

Public Sub MoveNext()

End Sub

Public Function GetNext() As Variant

End Function

Public Function ItemsLeft() As Boolean

End Function
我使用前两个接口创建了一个示例类
InterfaceTester

Option Explicit

Implements ICrawlable
Implements IEquatable

Private Function ICrawlable_GetCrawler() As Variant

End Function

Private Function IEquatable_Equals(CompareObject As Variant) As Boolean

End Function
当试图在模块中或其他任何地方使用该类时,我没有Intellisense支持。此外,代码未编译,我在此模块代码中得到一个“未找到方法或数据成员”,突出显示
.Equals

Sub TestInterfacing()
    Dim TestInstance As InterfaceTester
    Set TestInstance = New InterfaceTester

    Dim VerificationInstance As InterfaceTester
    Set VerificationInstance = New InterfaceTester

    Dim Result As Boolean

    Result = TestInstance.Equals(VerificationInstance)
End Sub 
这是VBA中的错误吗?我是否在接口中声明了不允许的内容(我已尝试将所有返回数据类型更改为Variant,并尝试禁用接口的每个函数)?我是否使用保留关键字(在对象资源管理器中,我看不到重复的接口名称)?
它是否在您的计算机上编译?

如果要使用接口中的方法,必须将变量声明为此接口类型:

Sub TestInterfacing()
    Dim TestInstance As IEquatable 'InterfaceTester
    Set TestInstance = New InterfaceTester

    Dim VerificationInstance As InterfaceTester
    Set VerificationInstance = New InterfaceTester

    Dim Result As Boolean
    Result = TestInstance.Equals(VerificationInstance)

End Sub
但是,在这种情况下,您不能使用此类实现的第二个接口中的方法:
ICrawlable


原因是在VBA中,实现方法如下所示:

Private Function ICrawlable_GetCrawler() As ICrawler
使用其他语言的规则时,应如下所示:

Public Function GetCrawler() As ICrawler
VBA不会理解这是接口方法的实现
GetCrawler


为了解决这个问题,您应该向
InterfaceTester
class-
Equals
GetCrawler
添加另外两个公共方法。实施方法应仅针对以下方法:

InterfaceTester
class:

Implements ICrawlable
Implements IEquatable


Public Function Equals(CompareObject As Variant) As Boolean
    'implementation
End Function

Public Function GetCrawler() As ICrawler
    'implementation
End Function

Private Function ICrawlable_GetCrawler() As ICrawler
    Set IEquatable_Equals = GetCrawler
End Function

Private Function IEquatable_Equals(CompareObject As Variant) As Boolean
    IEquatable_Equals = Equals(CompareObject)
End Function

现在,您可以将变量
TestInstance
声明为
InterfaceTester
类,并使用两个接口的方法。

好的,非常感谢您的解释和最佳实践提示:D!真的很有帮助!我在这里应用了C#逻辑,并期望接口成员自动成为公共类成员的一部分,即使它们使用VBA表示法是私有的。