2014-12-16 6 views
0

У меня есть рабочая книга, которая открыта до загрузки моей формы.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 

ответ

0

Вы можете просто проверить, можно ли открыть файл для записи. Если он открыт в 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 
1

Вы также можете использовать 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) 
+0

спасибо! это прекрасно работает! – doggy

Смежные вопросы