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

いくつかの例を見てきましたが、どこが間違っているのかわかりません。この件に関して多くの質問があるように見えるので、これは私を驚かせます。これが解決/対処されている場所、または私が具体的に間違っていることへのポインタをいただければ幸いです。

ありがとう!

4

1 に答える 1

0

驚いたことに、実際には数十のExcelインスタンスがバックグラウンドで実行されていることがわかりました。デバッグ中にCOMを起動すると、Excelの最初のインスタンスが起動します。2つ目は、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
于 2013-03-21T05:42:11.697 に答える