vb.net не может прочитать лист Excel, если лист открыт первым
У меня есть рабочая книга, открытая до загрузки моей формы.
используя VBA в Excel, этот код работает без ошибок:
wbListPath = "C:\WAREHOUSE CONTROL ----- DO NOT DELETE\"
wbListName = "WAREHOUSE CONTROL FORM ----- DO NOT DELETE.xlsm"
Set wbList = Application.Workbooks("WAREHOUSE CONTROL FORM ----- DO NOT DELETE.xlsm")
If Not BookOpen(wbList.Sheets("Directories").Cells(15, 3)) Then ' inventory master
wb2 = Workbooks.Open(wbList.Sheets("Directories").Cells(15, 2) & wbList.Sheets("Directories").Cells(15, 3)) 'Cambridge Master
Else
wbLkup = wbList.Sheets("Directories").Cells(15, 3).Text
Set wb2 = Application.Workbooks(wbLkup)
End If
Function BookOpen(strBookName As String) As Boolean
Dim oBk As Workbook
On Error Resume Next
Set oBk = Workbooks(strBookName)
On Error GoTo 0
If oBk Is Nothing Then
BookOpen = False
Else
BookOpen = True
End If
End Function
переключаясь на vb.net, я не могу заставить работать какой-либо код для обнаружения книги, которая была открыта до запуска form1, ближе всего я мог найти это:
Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
Dim WorkBookNames() As String = {TextBox1.Text, TextBox1.Text & " [Compatibility Mode]", "Microsoft Excel - 001 Phone List [Compatibility Mode]"}
exPhone = ChkNOpenWB(exPhone, WorkBookNames, TextBox12.Text)
excelApp.Visible = True
End Sub
Function ChkNOpenWB(bookName As Workbook, WorkBookNames() As String, path As String) As Workbook
Dim openFlag As Boolean = True
For Each p As System.Diagnostics.Process In System.Diagnostics.Process.GetProcesses()
If p.ProcessName = "EXCEL" Then
For Each excelFile As String In WorkBookNames
If p.MainWindowTitle.Contains(excelFile) Then
bookName = GetObject(TextBox12.Text & "\" & TextBox1.Text)
bookName.RefreshAll()
openFlag = False
End If
Next
End If
Next
If (openFlag) Then
bookName = excelApp.Workbooks.Open(TextBox12.Text & "\" & TextBox1.Text, ReadOnly:=False)
bookName.Activate()
End If
Return (bookName)
End Function
2 ответа
Вы также можете использовать Marshalling. Это выглядит, чтобы увидеть, если книга уже открыта. Если это не так, он открывает его. Если он уже открыт, он назначает рабочую книгу переменной.
Dim exApp AS Excel.Application = New Excel.Application
Dim wb as excel.Workbook
Dim exSheet As Excel.Worksheet = Nothing
exApp.Visible = True
wb = System.Runtime.InteropServices.Marshal.BindToMoniker(FileNamePath)
exApp = wb.Parent
'lets see it
exApp.Visible = True
exApp.Windows(1).Visible = True
Dim tSheet As Excel.Worksheet = exApp.ActiveWorkbook.Sheets.Item(1)
Вы можете просто проверить, можно ли открыть файл для записи. Если открыть в Excel, проверка не удастся.
Public Shared Function FileInUse(ByVal Filename As String) As Boolean
Dim thisFileInUse As Boolean = False
If System.IO.File.Exists(Filename) Then
Try
Using f As New IO.FileStream(Filename, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
thisFileInUse = False
End Using
Catch
thisFileInUse = True
End Try
End If
Return thisFileInUse
End Function