ryr*_*ich 7 vb.net vb6 excel vba excel-vba
我已经从VB6升级到VB.NET,通过COM在Excel中使用.
在VB6中,我在类中定义了一个属性MyScalars:
Public Property Get Item(vntIndexKey As Variant) As MyScalar
Attribute Item.VB_UserMemId = 0
Set Item = mCol(vntIndexKey)
...
End Property
Run Code Online (Sandbox Code Playgroud)
这似乎使得在Excel VBA中,我可以访问此属性而不指定它(所以像默认属性):
Dim oOut As Object
Set oOut = MyScalars(Range("E10").Value)
Run Code Online (Sandbox Code Playgroud)
VB.NET中有一个等效的属性吗?我尝试了以下但它在VBA中出错:
Default Public ReadOnly Property Item(ByVal vntIndexKey As String) As MyScalar
Get
If mCol.ContainsKey(vntIndexKey) Then
Item = mCol.Item(vntIndexKey)
End If
...
End Property
Run Code Online (Sandbox Code Playgroud)
小智 2
戈弗特的回答是正确的。从 .NET 转换为 COM 时,COM 接口的所有成员IDispatch都会自动标记一个值。DISPID此自动过程的唯一例外是值 0,该值是为类的默认成员保留的。如果不设置dispid,则.NET类移植到COM时的默认成员是方法::ToString。在你的例子中:
< DispId(0) > _
Public ReadOnly Property Item(ByVal vntIndexKey As String) As MyScalar
End Property
Run Code Online (Sandbox Code Playgroud)