2014-06-12 15 views
7

Uaktualniłem klasę z VB6 na VB.NET do użycia w Excelu przez COM.Odpowiednik VB.NET elementu atrybutu VB6. VB_UserMemId = 0

w VB6, mam właściwość określona w klasie MyScalars jak to:

Public Property Get Item(vntIndexKey As Variant) As MyScalar 
Attribute Item.VB_UserMemId = 0 
    Set Item = mCol(vntIndexKey) 
    ... 
End Property 

Wydaje się to zrobić to tak, że w Excel VBA, można uzyskać dostęp do tej właściwości bez podawania go (tak jak właściwości domyślnej):

Dim oOut As Object 
Set oOut = MyScalars(Range("E10").Value) 

Czy istnieje równoważny atrybut w VB.NET, który to robi? Próbowałem następujące, ale daje błąd w 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 
+0

Jakiego błędu dostałeś w VBA? Możesz także wypróbować nieruchomość z "Set", która nie jest ReadOnly. – Govert

+0

@Kwota błędu 450: niepoprawna liczba argumentów lub nieprawidłowe przypisanie właściwości. Jeśli wykonuję 'MyScalars.Item (Range (" E10 "). Value)' działa dobrze, jestem po prostu ciekawy, czy domyślna właściwość jest możliwa. – ryrich

+0

Również określenie "Ustaw" daje taki sam wynik. – ryrich

Odpowiedz

2

Odpowiedź Govert jest prawidłowa. Wszyscy członkowie interfejsu COM IDispatch są automatycznie oznaczani wartością DISPID, po przekonwertowaniu z .NET na COM. Jedynym wyjątkiem dla tego automatycznego procesu jest wartość 0, która jest zarezerwowana dla domyślnego elementu klasy. jeśli nie ustawisz dispid, domyślnym elementem klas .NET, gdy jest on przeniesiony do COM, jest metoda ::ToString. W twoim przykładzie:

< DispId(0) > _ 
Public ReadOnly Property Item(ByVal vntIndexKey As String) As MyScalar 

End Property