Vb.net VBA到COM公开的.NET程序集-对象不';不支持此属性或方法

Vb.net VBA到COM公开的.NET程序集-对象不';不支持此属性或方法,vb.net,vba,com,Vb.net,Vba,Com,共享属性是否可以从COM公开的.NET程序集访问 VBA Dim appExcel As Object Dim objAppSingleton As Object Set objAppSingleton = CreateObject("Pitchbook.CommonUtils.Application.PitchbookAppSingleton") appExcel = objAppSingleton.CurrentPitchbookExcelApp VB.NET &l

共享属性是否可以从COM公开的.NET程序集访问

VBA

Dim appExcel As Object
    Dim objAppSingleton As Object
    Set objAppSingleton = CreateObject("Pitchbook.CommonUtils.Application.PitchbookAppSingleton")
    appExcel = objAppSingleton.CurrentPitchbookExcelApp
VB.NET

<ProgId("Pitchbook.CommonUtils.Application.PitchbookAppSingleton")> _
Public Class PitchbookAppSingleton

    Private Shared _currentPitchbookExcelApplication As PitchbookAppExcel
    Private Shared _syncLockExcel As Object = New Object()

   Public Shared ReadOnly Property CurrentPitchbookExcelApp As PitchbookAppExcel
        Get
            If _currentPitchbookExcelApplication Is Nothing Then
                                    SyncLock [_syncLockExcel]
                    If _currentPitchbookExcelApplication Is Nothing Then
                        Dim currPitchbookExcelApplication As New PitchbookAppExcel()
                        _currentPitchbookExcelApplication = currPitchbookExcelApplication
                    End If
                End SyncLock
            End If
            Return _currentPitchbookExcelApplication
        End Get
    End Property

End Class


Public Class PitchbookAppExcel
    Inherits PitchbookApp

    Protected Friend Sub New()
        MyBase.New()                        
    End Sub

End Class
_
公共类PitchbookAppSingleton
私有共享_currentPitchbookExcelApplication作为PitchbookAppExcel
私有共享_syncLockExcel作为对象=新对象()
公共共享只读属性CurrentPitchbookExcelApp作为PitchbookAppExcel
得到
如果_currentPitchbookExcelApplication什么都不是,那么
SyncLock[\u syncLockExcel]
如果_currentPitchbookExcelApplication什么都不是,那么
Dim currPitchbookExcelApplication作为新的PitchbookAppExcel()
_currentPitchbookExcelApplication=currPitchbookExcelApplication
如果结束
端同步
如果结束
Return\u currentPitchbookExcelApplication
结束
端属性
末级
公共类PitchbookAppExcel
继承PitchbookApp
受保护的好友Sub New()
MyBase.New()
端接头
末级
行appExcel=objAppSingleton.CurrentPitchbookExcelApp给出了错误: 运行时错误“438”:
对象不支持此属性或方法

您需要在VB中说
Set
来设置对象变量

Set appExcel = objAppSingleton.CurrentPitchbookExcelApp 

如果您不说“Set”,那么VBA将查找默认方法并调用该方法,以获得非对象类型。如果没有定义默认方法(dispid=0),那么它将失败,并出现您正在遇到的错误。

这是一个非常简单的问题,但如果任何人都不知道答案,则答案是否。您无法从COM公开的.NET程序集访问共享属性。至少不是直接的。。。但是,如果创建实例包装器,则可以访问共享属性


在我的例子中,我使用Facade模式创建了一个对象,专门供VBA使用,该对象通过实例公开了相关的共享实用程序函数。谢谢大家的评论。

感谢您的回复。即使使用Set appExcel=objAppSingleton,我仍然会得到相同的错误。CurrentPitchbookExcelApp@ernie99那我就不知道了。您是否尝试过在Visual Studio调试器中运行VB主机并在中插入断点?我正在Excel中使用内置的Visual Basic IDE。我已经设置了一个断点,并逐步完成了代码。在locals窗口中查看objAppSingleton是否正确实例化,即它的值不是空的。展开对象时,不会列出任何成员。我希望看到列出该对象的成员,但我认为这只是IDE的一个限制(它只显示变量而不是属性),而不是一个问题。我显然对VBA了解不多。一切似乎都设置正确。我想这是因为它是共有财产。我会继续挖的,谢谢。@ernie99,Doh!我没有注意到这是一处共有财产。您是正确的,属性不应该被共享,只应该共享它下面使用的私有变量。@ernie99,而不是modules,否。使用一个公开方法来检索单例的非单例类是解决此问题的完全合理的方法。换句话说:这些方法必须是实例(非共享)方法,才能从VBA或脚本在对象上可见,但它们仍然可以返回共享变量来实现单例。基本上,如果你从方法中删除“Shared”这个词,我认为它应该可以工作。你不能从非共享属性声明中访问共享私有对象吗?