VBA에서 문서 수준 사용자 지정의 코드 호출

문서의 VBA(Visual Basic for Applications) 코드에서 사용자 지정 어셈블리의 코드를 호출할 수 있도록 Word 또는 Excel용 문서 수준 프로젝트를 구성할 수 있습니다. 이 방법은 다음과 같은 경우에 유용합니다.

  • 동일한 문서에 연결된 문서 수준 사용자 지정의 기능을 사용하여 문서의 기존 VBA 코드를 확장하려는 경우

  • 문서 수준 사용자 지정에서 개발한 서비스를 문서에 VBA 코드를 작성하여 해당 서비스에 액세스할 수 있는 최종 사용자가 사용할 수 있도록 하려는 경우

적용 대상: 이 항목의 정보는 Excel 2007 및 Excel 2010, Word 2007 및 Word 2010의 문서 수준 프로젝트에 적용됩니다. 자세한 내용은 Office 응용 프로그램 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하십시오.

Visual Studio의 Office 개발 도구에서는 응용 프로그램 수준 추가 기능과 유사한 기능을 제공합니다. 추가 기능을 개발하는 경우 다른 Microsoft Office 솔루션에서 추가 기능의 코드를 호출할 수 있습니다. 자세한 내용은 다른 Office 솔루션에서 응용 프로그램 수준 추가 기능의 코드 호출을 참조하십시오.

참고

이 기능은 Word 서식 파일 프로젝트에서 사용할 수 없습니다. Word 문서, Excel 통합 문서 또는 Excel 서식 파일 프로젝트에서만 이 기능을 사용할 수 있습니다.

요구 사항

VBA 코드에서 사용자 지정 어셈블리를 호출하려면 먼저 프로젝트가 다음 요구 사항을 충족해야 합니다.

  • 문서는 다음 파일 확장명 중 하나여야 합니다.

    • Word의 경우: .docm 또는 .doc

    • Excel의 경우 .xlsm, .xltm, .xls 또는 .xlt

  • 문서에 VBA 코드가 있는 VBA 프로젝트가 이미 포함되어 있어야 합니다.

  • 매크로를 사용할 수 있도록 설정하라는 메시지 없이 문서의 VBA 코드를 실행할 수 있어야 합니다. Word 또는 Excel의 보안 센터 설정에서 신뢰할 수 있는 위치 목록에 Office 프로젝트의 위치를 추가하여 VBA 코드를 실행할 수 있는 것으로 신뢰할 수 있습니다.

  • Office 프로젝트에 VBA에 노출할 하나 이상의 공용 멤버가 포함된 적어도 하나의 공용 클래스가 들어 있어야 합니다.

    VBA에 메서드, 속성 및 이벤트를 노출할 수 있습니다. 노출하는 클래스는 호스트 항목 클래스(예: Word의 ThisDocument, Excel의 ThisWorkbook 및 Sheet1) 또는 프로젝트에 정의하는 다른 클래스일 수 있습니다. 호스트 항목에 대한 자세한 내용은 호스트 항목 및 호스트 컨트롤 개요를 참조하십시오.

VBA 코드에서 사용자 지정 어셈블리를 호출할 수 있도록 설정

다음 두 가지 방법으로 문서의 VBA 코드에 사용자 지정 어셈블리의 멤버를 노출할 수 있습니다.

  • VBA에 Visual Basic 프로젝트의 호스트 항목 클래스 멤버를 노출할 수 있습니다. 이렇게 하려면 디자이너에서 호스트 항목(문서, 워크시트 또는 통합 문서)이 열려 있는 동안 속성 창에서 호스트 항목의 EnableVbaCallers 속성을 True로 설정합니다. Visual Studio에서는 VBA 코드에서 클래스의 멤버를 호출하는 데 필요한 모든 작업을 자동으로 수행합니다.

  • VBA에 Visual C# 프로젝트의 공용 클래스 멤버 또는 Visual Basic 프로젝트의 호스트 항목이 아닌 클래스 멤버를 노출할 수 있습니다. 이 옵션을 사용하면 VBA에 노출하는 클래스를 보다 자유롭게 선택할 수 있지만 추가 단계를 직접 수행해야 합니다.

    이렇게 하려면 다음과 같은 주요 단계를 수행해야 합니다.

    1. COM에 클래스를 노출합니다.

    2. VBA로 노출할 클래스의 인스턴스를 반환하도록 프로젝트에 포함된 호스트 항목 클래스의 GetAutomationObject 메서드를 재정의합니다.

    3. 프로젝트에 있는 호스트 항목의 ReferenceAssemblyFromVbaProject 속성을 True로 설정합니다. 이렇게 하면 사용자 지정 어셈블리의 형식 라이브러리가 어셈블리에 포함되고 문서의 VBA 프로젝트에 형식 라이브러리에 대한 참조가 추가됩니다.

