【发布时间】:2016-10-31 07:24:53
【问题描述】:
我构建了一个 VB.Net 应用程序,它将数据加载到 Excel 电子表格中。该应用程序工作正常,但我添加了一个功能来测试工作簿是否打开,如果是,则应用程序终止。否则,如果工作簿未打开,则用户可以继续在应用程序中填写信息。我的问题是,当工作表未打开时,由于工作簿“以某种方式打开”,我的代码会爆炸。我需要关闭所有进程,然后继续。这是我检查工作簿是否打开的代码:
第一个,我的模块,它设置了一个布尔检查:
Public Module ExcelCheck
Public Function Test(ByRef sName As String) As Boolean
Dim fs As FileStream
Try
fs = File.Open(sName, FileMode.Open, FileAccess.Read, FileShare.None)
Test = False
Catch ex As Exception
Test = True
End Try
End Function
End Module
然后是我的处理程序,用于执行检查的表单上的按钮:
Private Sub btnOpenFileCheck_Click(sender As Object, e As EventArgs) Handles btnOpenFileCheck.Click
'Evaluate if the workbook is being used:
Dim bExist As Boolean
bExist = Test("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines.xls")
If bExist = True Then
MessageBox.Show("The file is open... Please try again later.", "EXCEL FILE IN USE: Abort", MessageBoxButtons.OK)
Me.Close()
Else bExist = False
MessageBox.Show("The file is NOT open... You may proceed...", "EXCEL FILE NOT OPEN", MessageBoxButtons.OK)
Dim xlOpenItem As New Excel.Application
Dim xlOpenWB As Excel.Workbook = xlOpenItem.Workbooks.Open("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines")
xlOpenWB.Close(SaveChanges:=False, Filename:="\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines.xls", RouteWorkbook:=False)
txtCPUSerial.Focus()
End If
End Sub
当书没有打开时会发生什么是通过插图继续运行的正确对话框:
但随后会出现一个 Excel 对话框,内容如下:
'\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines.xls' 目前正在使用中。请稍后再试。
然后,它终于爆炸了,我有引用的行:
Dim xlOpenWB As Excel.Workbook = xlOpenItem.Workbooks.Open("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines")
我的逻辑是我需要有一个 Excel 对象的打开实例,然后关闭该实例以终止任何无意运行的进程。我实际上在另一个提交处理程序中打开了工作簿,Excel 对象和变量设置得很好,但这不是我的问题。我怎样才能顺利确保工作簿对象在此处关闭,以免引发不是它的异常?
【问题讨论】:
标签: vb.net excel com excel-interop