サーチ…


構文

  • 属性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では、クラスのデフォルトグローバルインスタンス(ショートカット)を作成し、クラスメンバにクラス名を使用せずにアクセスできるようにします。たとえば、 DateTimeDateTime.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

オブジェクトエクスプローラの説明テキスト

注:プロパティのすべてのアクセサメンバー( GetLetSet )は同じ説明を使用します。

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow