수색…


통사론

  • 특성 VB_Name = "ClassOrModuleName"
  • 특성 VB_GlobalNameSpace = 거짓 '무시 됨
  • 속성 VB_Creatable = 거짓 '무시 됨
  • 특성 VB_PredeclaredId = {True | 그릇된}
  • 속성 VB_Exposed = {True | 그릇된}
  • Attribute variableName.VB_VarUserMemId = 0 '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 ly 클래스를 노출합니다. 그러나 VBA에서는 VB_Createable 이 무시되므로 클래스의 인스턴스를 직접 만들 수는 없습니다. 이것은 다음 VB.Net 클래스와 동일합니다.

Public Class Foo
    Friend Sub New()
    End Sub
End Class    

프로젝트 외부에서 인스턴스를 가져 오려면 인스턴스를 생성하기 위해 팩토리를 노출해야합니다. 이 작업을 수행하는 한 가지 방법은 일반 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_ [변수] UserMemId

VB_VarUserMemId (모듈 범위 변수 용) 및 VB_UserMemId (프로 시저 용) 특성은 VBA에서 주로 두 가지 용도로 사용됩니다.

클래스의 기본 멤버 지정

Collection 을 캡슐화하는 List 클래스는 Item 속성을 갖고 싶어하므로 클라이언트 코드는이를 수행 할 수 있습니다.

For i = 1 To myList.Count 'VBA Collection Objects are 1-based
    Debug.Print myList.Item(i)
Next

그러나 함께 VB_UserMemId 온 0으로 설정 속성 Item 특성, 클라이언트 코드는이 작업을 수행 할 수 있습니다

For i = 1 To myList.Count 'VBA Collection Objects are 1-based
    Debug.Print myList(i)
Next

특정 클래스에서 단 하나의 멤버 만이 합법적으로 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에 알립니다. 그러면 클라이언트 코드에서이 작업을 수행 할 수 있습니다.

Dim item As Variant
For Each item In myList
    Debug.Print item
Next

이 메서드를 구현하는 가장 쉬운 방법은 내부 / 캡슐화 된 Collection 에서 hidden [_NewEnum] 속성 getter를 호출하는 것입니다. 그 식별자를 불법적 인 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