[VBA] 만든 클래스를 추가 기능으로 사용

3326 단어 VBAExcelVBA
여러 프로젝트에서 사용하고 싶은 클래스는 추가 기능으로 외부에 두고 다른 Excel VBA에서 볼 수 있으면 유용합니다. (아마)

방법



1. 보통 클래스 모듈 만들기



여기에서는 ClassInXlam 라는 이름으로 합니다.

ClassInXlam (클래스 모듈)
Option Explicit

Public str As String

' strの中身を表示する
Public Sub ShowStr()
    Debug.Print "str=" & str
End Sub

2. 외부에서 인스턴스를 검색하는 함수 추가



외부에서 직접 New 할 수 없으므로 표준 모듈을 추가하고 외부에서 인스턴스를 검색하는 함수를 작성합니다.
여기서 모듈은 Root라는 이름으로 지정됩니다.

Root(표준 모듈)
Option Explicit

Public Function CreateClassInXlam(str As String) As ClassInXlam
    Dim tmpClass As ClassInXlam

    Set tmpClass = New ClassInXlam
    tmpClass.str = str

    Set CreateClassInXlam = tmpClass
End Function

3. 클래스의 속성을 PublicNotCreatable로 설정



속성 창에서 클래스의 Instancing 속성을 2 - PublicNotCreatable로 설정합니다.
(완전한 Public에는 설정할 수 없습니다.)
이제 외부에서 클래스 이름을 사용할 수 있습니다.

4. 프로젝트의 이름 변경



기본 VBAProject로 남아 있으면 다른 파일에서 참조할 때 이름이 충돌하여 오류가 발생합니다.
프로젝트 탐색기에서 대상 프로젝트를 마우스 오른쪽 버튼으로 클릭하여 적절한 이름으로 변경합니다.

5. Excel 추가 기능 형식으로 저장



다른 이름으로 저장에서 .xlam 형식을 선택하여 저장합니다.
여기까지 애드인 측의 준비는 종료입니다.

외부에서 참조해보기



새 책을 열고 거기에서 찾아보십시오.

1. 추가 기능에 참조 설정하기



VBE의 도구 > 참조 설정 대화 상자의 찾아보기에서 방금 만든 xlam 파일을 선택합니다.
"OK"를 누르면 프로젝트 탐색기의 "참조 설정"에 참조 대상으로 추가됩니다.



2. 사용



이런 느낌으로 사용할 수 있습니다.
Intellisense도 사용할 수 있습니다.

표준 모듈
Option Explicit

Sub test()
    Dim instanceOfClass As ClassInXlam

    Set instanceOfClass = CreateClassInXlam("test")

    instanceOfClass.ShowStr ' => str=test
End Sub

외부에서 인스턴스화하는 인터페이스 정보



다음과 같이 하면ClassInXlam.Create() 라고 쓸 수 있어 Static 메소드로부터 작성되어 있는 것처럼 보이고 멋집니다.

1. 클래스 모듈에 Create 메서드 만들기



Create 메서드는 외부 파일에서 인스턴스를 만들 수 있기 때문입니다.

ClassInXlam (클래스 모듈)
Option Explicit

Public str As String

' strの中身を表示する
Public Sub ShowStr()
    Debug.Print "str=" & str
End Sub

' ちなみにCreateには引数も渡せる
Public Function Create(str As String) As ClassInXlam
    Dim tmpClass As ClassInXlam

    Set tmpClass = New ClassInXlam
    tmpClass.str = str

    Set Create = tmpClass
End Function

2. 인스턴스 생성을 위한 공용 변수 만들기



추가 기능 측 루트 모듈의 내용은 다음과 같습니다.

Root(표준 모듈)
Option Explicit

Public ClassInXlam As New ClassInXlam

이 퍼블릭 변수를 경유해 외부로부터 인스턴스를 취득합니다.As New 이므로 항상 인스턴스가 포함되어 있음(Nothing이 아님)이 보장됩니다.
변수명은 클래스명과 같아도 문제없는 것 같습니다.

3. 사용



이제 외부에서 다음과 같이 사용할 수 있습니다.

표준 모듈
Option Explicit

Sub test()
    Dim instanceOfClass As ClassInXlam

    Set instanceOfClass = ClassInXlam.Create("test")

    instanceOfClass.ShowStr ' => str=test
End Sub

주의점



실제로는 ClassInXlam 라는 퍼블릭 변수에 들어 있는 인스턴스의 메소드를 사용하고 있을 뿐입니다.
생성을 위한 오직 하나의 인스턴스가 존재하기 때문에 문제가 되는 장면도 있을지도 모릅니다.

좋은 웹페이지 즐겨찾기