关闭 Excel 工作簿如果测试打开 Returns 错误
Close Excel Workbook If Test for Open Returns False
我构建了一个 VB.Net 应用程序,可以将数据加载到 Excel 电子表格中。该应用程序运行良好,但我添加了一个功能来测试工作簿是否打开,如果打开,应用程序将终止。否则,如果工作簿未打开,则用户可以继续在应用程序中填写信息。我的问题是,当工作表未打开时,由于工作簿 "somehow opened." 我的代码崩溃,我需要关闭所有进程,然后继续。这是我检查工作簿是否打开的代码:
1st,我的模块,它设置了布尔检查:
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 对象和变量设置得很好,但这不是我的问题。我怎样才能顺利确保工作簿对象在这里关闭,以免抛出它不是的异常?
经过多次修改后,我确切地发现了我的问题所在 - 我没有关闭打开的文件流:
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
fs.Close() 'This closes out the initially opened file stream for checking.
Catch ex As Exception
Test = True
End Try
End Function
End Module
我最终回到了模块,想知道如果我关闭并使用 fs.Close()
会发生什么,它成功了。没有更多的爆炸!希望这可以帮助可能遇到类似文件流问题的其他人。
我构建了一个 VB.Net 应用程序,可以将数据加载到 Excel 电子表格中。该应用程序运行良好,但我添加了一个功能来测试工作簿是否打开,如果打开,应用程序将终止。否则,如果工作簿未打开,则用户可以继续在应用程序中填写信息。我的问题是,当工作表未打开时,由于工作簿 "somehow opened." 我的代码崩溃,我需要关闭所有进程,然后继续。这是我检查工作簿是否打开的代码:
1st,我的模块,它设置了布尔检查:
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 对象和变量设置得很好,但这不是我的问题。我怎样才能顺利确保工作簿对象在这里关闭,以免抛出它不是的异常?
经过多次修改后,我确切地发现了我的问题所在 - 我没有关闭打开的文件流:
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
fs.Close() 'This closes out the initially opened file stream for checking.
Catch ex As Exception
Test = True
End Try
End Function
End Module
我最终回到了模块,想知道如果我关闭并使用 fs.Close()
会发生什么,它成功了。没有更多的爆炸!希望这可以帮助可能遇到类似文件流问题的其他人。