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 的第一个实例就会启动。第二个是在我打开 windows 窗体(加载项的主要部分)时启动的。

我不知道的是,当抛出异常并且我在 Visual Studio 中停止操作时,只有 Excel 的第一个实例被关闭。我有尝试清理 Excel 的打开应用程序的代码,但由于引发了异常,因此当然没有达到。

在这里,我一直在想,当我的事情更发展一些时,我会把错误处理放得更远一些。显然,我需要在构建过程的早期解决一些基本的错误处理。我完全是自学成才,不知何故做了三年,这不是问题。

希望其他没有被教导过的人可以在拔头发 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 回答