サーチ…
構文
- 属性VB_Name = "ClassOrModuleName"
- 属性VB_GlobalNameSpace = False '無視される
- 属性VB_Creatable = False '無視される
- 属性VB_PredeclaredId = {True | False}
- 属性VB_Exposed = {True | False}
- 属性variableName.VB_VarUserMemId = 0 'ゼロは、これがクラスのデフォルトメンバーであることを示します。
- 属性variableName.VB_VarDescription = "some string" 'この変数のオブジェクトブラウザ情報にテキストを追加します。
- 属性procName.VB_Description = "some string" 'プロシージャのオブジェクトブラウザ情報にテキストを追加します。
- 属性procName.VB_UserMemId = {0 | -4}
- '0:関数をクラスのデフォルトメンバーにします。
- '-4:関数が列挙子を返すことを指定します。
VB_Name
VB_Nameは、クラスまたはモジュール名を指定します。
Attribute VB_Name = "Class1"
このクラスの新しいインスタンスは、
Dim myClass As Class1
myClass = new Class1
VB_GlobalNameSpace
VBAでは、この属性は無視されます。それはVB6から移植されていませんでした。
VB6では、クラスのデフォルトグローバルインスタンス(ショートカット)を作成し、クラスメンバにクラス名を使用せずにアクセスできるようにします。たとえば、 DateTime
( DateTime.Now
)は、実際にはVBA.Conversion
クラスの一部です。
Debug.Print VBA.Conversion.DateTime.Now
Debug.Print DateTime.Now
VB_Createable
この属性は無視されます。それはVB6から移植されていませんでした。
VB6では、 VB_Exposed
属性と組み合わせて使用され、現在のプロジェクトの外部にあるクラスのアクセシビリティを制御します。
VB_Exposed=True
VB_Creatable=True
他のプロジェクトからアクセスできるPublic Class
になりますが、この機能はVBAには存在しません。
VB_PredeclaredId
クラスのグローバルなデフォルトインスタンスを作成します。デフォルトのインスタンスには、クラスの名前でアクセスします。
宣言
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "Class1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Public Function GiveMeATwo() As Integer
GiveMeATwo = 2
End Function
コール
Debug.Print Class1.GiveMeATwo
いくつかの点で、これは他の言語の静的クラスの動作をシミュレートしますが、他の言語とは異なり、クラスのインスタンスを作成することはできます。
Dim cls As Class1
Set cls = New Class1
Debug.Print cls.GiveMeATwo
VB_Exposed
クラスのインスタンス化の特性を制御します。
Attribute VB_Exposed = False
クラスをPrivate
ます。現在のプロジェクトの外部にはアクセスできません。
Attribute VB_Exposed = True
プロジェクトの外部でPublic
クラスをPublic
します。ただし、VBAではVB_Createable
が無視されるため、クラスのインスタンスを直接作成することはできません。これは、次のVB.Netクラスに相当します。
Public Class Foo
Friend Sub New()
End Sub
End Class
プロジェクトの外部からインスタンスを取得するには、ファクトリを公開してインスタンスを作成する必要があります。これを行う1つの方法は、通常のPublic
モジュールを使用することです。
Public Function CreateFoo() As Foo
CreateFoo = New Foo
End Function
パブリックモジュールは他のプロジェクトからアクセス可能であるため、 Public - Not Createable
クラスの新しいインスタンスを作成することができます。
VB_Description
オブジェクトエクスプローラで表示されるクラスまたはモジュールメンバーにテキストの説明を追加します。理想的には、パブリックインターフェイス/ APIのすべてのパブリックメンバーに説明が必要です。
Public Function GiveMeATwo() As Integer
Attribute GiveMeATwo.VB_Description = "Returns a two!"
GiveMeATwo = 2
End Property
注:プロパティのすべてのアクセサメンバー( Get
、 Let
、 Set
)は同じ説明を使用します。
VB_ [Var] UserMemId
VB_VarUserMemId
(モジュールスコープ変数用)とVB_UserMemId
(プロシージャ用)属性は、主に2つの目的のためにVBAで使用されます。
クラスのデフォルトメンバーの指定
Collection
をカプセル化するList
クラスは、 Item
プロパティを持つことを望んでいるので、クライアントコードはこれを行うことができます:
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList.Item(i)
Next
しかし、 Item
プロパティでVB_UserMemId
属性が0に設定されていると、クライアントコードでこれを行うことができます。
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList(i)
Next
任意のクラスでは、1つのメンバーだけがVB_UserMemId = 0
を持つことができます。プロパティの場合は、 Get
アクセサで属性を指定します。
Option Explicit
Private internal As New Collection
Public Property Get Count() As Long
Count = internal.Count
End Property
Public Property Get Item(ByVal index As Long) As Variant
Attribute Item.VB_Description = "Gets or sets the element at the specified index."
Attribute Item.VB_UserMemId = 0
'Gets the element at the specified index.
Item = internal(index)
End Property
Public Property Let Item(ByVal index As Long, ByVal value As Variant)
'Sets the element at the specified index.
With internal
If index = .Count + 1 Then
.Add item:=value
ElseIf index = .Count Then
.Remove index
.Add item:=value
ElseIf index < .Count Then
.Remove index
.Add item:=value, before:=index
End If
End With
End Property
For Each
ループ構造でクラスを反復可能にする
マジックの値が-4
場合、 VB_UserMemId
属性は、このメンバーが列挙子を生成することをVBAにVB_UserMemId
ます。これにより、クライアントコードでこれを行うことができます。
Dim item As Variant
For Each item In myList
Debug.Print item
Next
このメソッドを実装する最も簡単な方法は、内部/カプセル化されたCollection
hidden [_NewEnum]
プロパティゲッターを呼び出すことです。先頭のアンダースコアが不正なVBA識別子になるため、識別子を角括弧で囲む必要があります。
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_Description = "Gets an enumerator that iterates through the List."
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40" 'would hide the member in VB6. not supported in VBA.
'Gets an enumerator that iterates through the List.
Set NewEnum = internal.[_NewEnum]
End Property