Vb.net 从工作簿调用工作表

Vb.net 从工作簿调用工作表,vb.net,excel,excel-interop,excel-addins,Vb.net,Excel,Excel Interop,Excel Addins,我正在尝试调用打开工作簿中的第五页。当我从程序中打开工作簿时,我似乎能够做到: 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 GeneralButtonOpene

我正在尝试调用打开工作簿中的第五页。当我从程序中打开工作簿时,我似乎能够做到:

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()

我看了几个例子,但我不知道我错在哪里。这让我很惊讶,因为在这个问题上似乎有很多问题。如果能给我一个解决/解决问题的指针,或者我具体做错了什么,我将不胜感激


谢谢

令我大吃一惊的是,我发现我实际上有几十个Excel实例在后台运行。当我调试并启动COM时,Excel的第一个实例就会启动。第二个是在打开windows窗体(外接程序的主要部分)时启动的

我不知道的是,当抛出异常时,我从VisualStudio中停止操作,只有Excel的第一个实例被关闭。我有一些代码试图清理打开的Excel应用程序,但由于抛出了异常,当然没有到达

在这里,我一直在想,当我把事情发展得更成熟一点时,我会把错误处理放在后面一点。显然,我需要在构建过程中更早地解决一些基本的错误处理问题。我完全是自学成才的,不知何故,我三年来都没有遇到过这样的问题

希望其他没有受过教育的人在拔头发14小时之前能看到这一点

解决方案 关闭Excel的所有其他实例,上述代码即可工作。解决错误处理中的清理问题,以及在此之前解决的问题: 也可以称之为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

“失败”是什么意思。你是说应用程序似乎忽略了你,还是说它抛出了一个异常?@Cyborgx37他们似乎都忽略了我/什么也不做。如果我遇到异常,我会发布它。我试着玩弄它,如果我做了一些愚蠢的事情,比如尝试放置太大的索引(90),我会得到一个索引外错误。工作簿本身有10张工作表,所以这应该不是问题。@Cyborgx37,如果我根本不打开工作表,使用excel加载的标准手册(删除索引或添加工作表),则需要进一步调试我遇到以下异常:
无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Excel.Workbook”。此操作失败,因为对IID为“{000208DA-0000-0000-C000-0000000000 46}”的接口的COM组件的QueryInterface调用失败,原因是以下错误:不支持此类接口(HRESULT的异常:0x80004002(E_NOINTERFACE))。
....
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