자세한 내용은 방법: Visual Basic 프로젝트에서 VBA로 코드 노출방법: Visual C# 프로젝트에서 VBA로 코드 노출을 참조하십시오.

EnableVbaCallers 및 ReferenceAssemblyFromVbaProject 속성은 디자인 타임에 속성 창에서만 사용할 수 있으며 런타임에는 사용할 수 없습니다. 속성을 보려면 Visual Studio에서 호스트 항목의 디자이너를 엽니다. 이러한 속성을 설정할 때 Visual Studio에서 수행하는 특정 작업에 대한 자세한 내용은 호스트 항목 속성에서 수행하는 작업을 참조하십시오.

참고

통합 문서 또는 문서에 아직 VBA 코드가 없거나 문서의 VBA 코드가 실행할 수 있는 것으로 신뢰되지 않은 경우 EnableVbaCallers 또는 ReferenceAssemblyFromVbaProject 속성을 True로 설정하면 오류 메시지가 표시됩니다. 이는 이 경우 Visual Studio에서 문서의 VBA 프로젝트를 수정할 수 없기 때문입니다.

VBA 코드의 멤버를 사용하여 사용자 지정 어셈블리 호출

VBA 코드에서 사용자 지정 어셈블리를 호출할 수 있도록 프로젝트를 구성하면 Visual Studio에서는 문서의 VBA 프로젝트에 다음 멤버를 추가합니다.

  • 모든 프로젝트의 경우 Visual Studio에서는 GetManagedClass라는 전역 메서드를 추가합니다.

  • EnableVbaCallers 속성을 사용하여 호스트 항목 클래스의 멤버를 노출하는 Visual Basic 프로젝트의 경우 Visual Studio에서는 VBA 프로젝트의 ThisDocument, ThisWorkbook, Sheet1, Sheet2 또는 Sheet3 모듈에 CallVSTOAssembly 속성도 추가합니다.

CallVSTOAssembly 속성 또는 GetManagedClass 메서드를 사용하여 프로젝트의 VBA 코드에 노출한 클래스의 공용 멤버에 액세스할 수 있습니다.

참고

솔루션을 개발하고 배포하는 동안 문서의 여러 복사본에 VBA 코드를 추가할 수 있습니다. 자세한 내용은 문서에 VBA 코드 추가 지침을 참조하십시오.

Visual Basic 프로젝트에서 CallVSTOAssembly 속성 사용

호스트 항목 클래스에 추가한 공용 멤버에 액세스하려면 CallVSTOAssembly 속성을 사용합니다. 예를 들어 다음 VBA 매크로는 Excel 통합 문서 프로젝트의 Sheet1 클래스에 정의된 MyVSTOMethod라는 메서드를 호출합니다.

Sub MyMacro()
    Sheet1.CallVSTOAssembly.MyVSTOMethod()
End Sub

이 속성을 사용하면 GetManagedClass 메서드를 직접 사용할 때보다 쉽게 사용자 지정 어셈블리를 호출할 수 있습니다. CallVSTOAssembly는 VBA에 노출된 호스트 항목 클래스를 나타내는 개체를 반환합니다. 반환된 개체의 멤버 및 메서드 매개 변수는 IntelliSense에 나타납니다.

CallVSTOAssembly 속성에는 다음 코드와 비슷한 선언이 있습니다. 이 코드에서는 ExcelWorkbook1이라는 Excel 통합 문서 프로젝트의 Sheet1 호스트 항목 클래스를 VBA에 노출했다고 가정합니다.

Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
    Set CallVSTOAssembly = GetManagedClass(Me)
End Property

GetManagedClass 메서드 사용

전역 GetManagedClass 메서드를 사용하려면 GetAutomationObject 메서드의 재정의가 포함된 호스트 항목 클래스에 해당하는 VBA 개체를 전달합니다. 그런 다음 반환된 개체를 사용하여 VBA에 노출한 클래스에 액세스합니다.

예를 들어 다음 VBA 매크로는 ExcelWorkbook1이라는 Excel 통합 문서 프로젝트의 Sheet1 호스트 항목 클래스에 정의된 MyVSTOMethod라는 메서드를 호출합니다.

Sub CallVSTOMethod
    Dim VSTOSheet1 As ExcelWorkbook1.Sheet1
    Set VSTOSheet1 = GetManagedClass(Sheet1)
    VSTOSheet1.MyVSTOMethod
End Sub

GetManagedClass 메서드에는 다음과 같은 선언이 있습니다.

