2013-03-20 2 views
0

열려있는 통합 문서에서 5 번째 시트를 호출하려고합니다. 내가 프로그램에서 통합 문서를 열 때 나는 그것을 할 수있을 것 :워크 북에서 시트 호출

Dim CurrentRun As New Excel.Application 
Dim CurrentBook As Excel.Workbook 
Dim CurrentSheet As Excel.Worksheet 


Private Sub GeneralButtonOpener_Click(sender As Object, e As EventArgs) Handles GeneralButtonOpener.Click 

    CurrentRun.Visible = True 
    CurrentBook = CurrentRun.Workbooks.Add(MainTemplatePath) 
    CurrentSheet = CurrentBook.Worksheets(4) 
    CurrentSheet.Activate() 

End Sub 

그러나 내 모든 시도를 파일이 이미 열려이 실패하는 경우 시트를 호출에 :

Dim CurrentRun As Microsoft.Office.Interop.Excel.Application 
    Dim CurrentBook As Microsoft.Office.Interop.Excel.Workbook 
    Dim CurrentSheet As Microsoft.Office.Interop.Excel.Worksheet 

    CurrentRun = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") 
    CurrentBook = CurrentRun.Workbooks 
    CurrentSheet = CurrentBook.Sheets(4) 
    CurrentSheet.Activate() 

또는

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim CurrentRun As Microsoft.Office.Interop.Excel.Application 
    Dim CurrentBook As Excel.Workbook 
    Dim CurrentSheet As Excel.Worksheet 

    CurrentRun = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") 
    CurrentBook = CurrentRun.ActiveWorkbook 
    CurrentSheet = CurrentBook.Sheets(4) 
    CurrentSheet.Activate() 
End Sub 

몇 가지 예를 살펴 보았지만 잘못된 부분을 파악할 수 없습니다. 주제에 관해 많은 질문이있는 것처럼 보이는 것이 놀랍습니다. Ether이 해결되었거나 해결 된 곳 또는 특별히 잘못하고있는 부분에 대한 포인터가 인정 될 것입니다.

감사합니다.

+0

는 "실패". 응용 프로그램에서 사용자를 무시하는 것처럼 보이는지 또는 예외가 발생했음을 의미합니까? – JDB

+0

@ Cyborgx37 그들은 둘 다 나를 무시하거나 아무 것도하지 않는 것 같습니다. 예외가 생기면 게시 할 것입니다. 나는 그것으로 놀아 보려고 노력했다. 그리고 만약 내가 너무 바보 같은 인덱스 (90)를 넣으려는 것처럼 어리석은 짓을하다 보면 나는 인덱스 오류를 벗어날 수있다. 통합 문서 자체에는 10 개의 시트가 있으므로 문제가 될 수 없습니다. –

+0

@ Cyborgx37 더 이상의 디버깅으로 시트를 열지 않고 엑셀로로드 된 표준 책과 함께 (색인을 삭제하거나 시트를 추가하는 경우) 다음과 같은 예외가 발생합니다. '형식의 COM 객체를 캐스팅 할 수 없습니다' System .__ ComObject '를 인터페이스 유형'Microsoft.Office.Interop.Excel.Workbook '으로 변경합니다. 다음과 같은 오류로 인해 IID '{000208DA-0000-0000-C000-000000000046}'인터페이스의 COM 구성 요소에서 QueryInterface 호출이 실패했기 때문에이 작업이 실패했습니다. 해당 인터페이스가 지원되지 않습니다 (HRESULT : 0x80004002 (E_NOINTERFACE) 예외). .' –

답변

0

놀랍게도 실제로 수십 개의 Excel 인스턴스가 백그라운드에서 실행되고 있음을 발견했습니다. 디버깅을하고 COM을 시작하면 Excel의 첫 번째 인스턴스가 시작됩니다. 두 번째는 Windows 양식 (추가 기능의 주요 부분)을 열 때 시작됩니다.

내가 몰랐던 것은 예외가 발생했을 때 Visual Studio 내에서 작업을 중단하고 Excel의 첫 번째 인스턴스 만 닫혔습니다. Excel의 열린 응용 프로그램을 시도하고 정리하는 코드가 있지만 예외가 발생했기 때문에 도달하지 못했습니다.

그리고 여기서 나는 조금 더 발전된 오류가있을 때 오류 처리 비트를 길 아래에 넣을 것이라고 생각했습니다. 분명히 빌드 프로세스의 초기 단계에서 몇 가지 기본적인 오류 처리를 처리해야합니다. 나는 완전히 독학을하고 있으며 어떻게 든 문제없이 3 년을 보냈습니다.

누군가 14 시간 동안 머리카락을 꺼내기 전에 이것을 볼 수 있기를 바랍니다.

해결책 다른 모든 Excel 인스턴스를 닫으면 위 코드가 작동합니다. 오류 처리에서의 주소 정리 및 이전 주소 : http://support.microsoft.com/kb/317109 논란의 여지가 있지만 아마도 GC를 호출 할 수도 있습니다.

최종 코드 : 무슨 뜻 이죠

.... 
Imports System.Runtime.InteropServices 
.... 
Dim CurrentRun As New Excel.Application 
Dim CurrentBook As Excel.Workbook 
Dim CurrentSheet As Excel.Worksheet 
.... 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    On Error GoTo VortexInYourSoul 
    CurrentRun = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") 
    CurrentBook = CurrentRun.Workbooks(1) 
    CurrentRun.Visible = True 
    CurrentSheet = CurrentBook.Sheets(8) 
    CurrentSheet.Activate() 
    CurrentBook.ActiveSheet.name = "LLAMA LALA LLAMALMALMAL" 
    .... 
    Exit Sub 
VortexInYourSoul: 

    CurrentSheet = Nothing 
    CurrentBook.Close(False) 
    CurrentBook = Nothing 
    CurrentRun.Quit() 
    CurrentRun = Nothing 
    MsgBox("Error: " & Err.Description) 

    End Sub