2016-06-28 4 views
0

Я создал приложение VB.Net, которое загружает данные в электронную таблицу Excel. Приложение работает отлично, но я добавил функциональность, чтобы проверить, является ли рабочая книга открытой, и если это так, приложение завершается. В противном случае, если рабочая книга не открыта, пользователь может продолжить заполнять информацию в приложении. Моя проблема в том, что когда рабочий лист не открыт, мой код взрывается из-за того, что рабочая книга «как-то открыта». Мне нужно закрыть любые процессы, а затем продолжить. Вот мой код для проверки, если книга открыта или нет:Закройте книгу Excel, если Test for Open Returns False

первых, мой модуль, который устанавливает логическую проверку:

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 \ Pete \ Desktop \ TestUnits \ Machines.xls' в настоящее время используется. Попробуйте позже.

Затем, он, наконец, взрывается, и у меня есть строка ссылка:

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

enter image description here

Моя логика такова, что мне нужно иметь открытый экземпляр объекта Excel, то близко, что чтобы прервать любой непреднамеренный текущий процесс. Я действительно открываю книгу в другом обработчике отправки, при этом объекты Excel и переменные задаются хорошо, но это не моя проблема. Как можно плавно убедитесь, что объект рабочей книги закрыт здесь, чтобы исключить исключение, которое не является?

ответ

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(), и он сделал трюк. Больше никаких взрывов! Надеюсь, что это поможет кому-то другому, кто может бороться с подобной проблемой потока файлов.