GetManagedClass(pdispInteropObject Object) As Object

이 메서드는 VBA에 노출한 클래스를 나타내는 개체를 반환합니다. 반환된 개체의 멤버 및 메서드 매개 변수는 IntelliSense에 나타납니다.

문서에 VBA 코드 추가 지침

문서의 여러 복사본에 문서 수준 사용자 지정을 호출하는 VBA 코드를 추가할 수 있습니다.

솔루션을 개발하고 테스트할 때 Visual Studio에서 프로젝트를 디버깅하거나 실행하는 동안, 즉 문서가 빌드 출력 폴더에 있는 동안 열려 있는 문서에서 VBA 코드를 작성할 수 있습니다. 그러나 이 문서에 추가하는 VBA 코드는 다음에 프로젝트를 빌드할 때 덮어쓰여집니다. Visual Studio에서는 빌드 출력 폴더의 문서가 주 프로젝트 폴더의 문서 복사본으로 대체되기 때문입니다.

솔루션을 디버깅하거나 실행하는 동안 문서에 추가한 VBA 코드를 저장하려면 VBA 코드를 프로젝트 폴더의 문서에 VBA 코드를 복사합니다. 빌드 프로세스에 대한 자세한 내용은 Office 솔루션 빌드 프로세스 개요를 참조하십시오.

솔루션을 배포할 준비가 된 상태에서는 다음 세 가지의 주 문서 위치에 VBA 코드를 추가할 수 있습니다.

개발 컴퓨터의 프로젝트 폴더

이 위치는 문서의 VBA 코드와 사용자 지정 코드를 완전히 제어할 수 있는 경우에 편리합니다. 문서는 개발 컴퓨터에 있으므로 사용자 지정 코드를 변경한 경우 VBA 코드를 손쉽게 수정할 수 있습니다. 문서의 이 복사본에 추가한 VBA 코드는 솔루션을 빌드하고 디버깅하고 게시하는 경우에도 여전히 문서에 유지됩니다.

문서가 디자이너에서 열려 있는 동안에는 해당 문서에 VBA 코드를 추가할 수 없습니다. 먼저 디자이너에서 문서를 닫고 Word 또는 Excel에서 직접 문서를 열어야 합니다.

경고

문서가 열려 있을 때 실행되는 VBA 코드를 추가하면 이 코드로 인해 문서가 손상되거나 디자이너에서 문서가 열리지 않는 경우도 있습니다.

게시 또는 설치 폴더

게시 또는 설치 폴더의 문서에 VBA 코드를 추가하는 방법이 적절한 경우가 있습니다. 예를 들어 Visual Studio가 설치되어 있지 않은 컴퓨터에 다른 개발자가 VBA 코드를 작성하고 테스트한 경우 이 옵션을 선택할 수 있습니다.

게시 폴더에서 직접 솔루션을 설치한 경우 솔루션을 게시할 때마다 문서에 VBA 코드를 추가해야 합니다. Visual Studio에서는 솔루션을 게시할 때 게시 위치에 있는 문서를 덮어씁니다.

게시 폴더가 아닌 설치 폴더에서 솔루션을 설치하면 솔루션을 게시할 때마다 문서에 VBA 코드를 추가할 필요가 없습니다. 게시 폴더에서 설치 폴더로 게시 업데이트를 이동할 준비가 된 경우 문서를 제외한 모든 파일을 설치 폴더로 복사합니다.

최종 사용자 컴퓨터

최종 사용자가 문서 수준 사용자 지정에 제공된 서비스를 호출하는 VBA 개발자인 경우 문서의 복사본에서 CallVSTOAssembly 속성이나 GetManagedClass 메서드를 사용하여 코드를 호출하는 방법을 최종 사용자에게 알려줄 수 있습니다. 솔루션에 대한 업데이트를 게시할 경우 문서는 게시 업데이트로 인해 수정되지 않으므로 최종 사용자 컴퓨터의 문서에 있는 VBA 코드는 덮어쓰여지지 않습니다.

호스트 항목 속성에서 수행하는 작업

EnableVbaCallers 및 ReferenceAssemblyFromVbaProject 속성을 사용하면 Visual Studio에서는 다양한 작업을 수행합니다.

EnableVbaCallers

Visual Basic 프로젝트에서 호스트 항목의 EnableVbaCallers 속성을 True로 설정하면 Visual Studio에서는 다음 작업을 수행합니다.

  1. ComClassAttributeComVisibleAttribute 특성을 호스트 항목 클래스에 추가합니다.

  2. 호스트 항목 클래스의 GetAutomationObject 메서드를 재정의합니다.

  3. 호스트 항목의 ReferenceAssemblyFromVbaProject 속성을 True로 설정합니다.

