【问题标题】:Close Excel Workbook If Test for Open Returns False如果打开测试返回 False,则关闭 Excel 工作簿
【发布时间】: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


    【解决方案1】:

    经过大量的修补,我确切地发现了我的问题 - 我没有关闭打开的文件流

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 2013-02-10
      • 1970-01-01
      • 2018-02-26
      相关资源
      最近更新 更多