关闭 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() 会发生什么,它成功了。没有更多的爆炸!希望这可以帮助可能遇到类似文件流问题的其他人。