关闭Excel工作簿如果测试开放返回错误

时间:2016-06-28 19:53:11

标签: vb.net excel com excel-interop

我构建了一个VB.Net应用程序,它将数据加载到Excel电子表格中。该应用程序运行正常,但我添加了一项功能来测试工作簿是否为Open,如果是,则应用程序终止。否则,如果工作簿未打开,则用户可以继续填写应用程序中的信息。我的问题是,当工作表未打开时,由于工作簿正在以某种方式打开,我的代码会爆炸。"我需要关闭任何进程,然后继续。这是我的代码,用于检查工作簿是否已打开:

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

当书籍没有打开时会发生什么事情是通过插图继续运行的正确对话框:

enter image description here

但随后会出现一个Excel对话框,说明如下:

' \\ netshareA \ C $ \ Users \用户皮特\桌面\ TestUnits \ Machines.xls'  目前正在使用中。稍后再试。

然后,它最终爆炸,我有引用的行:

Dim xlOpenWB As Excel.Workbook = xlOpenItem.Workbooks.Open("\\netshareA\c$\Users\Pete\Desktop\TestUnits\Machines")

enter image description here

我的逻辑是我需要一个Excel对象的打开实例,然后关闭该实例以终止任何无意的运行进程。我实际上在另一个提交处理程序中打开工作簿,Excel对象和变量设置得很好,但这不是我的问题。我如何顺利确保此处关闭工作簿对象,以便不抛出它不是的例外?

1 个答案:

答案 0 :(得分:0)

经过多次修补后,我发现了我的问题 - 我没有关闭打开的文件流

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