다음을 통해 공유


연습: VSTO 추가 기능 프로젝트에서 런타임 시 컨트롤을 워크시트에 추가

Excel VSTO 추가 기능을 사용하여 열려 있는 워크시트에 컨트롤을 추가할 수 있습니다. 이 연습에서는 리본 메뉴를 사용하여 사용자가 Button, NamedRangeListObject를 워크시트에 추가할 수 있도록 하는 방법을 보여 줍니다. 자세한 내용은 런타임 시 Office 문서에 컨트롤 추가를 참조하세요.

적용 대상: 이 항목의 정보는 Excel의 VSTO 추가 기능 프로젝트에 적용됩니다. 자세한 내용은 Features Available by Office Application and Project Type을 참조하세요.

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

  • 워크시트에 컨트롤을 추가하는 UI(사용자 인터페이스) 제공

  • 워크시트에 컨트롤 추가

  • 워크시트에서 컨트롤 제거

    참고 항목

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

필수 조건

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

새 Excel VSTO 추가 기능 프로젝트 만들기

먼저 Excel VSTO 추가 기능 프로젝트를 만듭니다.

새 Excel VSTO 추가 기능 프로젝트를 만들려면

  1. Visual Studio에서 이름이 ExcelDynamicControls인 Excel VSTO 추가 기능 프로젝트를 만듭니다. 자세한 내용은 How to: Create Office Projects in Visual Studio을 참조하세요.

  2. Microsoft.Office.Tools.Excel.v4.0.Utilities.dll 어셈블리에 대한 참조를 추가합니다. 이 참조는 이 연습의 뒷부분에서 프로그래밍 방식으로 워크시트에 Windows Forms 컨트롤을 추가하는 데 필요합니다.

워크시트에 컨트롤을 추가하는 UI 제공

Excel 리본 메뉴에 사용자 지정 탭을 추가합니다. 사용자는 탭에서 확인란을 선택하여 워크시트에 컨트롤을 추가할 수 있습니다.

워크시트에 컨트롤을 추가하는 UI를 제공하려면

  1. 프로젝트 메뉴에서 새 항목 추가를 클릭합니다.

  2. 새 항목 추가 대화 상자에서 리본(비주얼 디자이너)을 선택한 다음, 추가를 클릭합니다.

    Ribbon1.cs 또는 Ribbon1.vb라는 파일이 리본 디자이너에서 열리고 기본 탭과 그룹이 표시됩니다.

  3. 도구 상자Office 리본 컨트롤 탭에서 CheckBox 컨트롤을 group1끕니다.

  4. CheckBox1 을 클릭하여 선택합니다.

  5. 속성 창에서 다음 속성을 변경합니다.

    속성
    이름 버튼
    Label 버튼
  6. group1에 두 번째 확인란을 추가하고 다음 속성을 변경합니다.

    속성
    이름 Namedrange
    Label Namedrange
  7. group1에 세 번째 확인란을 추가한 다음, 다음 속성을 변경합니다.

    속성
    이름 Listobject
    Label Listobject

워크시트에 컨트롤 추가

관리되는 컨트롤은 컨테이너 역할을 하는 호스트 항목에만 추가할 수 있습니다. VSTO 추가 기능 프로젝트는 열려 있는 모든 통합 문서를 사용하기 때문에 컨트롤을 추가하기 전에 VSTO 추가 기능에서 워크시트를 호스트 항목으로 변환하거나 기존 호스트 항목을 가져옵니다. 각 컨트롤의 클릭 이벤트 처리기에 코드를 추가하여 열려 있는 워크시트를 기반으로 하는 Worksheet 호스트 항목을 생성합니다. 그런 다음 워크시트의 현재 선택 영역에 Button, NamedRangeListObject를 추가합니다.