EnableVbaCallers 속성을 다시 False로 설정하면 Visual Studio에서는 다음 작업을 수행합니다.

  1. ThisDocument 클래스에서 ComClassAttributeComVisibleAttribute 특성을 제거합니다.

  2. 호스트 항목 클래스에서 GetAutomationObject 메서드를 제거합니다.

    참고

    Visual Studio에서는 ReferenceAssemblyFromVbaProject 속성을 다시 False로 자동으로 설정하지 않습니다. 속성 창을 사용하여 이 속성을 False로 수동으로 설정할 수 있습니다.

ReferenceAssemblyFromVbaProject

Visual Basic 또는 Visual C# 프로젝트에서 호스트 항목의 ReferenceAssemblyFromVbaProject 속성을 True로 설정하면 Visual Studio에서는 다음 작업을 수행합니다.

  1. 사용자 지정 어셈블리에 대한 형식 라이브러리를 생성하고 어셈블리에 형식 라이브러리를 포함합니다.

  2. 문서의 VBA 프로젝트에 다음과 같은 형식 라이브러리에 대한 참조를 추가합니다.

    • 사용자 지정 어셈블리에 대한 형식 라이브러리

    • Microsoft Visual Studio Tools for Office Execution Engine 9.0 형식 라이브러리. 이 형식 라이브러리는 Microsoft Visual Studio Tools for Office Runtime에 포함되어 있습니다.

ReferenceAssemblyFromVbaProject 속성을 다시 False로 설정하면 Visual Studio에서는 다음 작업을 수행합니다.

  1. 문서의 VBA 프로젝트에서 형식 라이브러리 참조를 제거합니다.

  2. 어셈블리에서 포함된 형식 라이브러리를 제거합니다.

문제 해결

다음 표에서는 일반적인 일부 오류에 대해 나열하고 해당 오류를 해결하기 위한 제안 사항을 보여 줍니다.

Error

제안

EnableVbaCallers 또는 ReferenceAssemblyFromVbaProject 속성을 설정하면 문서에 VBA 프로젝트가 없거나 문서의 VBA 프로젝트에 액세스할 수 있는 권한이 없음을 알리는 오류 메시지가 표시됩니다.

프로젝트의 문서에 적어도 하나의 VBA 매크로가 들어 있고, VBA 프로젝트가 실행하기에 충분히 안전한 것으로 신뢰되었으며, VBA 프로젝트가 암호로 보호되어 있지 않은지 확인합니다.

EnableVbaCallers 또는 ReferenceAssemblyFromVbaProject 속성을 설정하면 GuidAttribute 선언이 누락되었거나 손상되었음을 알리는 오류 메시지가 표시됩니다.

GuidAttribute 선언이 프로젝트의 AssemblyInfo.cs 또는 AssemblyInfo.vb 파일에 있으며 이 특성이 유효한 GUID로 설정되어 있는지 확인합니다.

EnableVbaCallers 또는 ReferenceAssemblyFromVbaProject 속성을 설정하면 AssemblyVersionAttribute에 지정된 버전 번호가 올바르지 않음을 알리는 오류 메시지가 표시됩니다.

프로젝트의 AssemblyInfo.cs 또는 AssemblyInfo.vb 파일에 있는 AssemblyVersionAttribute 선언이 올바른 어셈블리 버전 번호로 설정되어 있는지 확인합니다. 올바른 어셈블리 버전 번호에 대한 자세한 내용은 AssemblyVersionAttribute 클래스를 참조하십시오.

사용자 지정 어셈블리의 이름을 바꾸면 사용자 지정 어셈블리를 호출하는 VBA 코드의 작동이 중지됩니다.

사용자 지정 어셈블리를 VBA 코드에 노출한 후 해당 사용자 지정 어셈블리의 이름을 바꾸면 문서의 VBA 프로젝트와 사용자 지정 어셈블리 간의 연결이 끊어집니다. 이 문제를 해결하려면 프로젝트의 ReferenceFromVbaAssembly 속성을 False로 변경한 다음 다시 True로 설정하고 VBA 코드의 이전 어셈블리 이름에 대한 참조를 새 어셈블리 이름으로 바꿉니다.

참고 항목

작업

방법: Visual Basic 프로젝트에서 VBA로 코드 노출

방법: Visual C# 프로젝트에서 VBA로 코드 노출

연습: Visual Basic 프로젝트에서 VBA의 코드 호출

연습: Visual C# 프로젝트에서 VBA의 코드 호출

개념

Office 솔루션 게시

기타 리소스

VBA 및 문서 수준 사용자 지정 결합

문서 수준 사용자 지정 프로그래밍