다음을 통해 공유


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

이 연습은 통합 문서의 비주얼 베이직 포 애플리케이션(VBA) 코드에서 Microsoft Office Excel에 대한 문서 수준의 사용자 지정에서 메서드를 호출하는 방법을 단계별로 설명합니다. 이 절차에는 호스트 항목 클래스에 메서드를 Sheet1 추가하고, 통합 문서의 VBA 코드에 메서드를 공개한 다음, 통합 문서의 VBA 코드에서 메서드를 호출하는 세 가지 기본 단계가 포함됩니다.

적용 대상: 이 항목의 정보는 Excel 및 Word용 문서 수준 프로젝트에 적용됩니다. 자세한 내용은 Office 응용 프로그램 및 프로젝트 유형에서 사용할 수 있는 기능을 참조하세요.

이 연습에서는 특히 Excel을 사용하지만 연습에서 보여 준 개념은 Word의 문서 수준 프로젝트에도 적용할 수 있습니다.

이 연습에서는 다음 작업을 수행합니다.

  • VBA 코드가 포함된 통합 문서 만들기

  • Excel의 보안 센터를 사용하여 통합 문서의 위치를 신뢰합니다.

  • Sheet1 호스트 항목 클래스에 메서드를 추가합니다.

  • 호스트 항목 클래스에 Sheet1 대한 인터페이스 추출

  • VBA 코드에 메서드 노출

  • VBA 코드에서 메서드 호출

비고

일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 Visual Studio IDE 개인 설정을 참조하세요.

필수 조건

이 연습을 완료하려면 다음 구성 요소가 필요합니다.

VBA 코드가 포함된 통합 문서 만들기

첫 번째 단계는 간단한 VBA 매크로를 포함하는 매크로 사용 통합 문서를 만드는 것입니다. VBA에 대한 사용자 지정의 코드를 노출하려면 통합 문서에 이미 VBA 코드가 포함되어 있어야 합니다. 그렇지 않으면 Visual Studio에서 VBA 프로젝트를 수정하여 VBA 코드가 사용자 지정 어셈블리를 호출할 수 있도록 할 수 없습니다.

사용하려는 VBA 코드가 포함된 통합 문서가 이미 있는 경우 이 단계를 건너뛸 수 있습니다.

VBA 코드가 포함된 통합 문서를 만들려면

  1. Excel을 시작합니다.

  2. 현재 문서를 WorkbookWithVBA라는 이름으로 Excel Macro-Enabled 통합 문서(*.xlsm)로 저장합니다. 바탕 화면과 같은 편리한 위치에 저장합니다.

  3. 리본에서 [개발자 ] 탭을 클릭합니다.

    비고

    개발자 탭이 표시되지 않으면 먼저 표시해야 합니다. 자세한 내용은 방법: 리본에 개발자 탭 표시를 참조하세요.

  4. 코드 그룹에서 Visual Basic을 클릭합니다.

    Visual Basic Editor가 열립니다.

  5. 프로젝트 창에서 ThisWorkbook을 두 번 클릭합니다.

    개체의 ThisWorkbook 코드 파일이 열립니다.

  6. 코드 파일에 다음 VBA 코드를 추가합니다. 이 코드는 아무 작업도 수행하지 않는 간단한 함수를 정의합니다. 이 함수의 유일한 목적은 VBA 프로젝트가 통합 문서에 있는지 확인하는 것입니다. 이 작업은 이 연습의 이후 단계에 필요합니다.

    Sub EmptySub()
    End Sub
    
  7. 문서를 저장하고 Excel을 종료합니다.

프로젝트를 만듭니다.

이제 앞에서 만든 매크로 사용 통합 문서를 사용하는 Excel용 문서 수준 프로젝트를 만들 수 있습니다.