워크시트에 컨트롤을 추가하려면

  1. 리본 디자이너에서 단추를 두 번 클릭합니다.

    단추 확인란의 Click 이벤트 처리기가 코드 편집기에서 열립니다.

  2. Button_Click 이벤트 처리기를 다음 코드로 바꿉니다.

    이 코드는 GetVstoObject 메서드를 사용하여 통합 문서의 첫 번째 워크시트를 나타내는 호스트 항목을 가져온 다음 현재 선택된 셀에 Button 컨트롤을 추가합니다.

    private void Button_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
        
        string buttonName = "MyButton";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                Microsoft.Office.Tools.Excel.Controls.Button button =
                    new Microsoft.Office.Tools.Excel.Controls.Button();
                worksheet.Controls.AddControl(button, selection, buttonName);
            }
        }
        else
        {
            worksheet.Controls.Remove(buttonName);
        }
    }
    
  3. 솔루션 탐색기에서 Ribbon1.cs 또는 Ribbon1.vb를 선택합니다.

  4. 보기 메뉴에서 디자이너를 클릭합니다.

  5. 리본 디자이너에서 NamedRange를 두 번 클릭합니다.

  6. NamedRange_Click 이벤트 처리기를 다음 코드로 바꿉니다.

    이 코드는 GetVstoObject 메서드를 사용하여 통합 문서의 첫 번째 워크시트를 나타내는 호스트 항목을 가져온 다음 현재 선택된 셀에 대한 NamedRange 컨트롤을 정의합니다.

    private void NamedRange_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
    
        string Name = "MyNamedRange";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddNamedRange(selection, Name);
            }
        }
        else
        {
            worksheet.Controls.Remove(Name);
        }
    }
    
  7. 리본 디자이너에서 ListObject를 두 번 클릭합니다.

  8. ListObject_Click 이벤트 처리기를 다음 코드로 바꿉니다.

    이 코드는 GetVstoObject 메서드를 사용하여 통합 문서의 첫 번째 워크시트를 나타내는 호스트 항목을 가져온 다음 현재 선택된 셀에 대한 ListObject를 정의합니다.

    private void ListObject_Click(object sender, RibbonControlEventArgs e)
    {
        Worksheet worksheet = Globals.Factory.GetVstoObject(
            Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
    
    
        string listObjectName = "MyListObject";
    
        if (((RibbonCheckBox)sender).Checked)
        {
            Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
            if (selection != null)
            {
                worksheet.Controls.AddListObject(selection, listObjectName);
            }
        }
        else
        {
            worksheet.Controls.Remove(listObjectName);
        }
    }
    
  9. 리본 코드 파일 맨 위에 다음 문을 추가합니다.

    using Excel = Microsoft.Office.Interop.Excel;
    using Microsoft.Office.Tools.Excel;
    using Microsoft.Office.Tools.Excel.Extensions;
    

워크시트에서 컨트롤 제거

워크시트를 저장하고 닫을 때 컨트롤은 유지되지 않습니다. 워크시트를 저장하기 전에 프로그래밍 방식으로 생성된 모든 Windows Forms 컨트롤을 제거해야 합니다. 그렇지 않으면 통합 문서를 다시 열 때 컨트롤의 윤곽만 나타납니다. 생성된 호스트 항목의 컨트롤 컬렉션에서 Windows Forms 컨트롤을 제거하는 코드를 WorkbookBeforeSave 이벤트에 추가합니다. 자세한 내용은 Office 문서에서 동적 컨트롤 유지를 참조하세요.

워크시트에서 컨트롤을 제거하려면

  1. 솔루션 탐색기에서 ThisAddIn.cs 또는 ThisAddIn.vb를 선택합니다.

  2. 보기 메뉴에서 코드를 클릭합니다.

  3. 다음 메서드를 ThisAddIn 클래스에 추가합니다. 이 코드는 통합 문서에서 첫 번째 워크시트를 가져온 다음 HasVstoObject 메서드를 사용하여 워크시트에 생성된 워크시트 개체가 있는지 여부를 확인합니다. 생성된 워크시트 개체에 컨트롤이 있는 경우 코드가 해당 워크시트 개체를 가져온 다음 컨트롤 컬렉션을 반복하고 컨트롤을 제거합니다.

           void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook workbook, 
               bool SaveAsUI, ref bool Cancel)
           {
               Excel.Worksheet worksheet =
                   workbook.Worksheets[1] as Excel.Worksheet;
               
               if (Globals.Factory.HasVstoObject(worksheet) && 
                   Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0)
               {
                   Worksheet vstoWorksheet = Globals.Factory.GetVstoObject(worksheet);
               
              
                   
                   while (vstoWorksheet.Controls.Count > 0)
                   {
                       object vstoControl = vstoWorksheet.Controls[0];
                       vstoWorksheet.Controls.Remove(vstoControl);
                   }
    
               }
           }
    
  4. C#에서는 WorkbookBeforeSave 이벤트에 대한 이벤트 처리기를 만들어야 합니다. ThisAddIn_Startup 메서드에 이 코드를 배치할 수 있습니다. 이벤트 처리기를 만드는 방법에 대한 자세한 내용은 방법: Office 프로젝트에서 이벤트 처리기 만들기를 참조하세요. ThisAddIn_Startup 메서드를 다음 코드로 바꿉니다.

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        this.Application.WorkbookBeforeSave += 
            new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler
                (Application_WorkbookBeforeSave);
    }
    

솔루션 테스트

리본의 사용자 지정 탭에서 선택하여 워크시트에 컨트롤을 추가합니다. 워크시트를 저장하면 이러한 컨트롤이 제거됩니다.

솔루션을 테스트하려면

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

  2. Sheet1에서 임의 셀을 선택합니다.

  3. 추가 기능 탭을 클릭합니다.

  4. group1 그룹에서 단추를 클릭합니다.

    선택한 셀에 단추가 나타납니다.

  5. Sheet1에서 다른 셀을 선택합니다.

  6. group1 그룹에서 NamedRange를 클릭합니다.

    선택한 셀에 대해 명명된 범위가 정의됩니다.

  7. Sheet1에서 일련의 셀을 선택합니다.

  8. group1 그룹에서 ListObject를 클릭합니다.

    선택한 셀에 대해 목록 개체가 추가됩니다.

  9. 워크시트를 저장합니다.

    Sheet1에 추가한 컨트롤이 더 이상 나타나지 않습니다.

다음 단계

다음 항목에서 Excel VSTO 추가 기능 프로젝트의 컨트롤에 대해 자세히 알아볼 수 있습니다.

  • 워크시트에 컨트롤을 저장하는 방법을 알아보려면 Office 개발 샘플 및 연습에서 Excel VSTO 추가 기능 동적 컨트롤 샘플을 참조하세요.