연습: VBA에서 응용 프로그램 수준 추가 기능의 코드 호출
업데이트: 2007년 11월
적용 대상 |
---|
이 항목의 정보는 지정된 Visual Studio Tools for Office 프로젝트 및 Microsoft Office 버전에만 적용됩니다. 프로젝트 형식
Microsoft Office 버전
자세한 내용은 응용 프로그램 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하십시오. |
이 연습에서는 VBA(Visual Basic for Applications) 및 COM 추가 기능을 포함하여 다른 Microsoft Office 솔루션에 응용 프로그램 수준 추가 기능의 개체를 노출하는 방법을 보여 줍니다.
이 연습에서는 Excel만 사용하지만 연습에서 보여 주는 기본 개념은 Visual Studio Tools for Office에서 제공하는 모든 추가 기능 프로젝트에 적용됩니다.
이 연습에서는 다음 작업을 수행합니다.
다른 Office 솔루션에 노출할 수 있는 클래스 정의
다른 Office 솔루션에 클래스 노출
VBA 코드에서 클래스의 메서드 호출
참고: |
---|
다음 지침처럼 컴퓨터에서 Visual Studio 사용자 인터페이스 요소 일부에 대한 이름이나 위치를 다르게 표시할 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 Visual Studio 설정을 참조하십시오. |
사전 요구 사항
이 연습을 완료하려면 다음 구성 요소가 필요합니다.
Visual Studio Tools for Office(Visual Studio 2008 Professional 및 Visual Studio Team System의 선택적 구성 요소)
Microsoft Office Excel 2007
참고: Microsoft Office Excel 2003을 사용하여 이 연습을 수행할 수도 있습니다. 그러나 몇몇 단계에서는 Excel 2007의 리본 메뉴를 사용하는 것으로 가정합니다.
Visual Studio Tools for Office는 기본적으로 나열된 Visual Studio 버전과 함께 설치됩니다. 설치 여부를 확인하려면 Visual Studio Tools for Office 설치를 참조하십시오.
비디오 데모를 보려면 Video How to: Calling Code in an Application-Level Add-in from VBA를 참조하십시오.
추가 기능 프로젝트 만들기
첫 번째 단계에서는 Excel용 추가 기능 프로젝트를 만듭니다.
새 프로젝트를 만들려면
2007 Microsoft Office system용 Excel 추가 기능 프로젝트 템플릿을 사용하여 ExcelImportData라는 Excel 추가 기능 프로젝트를 만듭니다. 자세한 내용은 방법: Visual Studio Tools for Office 프로젝트 만들기를 참조하십시오.
Visual Studio에서 ThisAddIn.cs 또는 ThisAddIn.vb 코드 파일이 열리고 솔루션 탐색기에 ExcelImportData 프로젝트가 추가됩니다.
다른 Office 솔루션에 노출할 수 있는 클래스 정의
이 연습의 목록은 VBA 코드에서 추가 기능의 AddInUtilities라는 클래스의 iImportData 메서드를 호출하기 위한 것입니다. 이 메서드는 활성 통합 문서의 새 워크시트로 데이터를 가져오고 데이터를 포함할 간단한 DataSet을 만듭니다.
다른 Office 솔루션에 AddInUtilities 클래스를 노출하려면 클래스를 공용으로 설정하고 COM에 표시해야 합니다. 클래스의 IDispatch 인터페이스를 노출하는 방법도 지정해야 합니다. 다음 절차의 코드에서는 요구 사항을 충복하는 한 가지 방법을 보여 줍니다. 자세한 내용은 다른 Office 솔루션에서 응용 프로그램 수준 추가 기능의 코드 호출을 참조하십시오.
다른 Office 솔루션에 노출할 수 있는 클래스를 정의하려면
프로젝트 메뉴에서 클래스 추가를 클릭합니다.
새 항목 추가 대화 상자에서 새 컨트롤의 이름을 AddInUtilities로 바꾸고 추가를 클릭합니다.
AddInUtilities.cs 또는 AddInUtilities.vb 파일이 코드 편집기에서 열립니다.
다음 문을 파일의 맨 위에 추가합니다.
Imports System.Data Imports System.Runtime.InteropServices Imports Excel = Microsoft.Office.Interop.Excel
using System.Data; using System.Runtime.InteropServices; using Excel = Microsoft.Office.Interop.Excel;
빈 AddInUtilities 클래스 선언을 다음 코드로 바꿉니다.
이 코드는 AddInUtilities 클래스에 COM에 표시되도록 하고 해당 클래스에 ImportData 메서드를 추가합니다. IDispatch 인터페이스를 노출하기 위해 AddInUtilities 클래스에서도 InterfaceIsIDispatch 특성이 있는 인터페이스를 구현합니다.
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _ <System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _ Public Interface IAddInUtilities Sub ImportData() End Interface <System.Runtime.InteropServices.ComVisibleAttribute(True)> _ <System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _ Public Class AddInUtilities Implements IAddInUtilities Public Sub ImportData() Implements IAddInUtilities.ImportData ' Create a new DataTable. Dim ds As New DataSet() Dim dt As DataTable = ds.Tables.Add("Customers") dt.Columns.Add(New DataColumn("LastName")) dt.Columns.Add(New DataColumn("FirstName")) ' Add a new row to the DataTable. Dim dr As DataRow = dt.NewRow() dr("LastName") = "Chan" dr("FirstName") = "Gareth" dt.Rows.Add(dr) ' Add a new XML map to the collection. Dim activeWorkbook As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook Dim xmlMap1 As Excel.XmlMap = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), _ "NewDataSet") ' Import the data. If Not (xmlMap1 Is Nothing) Then Dim lastSheet As Object = activeWorkbook.Sheets(activeWorkbook.Sheets.Count) Dim newSheet As Excel.Worksheet = CType(activeWorkbook.Sheets.Add( _ After:=lastSheet), Excel.Worksheet) newSheet.Name = "Imported Data" activeWorkbook.XmlImportXml(ds.GetXml(), xmlMap1, True, _ newSheet.Range("A1")) End If End Sub End Class
[System.Runtime.InteropServices.ComVisibleAttribute(true)] [System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IAddInUtilities { void ImportData(); } [System.Runtime.InteropServices.ComVisibleAttribute(true)] [System.Runtime.InteropServices.ClassInterface(ClassInterfaceType.None)] public class AddInUtilities : IAddInUtilities { public void ImportData() { // Create a new DataTable. DataSet ds = new DataSet(); DataTable dt = ds.Tables.Add("Customers"); dt.Columns.Add(new DataColumn("LastName")); dt.Columns.Add(new DataColumn("FirstName")); // Add a new row to the DataTable. DataRow dr = dt.NewRow(); dr["LastName"] = "Chan"; dr["FirstName"] = "Gareth"; dt.Rows.Add(dr); // Add a new XML map to the collection. Excel.Workbook activeWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook; Excel.XmlMap xmlMap1 = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), "NewDataSet"); // Import the data. if (xmlMap1 != null) { object lastSheet = activeWorkbook.Sheets[activeWorkbook.Sheets.Count]; Excel.Worksheet newSheet = (Excel.Worksheet)activeWorkbook.Sheets.Add( System.Type.Missing, lastSheet, 1, System.Type.Missing); newSheet.Name = "Imported Data"; activeWorkbook.XmlImportXml(ds.GetXml(), out xmlMap1, true, newSheet.get_Range("A1", System.Type.Missing)); } } }
다른 Office 솔루션에 클래스 노출
다른 Office 솔루션에 AddInUtilities 클래스를 노출하려면 ThisAddIn 클래스의 RequestComAddInAutomationService 메서드를 재정의합니다. 재정의에서 AddInUtilities 클래스의 인스턴스를 반환합니다.
다른 Office 솔루션에 AddInUtilities 클래스를 노출하려면
솔루션 탐색기에서 Excel을 확장합니다.
ThisAddIn.cs 또는 ThisAddIn.vb를 마우스 오른쪽 단추로 클릭하고 코드 보기를 클릭합니다.
ThisAddIn 클래스에 다음 코드를 추가합니다.
Private utilities As AddInUtilities Protected Overrides Function RequestComAddInAutomationService() As Object If utilities Is Nothing Then utilities = New AddInUtilities() End If Return utilities End Function
private AddInUtilities utilities; protected override object RequestComAddInAutomationService() { if (utilities == null) utilities = new AddInUtilities(); return utilities; }
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
솔루션이 오류 없이 빌드되는지 확인합니다.
추가 기능 테스트
다른 여러 형식의 Office 솔루션에서 AddInUtilities 클래스를 호출할 수 있습니다. 이 연습에서는 Excel 통합 문서의 VBA 코드를 사용합니다. 사용할 수 있는 다른 형식의 Office 솔루션에 대한 자세한 내용은 다른 Office 솔루션에서 응용 프로그램 수준 추가 기능의 코드 호출을 참조하십시오.
추가 기능을 테스트하려면
F5 키를 눌러 프로젝트를 실행합니다.
Excel에서 활성 통합 문서를 Excel 매크로 사용 통합 문서 (*.xlsm)로 저장합니다. 문서를 데스크톱 등의 편리한 위치에 저장합니다.
리본 메뉴에서 개발 도구 탭을 클릭합니다.
참고: 개발 도구 탭이 표시되지 않으면 먼저 이 탭을 표시해야 합니다. 자세한 내용은 방법: 리본 메뉴에 개발 도구 탭 표시를 참조하십시오.
코드 그룹에서 Visual Basic을 클릭합니다.
Visual Basic 편집기가 열립니다.
프로젝트 창에서 ThisWorkbook을 두 번 클릭합니다.
ThisWorkbook 개체의 코드 파일이 열립니다.
코드 파일에 다음 VBA 코드를 추가합니다. 이 코드는 먼저 ExcelImportData 추가 기능을 나타내는 COMAddIn 개체를 가져옵니다. 그런 다음 COMAddIn 개체의 Object 속성을 사용하여 ImportData 메서드를 호출합니다.
Sub CallVSTOMethod() Dim addIn As COMAddIn Dim automationbject As Object Set addIn = Application.COMAddIns("ExcelImportData") Set automationObject = addIn.Object automationObject.ImportData End Sub
F5 키를 누릅니다.
새 Imported Data 시트가 통합 문서에 추가되었는지 확인합니다. 또한 A1 셀에 Chan 문자열이 들어 있고 B1 셀에 Gareth 문자열이 들어 있는지 확인합니다.
Excel을 종료합니다.
다음 단계
다음 항목에서는 프로그래밍 추가 기능에 대해 자세히 배웁니다.
ThisAddIn 클래스를 사용하여 호스트 응용 프로그램을 자동화하고 추가 기능 프로젝트의 다른 작업을 수행합니다. 자세한 내용은 응용 프로그램 수준 추가 기능 프로그래밍 및 추가 기능 호스트 항목을 참조하십시오.
2007 Microsoft Office system용 추가 기능의 사용자 지정 작업 창을 만듭니다. 자세한 내용은 사용자 지정 작업 창 개요 및 방법: 응용 프로그램에 사용자 지정 작업 창 추가를 참조하십시오.
2007 Microsoft Office system용 추가 기능의 리본 메뉴를 사용자 지정합니다. 자세한 내용은 리본 개요 및 방법: 리본 메뉴 사용자 지정 시작을 참조하십시오.
참고 항목
작업
방법: Visual Studio Tools for Office 프로젝트 만들기