문서 수준 사용자 지정의 네이티브 Office 개체에서 확장 개체 가져오기

Office 이벤트에 대한 대부분의 이벤트 처리기에서는 이벤트가 발생한 통합 문서, 워크시트 또는 문서를 나타내는 네이티브 Office 개체를 받습니다. 때로는 문서 수준 사용자 지정의 통합 문서 또는 문서에서 이벤트가 발생한 경우에만 코드를 실행하려는 경우도 있습니다. 예를 들어 Excel용 문서 수준 사용자 지정에서 사용자가 사용자 지정된 통합 문서의 워크시트 중 하나를 활성화할 때만 코드를 실행하고 사용자가 동시에 열려 있는 다른 통합 문서의 워크시트를 활성화할 때는 코드를 실행하지 않을 수 있습니다.

네이티브 Office 개체가 있는 경우 해당 개체가 문서 수준 사용자 지정의 호스트 항목으로 확장되었는지 호스트 컨트롤로 확장되었는지를 테스트할 수 있습니다. 호스트 항목과 호스트 컨트롤은 Microsoft Visual Studio Tools for Office Runtime에서 제공하는 형식으로, Word 또는 Excel 개체 모델에 기본적으로 포함된 개체(네이티브 Office 개체)에 기능을 추가합니다. 호스트 항목과 호스트 컨트롤을 통틀어 확장 개체라고도 합니다. 호스트 항목과 호스트 컨트롤에 대한 자세한 내용은 호스트 항목 및 호스트 컨트롤 개요를 참조하십시오.

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

GetVstoObject 및 HasVstoObject 메서드 이해

네이티브 Office 개체를 테스트하려면 프로젝트에서 HasVstoObjectGetVstoObject 메서드를 사용합니다.

문서 수준 프로젝트에서는 런타임에 GetVstoObject 메서드를 사용하여 새 Microsoft.Office.Tools.Excel.Workbook, Microsoft.Office.Tools.Excel.Worksheet 또는 Microsoft.Office.Tools.Word.Document 호스트 항목을 만들 수 없습니다. 이 메서드는 디자인 타임에 프로젝트에 생성된 기존 호스트 항목에 액세스하려는 경우에만 사용할 수 있습니다. 런타임에 새 호스트 항목을 만들려면 응용 프로그램 수준 프로젝트를 개발해야 합니다. 자세한 내용은 호스트 항목 및 호스트 컨트롤의 프로그래밍에 대한 제한 사항런타임에 응용 프로그램 수준 추가 기능의 Word 문서 및 Excel 통합 문서 확장을 참조하십시오.

GetVstoObject 및 HasVstoObject 메서드 사용

HasVstoObjectGetVstoObject 메서드를 호출하는 방법은 프로젝트가 대상으로 하는 .NET Framework 버전에 따라 다릅니다.

참고

.NET Framework 3.5를 대상으로 하는 문서 수준 프로젝트에서 GetVstoObjectHasVstoObject 메서드를 사용하려면 코드 파일의 맨 위에 Microsoft.Office.Tools.Excel.Extensions 또는 Microsoft.Office.Tools.Word.Extensions 네임스페이스에 대한 using(C#의 경우) 또는 Imports(Visual Basic의 경우) 문을 추가해야 합니다. GetVstoObjectHasVstoObject 메서드는 확장 메서드로 구현되며 이러한 문은 해당 메서드를 호출할 수 있게 해 줍니다.

예제: 호스트 항목에서 이벤트가 발생했는지 확인

다음 코드 예제에서는 HasVstoObjectGetVstoObject 메서드를 보여 줍니다. 두 예제 모두 Excel 통합 문서 프로젝트에서 ThisWorkbook 클래스의 SheetActivate 이벤트를 처리합니다. 첫 번째 예제에서는 각 기본 호스트 항목의 InnerObject 속성과 Sh 매개 변수를 비교하여 Microsoft.Office.Tools.Excel.Worksheet 호스트 항목 중 하나가 활성화되었는지 여부를 확인합니다.

Sub ThisWorkbook_SheetActivate1(ByVal Sh As Object) Handles Me.SheetActivate
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing

    If Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet1.Base
    ElseIf Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet2.Base
    ElseIf Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet3.Base
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here.
    End If
End Sub
void ThisWorkbook_SheetActivate1(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;

    if (Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet1.Base;
    else if (Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet2.Base;
    else if (Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet3.Base;

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

다음 예제에서는 Sh 매개 변수의 HasVstoObjectGetVstoObject 메서드를 사용하여 이 과정을 간단하게 합니다. 이 예제에서는 .NET Framework 4를 대상으로 하는 프로젝트에서 이러한 메서드를 호출하는 방법을 보여 줍니다.

Private Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object)
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing
    Dim interopWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
        CType(Sh, Microsoft.Office.Interop.Excel.Worksheet)

    If interopWorksheet IsNot Nothing AndAlso
        Globals.Factory.HasVstoObject(interopWorksheet) Then
        vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet)
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here. 
    End If

End Sub
void ThisWorkbook_SheetActivate2(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;
    Microsoft.Office.Interop.Excel.Worksheet interopWorksheet =
        Sh as Microsoft.Office.Interop.Excel.Worksheet;

    if (interopWorksheet != null && Globals.Factory.HasVstoObject(interopWorksheet))
    {
        vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet);
    }

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

다음 예제에서는 .NET Framework 3.5를 대상으로 하는 프로젝트에서의 동일한 작업을 보여 줍니다.

Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object) Handles Me.SheetActivate
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing
    Dim interopWorksheet As Microsoft.Office.Interop.Excel.Worksheet = _
        CType(Sh, Microsoft.Office.Interop.Excel.Worksheet)

    If interopWorksheet IsNot Nothing AndAlso _
        interopWorksheet.HasVstoObject() Then
        vstoWorksheet = interopWorksheet.GetVstoObject()
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here.
    End If
End Sub
void ThisWorkbook_SheetActivate2(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;
    Microsoft.Office.Interop.Excel.Worksheet interopWorksheet = 
        Sh as Microsoft.Office.Interop.Excel.Worksheet;

    if (interopWorksheet != null && interopWorksheet.HasVstoObject())
    {
        vstoWorksheet = interopWorksheet.GetVstoObject();
    }

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

참고 항목

참조

확장 메서드(C# 프로그래밍 가이드)

개념

호스트 항목 및 호스트 컨트롤 개요

런타임에 응용 프로그램 수준 추가 기능의 Word 문서 및 Excel 통합 문서 확장

확장 메서드(Visual Basic)

기타 리소스

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