Set Excel workbook from Access

Anonym
2022-03-19T10:39:26+00:00

Hallo community,

aus Access heraus möchte ich eine Excel Tabelle Aktivieren. Öffnen der Tabelle funktioniert problemlos, wenn ich aber die Tabelle, die im Hintergrund ist, wieder aktivieren und sichtbar machen möchte beiße ich mir die Zähne aus.

Dim Ret 

Dim ExcelApp As Object 

Dim WB As Workbook 

Dim TargetWorkbook As Workbook 

Set ExcelApp = CreateObject("Excel.Application")

'Check if workbook is open**********************************************************************

Ret = IsWorkBookOpen("C:/TDB\_DataBase/Process\_Data\_Analysis.xlsm") 

If Ret = True Then 

 '   ExcelApp.Visible = True 

    Set TargetWorkbook = ExcelApp.Workbooks("C:/TDB\_DataBase/Process\_Data\_Analysis.xlsm")   <== Her tritt der Fehler auf , Laufzeitfehler 9 Subscript out of range. 

 '   Workbooks("Process\_Data\_Analysis.xlsm").Activate 

 '   MsgBox "The name of the active workbook is " & ActiveWorkbook.Name 

 '    Workbooks("Process\_Data\_Analysis.xlsm").Visible = True 

' Set TargetWorkbook = ExcelApp.Workbooks.Open("C:/TDB_DataBase/Process_Data_Analysis.xlsm")

' ExcelApp.Visible = True

' TargetWorkbook.Worksheets("Source").Range("A2").CopyFromRecordset rsEPRT

    GoTo 700 

Else 

    Set TargetWorkbook = ExcelApp.Workbooks.Open("C:/TDB\_DataBase/Process\_Data\_Analysis.xlsm") 

    ExcelApp.Visible = True 

    TargetWorkbook.Worksheets("Source").Range("A2").CopyFromRecordset rsEPRT 

End If

Laufzeitfehler deutet auf Fehler im Filenamen hin aber der ist korrekt und wenn ich prüfe ob der File offen ist, dann funktioniert das mit dem Filenamen anstandslos, auch wenn ich den File öffne dann funktioniert das mit dem Filenamen. Das Problem taucht nicht nur bei der Kommandozeile "Set TargetWorkbook..........." auf sondern auch bei den nachfolgenden Kommandos " Workbooks....Activate" und "Workbooks.visible......" ich schaffe es einfach nicht, die offene Exceltabelle im Vordergrund sichtbar werden zu lassen. Kann mir bitte jemand auf die Sprünge helfen??

Danke

Peter

Microsoft 365 und Office | Access | Andere | Windows

Gesperrte Frage. Diese Frage wurde aus der Microsoft-Support-Community migriert. Sie können darüber abstimmen, ob sie hilfreich ist, aber Sie können keine Kommentare oder Antworten hinzufügen oder der Frage folgen.

0 Kommentare Keine Kommentare

16 Antworten

