2013-03-20 24 views
0

我正打算在打开的工作簿中调用第5张表。当我打开从程序工作簿我似乎能够做到这一点:来自WorkBook的调用表

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 

我看了几个例子,但我不知道我要去哪里错了。这令我感到惊讶,因为在这个问题上似乎有很多问题。以太指示解决/解决这个问题的地方,或者我特别做错的东西,将不胜感激。

谢谢!

+0

你是什么意思 “失败”。你的意思是应用程序似乎忽略了你,或者你的意思是它会抛出异常? – JDB 2013-03-20 21:33:09

+0

@ Cyborgx37他们似乎都无视我/什么都不做。如果我得到一个异常,我会发布它。我尝试过使用它,如果我做一些愚蠢的事情,比如试图放置太大的索引(90),我可以摆脱索引错误。工作簿本身有10张,所以这不应该是一个问题。 – 2013-03-21 01:25:32

+0

@ Cyborgx37进一步调试,如果我根本没有打开工作表并且使用装载了excel的标准书(并删除索引或添加工作表),我得到以下异常:'无法投射类型为'的COM对象' System .__ ComObject'改为接口类型'Microsoft.Office.Interop.Excel.Workbook'。此操作失败,因为IID为“{000208DA-0000-0000-C000-000000000046}”的接口的COM组件上的QueryInterface调用由于以下错误而失败:没有此类接口支持(异常来自HRESULT:0x80004002(E_NOINTERFACE)) .' – 2013-03-21 01:38:19

回答

0

令我惊讶的是,我发现我实际上有几十个在后台运行的Excel实例。当我正在调试时,启动COM,第一个Excel实例启动。第二个是在打开窗体窗体(加载项的主要部分)时开始的。

我不知道的是,当抛出一个异常时,我停止了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