새 프로젝트를 만들려면

  1. Visual Studio를 시작합니다.

  2. [파일] 메뉴에서 [새로 만들기]를 가리킨 다음 [프로젝트]를 클릭합니다.

  3. 서식 파일 창에서 Visual C#을 확장한 다음 Office/SharePoint를 확장합니다.

  4. Office 추가 기능 노드를 선택합니다.

  5. 프로젝트 템플릿 목록에서 Excel 2010 통합 문서 또는 Excel 2013 통합 문서 프로젝트를 선택합니다.

  6. 이름 상자에 CallingCodeFromVBA를 입력합니다.

  7. OK를 클릭합니다.

    Visual Studio Tools for Office 프로젝트 마법사가 열립니다.

  8. 기존 문서 복사를 선택하고 기존 문서 상자의 전체 경로에서 이전에 만든 WorkbookWithVBA 통합 문서의 위치를 지정합니다. 매크로 사용 통합 문서를 사용하는 경우 해당 통합 문서의 위치를 대신 지정합니다.

  9. 완료를 클릭합니다.

    Visual Studio는 디자이너에서 WorkbookWithVBA 통합 문서를 열고 솔루션 탐색기에CallingCodeFromVBA 프로젝트를 추가합니다.

통합 문서의 위치 신뢰

솔루션의 코드를 통합 문서의 VBA 코드에 노출하려면 먼저 통합 문서의 VBA를 신뢰하여 실행해야 합니다. 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 이 연습에서는 Excel의 보안 센터에서 통합 문서의 위치를 신뢰하여 이 작업을 수행합니다.

통합 문서의 위치를 신뢰하려면

  1. Excel을 시작합니다.

  2. 파일 탭을 클릭합니다.

  3. Excel 옵션 단추를 클릭합니다.

  4. 범주 창에서 보안 센터를 클릭합니다.

  5. 세부 정보 창에서 보안 센터 설정을 클릭합니다.

  6. 범주 창에서 신뢰할 수 있는 위치를 클릭합니다.

  7. 세부 정보 창에서 새 위치 추가를 클릭합니다.

  8. Microsoft Office 신뢰할 수 있는 위치 대화 상자에서 CallingCodeFromVBA 프로젝트가 포함된 폴더를 찾습니다.

  9. 이 위치의 하위 폴더 선택도 신뢰할 수 있습니다.

  10. Microsoft Office 신뢰할 수 있는 위치 대화 상자에서 확인을 클릭합니다.

  11. 보안 센터 대화 상자에서 확인을 클릭합니다.

  12. Excel 옵션 대화 상자에서 확인을 클릭합니다.

  13. Excel을 종료 합니다.

Sheet1 클래스에 메서드 추가

이제 VBA 프로젝트가 설정되었으므로 VBA 코드에서 호출할 Sheet1 수 있는 공용 메서드를 호스트 항목 클래스에 추가합니다.

Sheet1 클래스에 메서드를 추가하려면

  1. 솔루션 탐색기에서 Sheet1.cs 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다.

    Sheet1.cs 파일이 코드 편집기에서 열립니다.

  2. 클래스에 다음 코드를 추가합니다 Sheet1 . 메서드는 CreateVstoNamedRange 지정된 범위에 새 NamedRange 개체를 만듭니다. 이 메서드는 NamedRangeSelected 이벤트에 대한 이벤트 처리기도 생성합니다. 워크스루 후반부에서, 문서의 VBA 코드로부터 CreateVstoNamedRange 메서드를 호출할 것입니다.

    private Microsoft.Office.Tools.Excel.NamedRange namedRange1;
    
    public void CreateVstoNamedRange(Excel.Range range, string name)
    {
        if (!this.Controls.Contains(name))
        {
            namedRange1 = this.Controls.AddNamedRange(range, name);
            namedRange1.Selected += new Excel.DocEvents_SelectionChangeEventHandler(
                    namedRange1_Selected);
        }
        else
        {
            MessageBox.Show("A named range with this specific name " +
                "already exists on the worksheet.");
        }
    }
    
    private void namedRange1_Selected(Microsoft.Office.Interop.Excel.Range Target)
    {
        MessageBox.Show("This named range was created by Visual Studio " +
            "Tools for Office.");
    }
    
  3. 다음 메서드를 Sheet1 클래스에 추가합니다. 이 메서드는 GetAutomationObject 메서드를 재정의하여 Sheet1 클래스의 현재 인스턴스를 반환합니다.

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. 클래스 선언의 첫 번째 줄 앞에 다음 특성을 적용합니다 Sheet1 . 이러한 특성은 클래스 인터페이스를 생성하지 않고 COM에 클래스를 표시합니다.

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    