Sortieren nach: Neueste
  1. Anonym
    2022-03-22T23:54:00+00:00

    Hallo,

    Deshalb schrieb ich "ungetestet". ;-)

    Ersetze Worksheets durch Sheets, dann sollte es klappen.

    Gruss - Peter

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare
  2. Anonym
    2022-03-22T18:42:13+00:00

    Hallo Peter,

    danke für die Antwort. Die Zeile .Workbooks...... "source".... führt wieder zur Fehlermeldung "Subscript out of range". Der Tabellenname ist Korrekt und Worksheet Name ist korrekt und beide existieren, definitiv.

    .Workbooks("Process_Data_Analysis.xlsm").Worksheets("source").Select

    wenn ich die Zeile auskommentiere dann durchläuft VBA die nächste Zeile ohne Störung aber weder liegt die Tabelle im Vordergrund noch wird irgendetwas hineinkopiert. Wenn ich die Tabelle manuel in den Vordergrund stelle dann erhalte ich eine Fehlermeldung, er kann nicht in eine Tabelle einfügen, er bezieht sich da auf eine andere Tabelle, und genau das will ich ja vermeiden, es soll in die Richtige Tabelle eingefügt werden.

    .Selection.Range("A2").CopyFromRecordset rsEPRT

    Das Ding treibt mich noch zur Verzweiflung.

    Gruss

    Peter

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare
  3. Anonym
    2022-03-22T10:55:26+00:00

    Hallo,

    > wenn ich Daten mit CopyFromRecordset ...transferieren will dann erhalte ich wieder die Fehlermeldung Subscript out of range.

    > Gehe ich recht in der Vermutung ich müsste in der For Schleife auch den Worksheet Namen in einer Schleife durchlaufen?

    Wenn du den Namen des Worksheets kennst ("Source"?) und dieser sicher auch vorhanden ist, kannst du es direkt adressieren. Allerdings musst du es richtig addressieren. Im With-Konstrukt:

     .Workbooks("Process_Data_Analysis.xlsm").Worksheets("Source").Select  
    
     .Selection.Range("A2").CopyFromRecordset rsEPRT   
    

    (ungetestet)

    Die erste Zeile wählt das Blatt aus, also bringt es in den Vordergrund.

    Gruss - Peter

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare
  4. Anonym
    2022-03-22T08:08:18+00:00

    Hallo Peter,

    ich habe deine Lösungsvorschlag ausprobiert es läuft auch durch aber wenn ich Daten mit CopyFromRecordset ...transferieren will dann erhalte ich wieder die Fehlermeldung Subscript out of range. Gehe ich recht in der Vermutung ich müsste in der For Schleife auch den Worksheet Namen in einer Schleife durchlaufen? Wie beim Workbook? Oder wie müsste ich das Worksheet aktivieren?

    Ein Problem ist auch noch , dass die Tabelle nicht in den Vordergrund des Bildschirms gelegt wird.

    Gruss

    Peter

    Sub XXIsWorkBookOpen(FileName As String)

    Dim Db As DAO.Database 
    
    Dim rsEPRT As DAO.Recordset 
    
    Set Db = Application.CurrentDb 
    
    Set rsEPRT = Db.OpenRecordset("qry\_Process\_Data\_Abfrage\_Export", dbOpenDynaset) 
    
    Dim ExcelApp As Object 
    
    Dim I As Long 
    
    On Error Resume Next 
    
    Set ExcelApp = GetObject(, "Excel.Application") 
    
    On Error GoTo 0 
    
    If ExcelApp Is Nothing Then 
    
        Err.Clear 
    
        Set ExcelApp = CreateObject("Excel.Application") 
    
    Else 
    
        For I = 1 To ExcelApp.Workbooks.Count 
    
            If ExcelApp.Workbooks(I).Name = "Process\_Data\_Analysis.xlsm" Then 
    
                ExcelApp.Workbooks(I).Activate 
    
                Exit For 
    
            End If 
    
        Next I 
    
    End If 
    
    With ExcelApp 
    
        .Visible = True 
    
        .UserControl = True 
    
        .Worksheets("Source").Range("A2").CopyFromRecordset rsEPRT 
    
    End With 
    
    Set ExcelApp = Nothing 
    
     Set rsEPRT = Nothing 
    
    Set Db = Nothing 
    
    End Sub
    

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare
  5. Anonym
    2022-03-21T13:10:01+00:00

    Hallo,

    Du prüfst hier, ob sich die Datei sperren lässt, und schließt andernfalls daraus, dass sie in Excel auf deinem Rechner bereits geöffnet ist. Sie könnte aber genauso von einem anderen Rechner in Excel, oder von deinem Rechner vom Backup-Prozess oder Virenscanner "geöffnet" sein und die Prüfung würde dasselbe Ergebnis bringen.

    Ich würde eine andere Vorgehensweise wählen:

    • Prüfen, ob eine Excel-Instanz bereits besteht.
    • Falls nicht, anlegen und Datei öffnen.
    • Falls ja, prüfen, ob die Datei in der Instanz geöffnet ist.
    • Falls nicht, öffnen.
    • Bearbeiten
    • Speichern und Schließen, oder für den Benutzer geöffnet lassen.

    Auch bei dieser Vorgehensweise besteht die Möglichkeit, dass die Datei von einem anderen Prozess als Excel im Zugriff ist, aber das musst du beim Öffnen durch entsprechende Fehlerbehandlung abfangen.

    Beispiel (keine Lösung, aber ein Ansatz):

        Dim ExcelApp As Object
        Dim I As Long
    
        On Error Resume Next
        Set ExcelApp = GetObject(, "Excel.Application")
        On Error GoTo 0
    
        If ExcelApp Is Nothing Then
            Err.Clear
            Set ExcelApp = CreateObject("Excel.Application")
        Else
            For I = 1 To ExcelApp.workbooks.Count
                If ExcelApp.workbooks(I).Name = "Process_Data_Analysis.xlsm" Then
                    ExcelApp.workbooks(I).Activate
                    Exit For
                End If
            Next I
        End If
    
        With ExcelApp
            .Visible = True
            .UserControl = True
        End With
    
        Set ExcelApp = Nothing
    

    Gruss - Peter

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare