다음을 통해 공유


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

두 가지 형tlr의 코드가 서로 상호 작용하도록 하기 위해 Visual C# 프로젝트의 코드를 VBA(Visual Basic for Applications) 코드에 노출할 수 있습니다.

Visual C# 프로세스는 Visual Basic 프로세스와 다릅니다. 자세한 내용은 방법: Visual Basic 프로젝트에서 VBA로 코드 노출을 참조하세요.

적용 대상: 이 항목의 정보는 Excel 및 Word의 문서 수준 프로젝트에 적용됩니다. 자세한 내용은 Office 애플리케이션 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하세요.

Visual C# 프로젝트에서 코드 노출

VBA 코드가 Visual C# 프로젝트에서 코드를 호출할 수 있게 하려면 COM에 표시되도록 코드를 수정한 다음, 디자이너에서 ReferenceAssemblyFromVbaProject 속성을 True로 설정합니다.

VBA에서 Visual C# 프로젝트의 메서드를 호출하는 방법을 보여 주는 연습은 연습: Visual C# 프로젝트의 VBA에서 코드 호출을 참조하세요.

Visual C# 프로젝트에서 VBA로 코드 노출하기

  1. 매크로를 지원하고 이미 VBA 코드가 포함된 Word 문서나 Excel 통합 문서 또는 Excel 템플릿을 기반으로 하는 문서 수준 프로젝트를 열거나 만듭니다.

    매크로를 지원하는 문서 파일 형식에 대한 자세한 내용은 VBA 및 문서 수준 사용자 지정 결합을 참조하세요.

    참고 항목

    이 기능은 Word 서식 파일 프로젝트에서 사용할 수 없습니다.

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

  3. VBA에 노출하려는 멤버를 프로젝트의 퍼블릭 클래스에 추가하고 새 멤버를 퍼블릭으로 선언합니다.

  4. VBA에 노출하는 클래스에 다음 ComVisibleAttribute 특성 및 ClassInterfaceAttribute 특성을 적용합니다. 이러한 특성은 클래스가 COM에 표시되도록 하지만 클래스 인터페이스를 생성하지 않습니다.

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    
  5. VBA에 노출할 클래스의 인스턴스를 반환하도록 프로젝트에서 호스트 항목 클래스의 GetAutomationObject 메서드를 재정의합니다.

    • 호스트 항목 클래스를 VBA에 노출하는 경우 이 클래스에 속하는 GetAutomationObject 메서드를 재정의하고 클래스의 현재 인스턴스를 반환합니다.

      protected override object GetAutomationObject()
      {
          return this;
      }
      
    • 호스트 항목이 아닌 클래스를 VBA에 노출하는 경우 프로젝트에 있는 모든 호스트 항목의 GetAutomationObject 메서드를 재정의하고 비 호스트 항목 클래스의 인스턴스를 반환합니다. 예를 들어 다음 코드에서는 DocumentUtilities라는 클래스를 VBA에 노출한다고 가정합니다.

      protected override object GetAutomationObject()
      {
          return new DocumentUtilities();
      }
      

      호스트 항목에 대한 자세한 내용은 호스트 항목 및 호스트 컨트롤 개요를 참조하세요.

  6. VBA에 노출하는 클래스에서 인터페이스를 추출합니다. 인터페이스 추출 대화 상자에서 인터페이스 선언에 포함할 퍼블릭 멤버를 선택합니다. 자세한 내용은 인터페이스 리팩터링 추출을 참조하세요.

  7. 인터페이스 선언에 public 키워드를 추가합니다.

  8. 다음 ComVisibleAttribute 특성을 인터페이스에 추가하여 인터페이스를 COM에 표시합니다.

    [System.Runtime.InteropServices.ComVisible(true)]
    
  9. Visual Studio의 디자이너에서 문서(Word용) 또는 워크시트(Excel용)를 엽니다.

  10. 속성 창에서 ReferenceAssemblyFromVbaProject 속성을 선택하고 값을 True로 변경합니다.

    참고 항목

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

  11. 표시되는 메시지에서 확인 을 클릭합니다. 이 메시지는 Visual Studio에서 프로젝트를 실행할 때 VBA 코드를 통합 문서나 문서에 추가하면 다음에 프로젝트를 빌드할 때 VBA 코드가 손실됨을 알려 줍니다. 프로젝트를 빌드할 때마다 빌드 출력 폴더의 문서를 덮어쓰기 때문입니다.

    이 시점에서 Visual Studio는 VBA 프로젝트가 어셈블리를 호출할 수 있도록 프로젝트를 구성합니다. 또한 Visual Studio는 GetManagedClass라는 메서드를 VBA 프로젝트에 추가합니다. VBA 프로젝트 어디에서나 이 메서드를 호출하여 VBA에 노출한 클래스에 액세스할 수 있습니다.

  12. 프로젝트를 빌드합니다.