수색…
통사론
- 특성 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