Sheet1 클래스에 대한 인터페이스 추출

VBA 코드에 메서드를 CreateVstoNamedRange 노출하려면 먼저 이 메서드를 정의하는 공용 인터페이스를 만들어야 하며 이 인터페이스를 COM에 노출해야 합니다.

Sheet1 클래스에 대한 인터페이스를 추출하려면

  1. Sheet1.cs 코드 파일에서 클래스의 Sheet1 아무 곳이나 클릭합니다.

  2. 리팩터링 메뉴에서 인터페이스 추출을 클릭합니다.

  3. 인터페이스 추출 대화 상자의 폼 인터페이스에 사용할 공용 멤버 선택 상자에서 메서드의 항목을 CreateVstoNamedRange 클릭합니다.

  4. OK를 클릭합니다.

    Visual Studio는 ISheet1라는 이름의 새 인터페이스를 생성하고, Sheet1 클래스의 정의를 수정하여 ISheet1 인터페이스를 구현합니다. 또한 Visual Studio는 코드 편집기에서 ISheet1.cs 파일을 엽니다.

  5. ISheet1.cs 파일에서 인터페이스 선언을 ISheet1 다음 코드로 바꿉니다. 이 코드는 인터페이스를 ISheet1 공용으로 만들고, COM에 인터페이스를 ComVisibleAttribute 표시하도록 특성을 적용합니다.

    [System.Runtime.InteropServices.ComVisible(true)]
    public interface ISheet1
    {
        void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
    }
    
  6. 프로젝트를 빌드합니다.

VBA 코드에 메서드 노출

통합 문서의 VBA 코드에 CreateVstoNamedRange 메서드를 공개하려면, 호스트 항목의 Sheet1 속성을 True로 설정합니다.

VBA 코드에 메서드를 노출하려면

  1. 솔루션 탐색기에서 Sheet1.cs 두 번 클릭합니다.

    Designer에서 WorkbookWithVBA 파일이 열리고 Sheet1이 표시됩니다.

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

  3. 표시되는 메시지에서 확인을 클릭합니다.

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

VBA 코드에서 메서드 호출

이제 통합 문서의 VBA 코드에서 CreateVstoNamedRange 메서드를 호출할 수 있습니다.

비고

이 가이드에서는 VBA 코드를 통합 문서에 추가하면서 프로젝트를 디버깅합니다. Visual Studio는 빌드 출력 폴더의 문서를 기본 프로젝트 폴더의 문서 복사본으로 바꾸기 때문에 다음에 프로젝트를 빌드할 때 이 문서에 추가하는 VBA 코드를 덮어씁니다. VBA 코드를 저장하려면 프로젝트 폴더의 문서에 복사할 수 있습니다. 자세한 내용은 VBA 및 문서 수준 사용자 지정 결합을 참조하세요.

VBA 코드에서 메서드를 호출하려면

  1. F5 키를 눌러 프로젝트를 실행합니다.

  2. 개발자 탭의 코드 그룹에서 Visual Basic을 클릭합니다.

    Visual Basic Editor가 열립니다.

  3. 삽입 메뉴에서 모듈을 클릭합니다.

  4. 새 모듈에 다음 코드를 추가합니다.

    이 코드는 CreateTable 사용자 지정 어셈블리에서 메서드를 호출합니다. 매크로는 전역 GetManagedClass 메서드를 사용하여 VBA 코드에 공개한 호스트 항목 클래스에 액세스하여 이 메서드에 Sheet1 액세스합니다. 이 연습의 이전 단계에서 GetManagedClass 메서드를 자동으로 생성했고, ReferenceAssemblyFromVbaProject 속성을 설정하였습니다.

    Sub CallVSTOMethod()
        Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
        Set VSTOSheet1 = GetManagedClass(Sheet1)
        Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
    End Sub
    
  5. F5 누릅니다.

  6. 열려 있는 통합 문서에서 Sheet1셀 A1을 클릭합니다. 메시지 상자가 표시되는지 확인합니다.

  7. 변경 내용을 저장하지 않고 Excel을 종료합니다.

다음 단계

다음 항목에서는 VBA에서 Office 솔루션의 코드 호출에 대해 자세히 알아볼 수 있습니다.