선언된 VBA 프로젝트 외부에서 클래스(개체)를 사용하는 방법

소개

OOP(개체 지향 프로그래밍)를 사용할 경우의 이점 중 하나는 코드의 재사용성입니다. 이렇게 하는 일반적인 방법은 Set 변수 = New ClassName 구문을 사용하여 이미 정의된 클래스의 개체를 인스턴스화하는 것입니다. VBA 프로그래머는 애플리케이션 플랫폼 내에서 개체를 사용할 때마다 이러한 개체를 사용합니다. 예를 들어 Excel의 통합 문서 개체, PowerPoint의 Presentation 개체 또는 Word의 Document 개체가 있습니다. 또한 VBA 프로그래머는 특수한 종류의 클래스에 속하는 개체인 사용자 폼을 사용합니다. 이러한 모든 개체는 VBA 개발자 프로젝트 외부에 있는 라이브러리에 정의됩니다. 도구 | 클릭합니다. 참조... VBE(Visual Basic Editor)가 개발자를 대신하여 자동으로 설정하는 외부 라이브러리 목록을 볼 수 있는 메뉴 항목입니다.

이 팁에서는 사용자가 만든 외부 라이브러리에서 사용자 지정 클래스에 액세스하는 방법을 살펴봅니다. 아래에 사용된 예제는 Excel 2003을 기반으로 하지만 팁은 VBA를 지원하고 버전 2000 이상에 적용되는 다른 MS Office 제품에 적용됩니다.

이 팁은 중간/고급 수준 팁이며 VB(A) 프로그래밍을 통해 특정 편안함 수준을 가정합니다.

한 VBA 프로젝트가 다른 VBA 프로젝트의 클래스 모듈에 선언된 개체에 액세스하기 전에 두 가지 고유한 설정 단계가 필요합니다. 첫 번째 집합은 클래스 모듈이 선언된 프로젝트 외부에서 사용할 수 있도록 하고 개체를 인스턴스화할 수 있는 방법을 제공합니다. 두 번째 집합은 클라이언트 프로젝트에서 이 클래스를 사용하는 방법을 다룹니다.

클래스 정의가 포함된 프로젝트 설정

기본적으로 클래스 모듈에는 Instancing 속성이 Private으로 설정됩니다. 즉, 클래스의 정의가 포함된 프로젝트만 해당 클래스의 개체를 인스턴스화할 수 있습니다. VBA에서 지원하는 유일한 선택은 공용이며 만들 수 없습니다. 즉, 외부 프로젝트는 이 클래스의 개체를 사용할 수 있지만 인스턴스화할 수는 없습니다. 이상하게 보일 수도 있지만, 그것이 바로 그 방식입니다. 기본값에서 속성을 변경하는 방법은 VBE 프로젝트 탐색기에서 클래스 모듈을 선택하고, 관심 있는 클래스 모듈을 선택하고, 속성 창에 액세스하고(필요한 경우 F4를 사용하여 표시) Instancing 속성을 2-PublicNotCreatable로 변경하는 것입니다.

이 팁의 예제와 함께 수행하려면 클래스 모듈을 만들고, clsEmployee로 이름을 지정하고, Instancing 속성을 변경하고, 여기에 다음 코드를 추가합니다.

Option Explicit
Dim sName As String
Property Get Name() As String
    Name = sName
    End Property
Property Let Name(uName As String)
    sName = uName
    End Property

다음으로, 클래스의 Instancing 속성이 PublicNotCreatable이므로 프로젝트는 클라이언트가 개체를 인스턴스화하는 방법을 제공해야 합니다. 표준 모듈에 새 함수를 추가합니다.

Option Explicit
Public Function New_clsEmployee() As clsEmployee
    Set New_clsEmployee = New clsEmployee
    End Function

여기서 clsEmployee는 관심 클래스의 이름입니다. 또한 프라이빗 모듈이 아니어야 합니다.

마지막 한 가지 변화는 인생을 좀 더 쉽게 만들 것입니다. 프로젝트의 이름을 기본 VBAProject 에서 ClassProvider로 바꿉니다. 이렇게 하려면 VBE 프로젝트 탐색기에서 프로젝트를 선택한 다음 도구 | VBAProject 속성... | 일반 탭 | 프로젝트 이름 필드에 ClassProvider를 입력합니다.

클래스 Provider.xls이 파일을 저장합니다.

다음으로 클라이언트 프로젝트로 이동합니다.

내보낸 클래스를 사용할 프로젝트 설정

클라이언트 프로젝트는 다른 외부 라이브러리(예: 사용자 폼)에 정의된 클래스와 마찬가지로 클래스를 매우 많이 사용하며 한 가지 주요 차이점이 있습니다. 해당 클래스의 개체를 인스턴스화할 수 없으므로 위에 선언된 New_clsEmployee() 함수를 사용해야 합니다. 다른 외부 라이브러리와 마찬가지로 초기 바인딩 또는 늦은 바인딩을 사용할지 여부를 결정합니다. 아래 코드는 둘 다를 보여 줍니다. 초기 바인딩 코드를 사용하려면 클라이언트 프로젝트에 참조가 포함되어야 합니다(도구 | 참조...) 클래스 Provider.xls 파일에 연결합니다.

Option Explicit
Sub UseExportedClass_EarlyBinding()
    Dim anEmployee As ClassProvider.clsEmployee
    Set anEmployee = ClassProvider.New_clsEmployee
    anEmployee.Name = "Tushar Mehta"
    MsgBox anEmployee.Name
    End Sub
Sub UseExportedClass_LateBinding()
    Dim anEmployee As Object
    Set anEmployee = Application.Run("'g:\temp\class provider.xls'!new_clsEmployee")
    anEmployee.Name = "Tushar Mehta"
    MsgBox anEmployee.Name
    End Sub

최종 참고 사항

외부 라이브러리는 일반적으로 저장된 파일일 필요는 없습니다. 애플리케이션별 추가 기능(예: 접미사 .xla 또는 .ppa로 저장된 파일)에 있을 수 있습니다. 이러한 추가 기능이 일반 파일 | 통해 열리지 않음을 기억하세요. 열기... 메서드를 사용하지만 도구 | 로드됨 추가 기능... 명령.