vb.net获取有效的Excel工作簿的完整path和文件名

我有几天前的代码工作,但忘记保存工作副本。 我花了4个星期才find这个答案,不想再花那么多时间,所以…

除了objWorkBook行,它会返回错误信息:“variablesobjWorkBook”在被赋值之前被使用,这里的所有东西都可以工作,在运行时会产生一个空引用exception。

有什么build议么?

Dim objExcel As Excel.Application = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") Dim objWorkBook As Excel.Workbook Dim totalWorkBooks As Integer = objExcel.Workbooks.Count MsgBox(totalWorkBooks & " is Number of Open Workbooks") Dim ActiveBookIndex As Integer = objExcel.ActiveWindow.Index MsgBox(ActiveBookIndex & " is Active Window Index") Dim FullName As String = objWorkBook.FullName MsgBox(FullName & " is FullName") Dim OnlyName As String = objWorkBook.Name MsgBox(OnlyName & " is Name without the Path") 

我忘了我分配的价值。

我的目标是将已打开的Excel工作簿名称与已知位置的名称进行比较,如果匹配,我的程序就可以继续。 我需要上面的代码,所以我可以将它与If-Then中的以下代码进行比较,以便我的程序可以继续。

 Dim dir As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) Dim FullFileName As String = dir & "\My_File_Name.xlsx" 

积极的一面,我拼凑出一个解决scheme,即使这不是我正在寻找的答案….

 Dim p() As Process = System.Diagnostics.Process.GetProcessesByName("Excel") Dim Title As String = p(0).MainWindowTitle Dim dir As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) Dim FullFileName As String = dir & "\" & Replace(Title, "Microsoft Excel - ", "") & ".xlsx" MsgBox(dir) MsgBox(Title) MsgBox(FullFileName) 

这会现在工作,但我想以另一种方式解决它。

改变线

Dim objWorkBook As Excel.Workbook

Dim objWorkBook As Excel.Workbook = Nothing

此外,您的objWorkBook对象没有分配给任何东西之前,您正在尝试使用它在行Dim FullName As String = objWorkBook.FullName

这是你正在尝试?

 Imports Excel = Microsoft.Office.Interop.Excel Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim objExcel As Excel.Application = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") Dim objWorkBook As Excel.Workbook Dim totalWorkBooks As Integer = objExcel.Workbooks.Count MsgBox (totalWorkBooks & " is Number of Open Workbooks") Dim ActiveBookIndex As Integer = objExcel.ActiveWindow.Index MsgBox (ActiveBookIndex & " is Active Window Index") '~~> Set the workbook to say first workbook. '~~> You can use a loop here as well to loop through '~~> the workbooks count objWorkBook = objExcel.Workbooks(1) Dim FullName As String = objWorkBook.FullName MsgBox (FullName & " is FullName") Dim OnlyName As String = objWorkBook.Name MsgBox (OnlyName & " is Name without the Path") ' '~~> Rest of the code ' End Sub End Class 

编辑 :后续从评论

但是让我们说我已经打开了9个工作簿,我怎么让我的应用程序索引,操作,切换他们之间…不知道提前完整path和文件名?

 Imports Excel = Microsoft.Office.Interop.Excel Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim objExcel As Excel.Application = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") Dim objWorkBook As Excel.Workbook = Nothing Dim FullName As String = "" Dim OnlyName As String = "" Dim totalWorkBooks As Integer = objExcel.Workbooks.Count MsgBox (totalWorkBooks & " is Number of Open Workbooks") For i As Integer = 1 To totalWorkBooks objWorkBook = objExcel.Workbooks(i) With objWorkBook FullName = .FullName OnlyName = .Name MessageBox.Show (FullName & " is FullName and " & OnlyName & " is Name without the Path") ' '~~> Rest of the code here to manipulate the workbook. For example ' objWorkBook.Sheets(1).Range("A1").Value = "Blah Blah" ' End With Next i releaseObject (objExcel) releaseObject (objWorkBook) End Sub '~~> Release the objects Private Sub releaseObject(ByVal obj As Object) Try System.Runtime.InteropServices.Marshal.ReleaseComObject (obj) obj = Nothing Catch ex As Exception obj = Nothing Finally GC.Collect() End Try End Sub End Class