[Excel]Problem mit Worksheet / Workbook richtig ansprechen

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Dark_Eagle.

    [Excel]Problem mit Worksheet / Workbook richtig ansprechen

    Hallo,

    Ich habe folgenes Problem: Ich habe Messdaten die immer in einzelnen Excelfiles stehen. Die sollen alle Eingelesen werden und auf ein Tabellenblatt geschrieben werden. Dazu hat mal jemand hier in der Firma folgenden Code erstelllt:

    Visual Basic-Quellcode

    1. Sub einladen(i As Integer)
    2. Dim n As Integer
    3. DieseDatei = ActiveWorkbook.Name
    4. Set AlleDateien = Application.FileDialog(msoFileDialogOpen)
    5. With AlleDateien
    6. .AllowMultiSelect = True
    7. If .Show = -1 Then
    8. For Each Datei In .SelectedItems
    9. x = x + 2
    10. Set Dnam = Workbooks.Open(Datei)
    11. n = Cells(Cells.Rows.Count, 1).End(xlUp).Row
    12. Range("A1:A" & n).Copy
    13. Windows(DieseDatei).Activate
    14. Cells(4, x ).PasteSpecial xlPasteValues
    15. Application.CutCopyMode = False
    16. Dnam.Close False
    17. Next
    18. End If
    19. End With
    20. End Sub


    Da diese Variante ja immer Activiert ist sie natürlich relativ langsam.

    Ich habe jetzt probiert das ohne Activate und Copy nachzubauen, bekomme aber immer in Zeile 18 die Fehlermeldung: Laufzeitfehler 438, Objekt unterschützt diese Methode oder Eigenschaft nicht. Ich vermute ich habe die Cells in der Range nicht richtig angesprochen. Könnte jemand bitte mal drüberschauen und mir bitte auch erklären wie man das richtig macht?

    Visual Basic-Quellcode

    1. Sub einladen(j, p, q, x)
    2. Dim n As Integer
    3. Dim quelle As Worksheet
    4. Dim RD As Worksheet
    5. x = 2 * i - 1
    6. With Sheets("Rohdaten")
    7. .Visible = True
    8. .Select
    9. DieseDatei = ActiveWorkbook.Name
    10. Set AlleDateien = Application.FileDialog(msoFileDialogOpen)
    11. With AlleDateien
    12. .AllowMultiSelect = True
    13. If .Show = -1 Then
    14. For Each Datei In .SelectedItems
    15. x = x + 2
    16. Set Dnam = Workbooks.Open(Datei)
    17. Set quelle = ActiveSheet
    18. DieseDatei.RD.Range(DieseDatei.RD.Cells(2, x), DieseDatei.RD.Cells(q - p, x)).Value = Dnam.quelle.Range(Dnam.quelle.Cells(p, x), Dnam.quelle.Cells(q, x)).Value
    19. Dnam.Close False
    20. Next
    21. End If
    22. End With
    23. End With
    24. End Sub




    Danke Schon mal



    Gruß Darky
    Du solltest deinen Worksheets auch direkt zuweisen, welches sie sein sollen....
    ich habe mir angewöhnt immer direkt:

    Visual Basic-Quellcode

    1. dim wb as workbook
    2. set wb ThisWorkbook
    3. Dim ws as worksheet
    4. set ws = wb.worksheets("DeinBlatt")

    dann weißte immer sicher womit du arbeitest...
    ich denke du wirst da irgenwo damit was durcheinander gebracht haben
    Wozu übergibst du 4 Variabeln wenn du sowieso direkt die eine überschreibst(x)
    Dann bringt den RD(worksheet) unzugewiessen auch alles durcheinander... Welches Tabellenblatt soll RD denn sein=?
    generelll solltest du auch ActiveSheet und ThisWorkbook verzichten und sie mit dem Namen ansprechen in der Zuweisung...
    weil... wenn der User kurz woanders hinklickt.. passt garnix mehr ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FloFuchs“ ()

    Hallo FloFuchs

    danke das zu so schnell antwortest.

    Ich weis halt net wie das Worksheet in den zu öffnenden Datein heißt, deshalb hätte ichs über Activ an dem Punkt gemacht.

    Ich habe das Problem das ich das mit der Rückgabe von Variablen ins Hauptprogramm noch nicht wirklich kann, deshalb hab ich Sie mit übergeben, damit ich Sie dann im Hauptprogramm direkt wieder habe. Kann man noch Optimieren geb ich zu.

    Die sub ist eigentlich etwas länger ich habe alles was net zum Problem gehört weggelassen und dabei auch das Set RD = Worksheet("Rohdaten") aus versehen vergessen, steht aber im Orginaltext drin.



    Mein Problem ist halt, das ich den Anfangsteil des Codes nicht wirklich verstehe und dadurch auch net so ganz begreife wie er die Files eigentlich aufruft.

    Visual Basic-Quellcode

    1. DieseDatei = ActiveWorkbook.Name 'ok hier könnte man den aktuellen Dateinnamen angeben (wie bekomm ich den raus, weil der kann sich ja auch ändern?)
    2. Set AlleDateien = Application.FileDialog(msoFileDialogOpen) 'hier öffnet er scheinbar die Datein
    3. With AlleDateien
    4. .AllowMultiSelect = True
    5. If .Show = -1 Then 'was das soll weis ich nett
    6. For Each Datei In .SelectedItems
    7. Set Dnam = Workbooks.Open(Datei) 'damit man die geöffnete Datei wieder zu bekommt..?
    8. Dnam.Close False
    9. Next
    10. End If
    11. End With
    12. End Sub

    Dark_Eagle schrieb:

    If .Show = -1 Then 'was das soll weis ich nett
    Auszug aus der Doku:
    Filedialog.Show displays a file dialog box and returns an Integer indicating whether the user pressed the action button (-1) or the cancel button (0).

    Die Abfrage verhindert also, dass etwas passiert, wenn auf der Dialog durch Klick auf Cancel (bzw. Abbrechen) beendet wurde.

    Vielleicht ist es für dich einfacher, wenn du nicht mit With und dafür mit geeigneten Variablennamen arbeitest:

    Visual Basic-Quellcode

    1. Set Auswahl = Application.FileDialog(msoFileDialogOpen) 'hier wird noch gar nichts geöffnet, sondern das Objekt für den Filedialog erzeugt
    2. Auswahl.AllowMultiSelect = True 'hier wird der Dialog so eingestellt, dass man mehrere Dateien angeklickt werden können
    3. If Auswahl.Show = -1 Then 'hier wird der Auswahl-Dialog angezeigt und gewartet, bis er mit OK oder Cancel beendet wird
    4. For Each Datei In Auswahl.SelectedItems 'SelectedItems ist eine Collection mit den ausgewählten Pfadnamen
    5. Set WB = Workbooks.Open(Datei) 'hier wird die Datei geöffnet und deren Workbook-Objekt der Variable WB zugewiesen
    6. 'hier kannst du mit dem geöffneten Workbook arbeiten
    7. WB.Close False 'das Workbook wird wieder geschlossen, ohne es zu speichern
    8. Next 'gehe zur nächsten ausgewählten Datei
    9. End If
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    Hallo Petaod Großes Danke, genau so eine Info hab ich gebraucht.

    Hab jetzt noch folgendes Problem: Die Files die geöffnet werden sind eigendlich .asc Files. Excel schreibt dann den Dateinamen als Worksheetnamen habe ich festgestellt. Dieser ist jedoch bei jeder Datei logischerweise anderes. Wie kann ich dann das passende Sheet jeweis ansprechen oder muss ich das gar nicht weil es in der geöffneten Datei eh nur ein Blatt gibt?

    Gruß Darky

    Dark_Eagle schrieb:

    Die Files die geöffnet werden sind eigendlich .asc Files
    Was machst du eigentlich, wenn Dateien angewählt werden, die für Excel überhaupt nicht lesbar sind?
    Ich hoffe, du hast hier eine Fehlerbehandlung eingebaut!

    Dark_Eagle schrieb:

    Wie kann ich dann das passende Sheet jeweis ansprechen
    Du kannst die Sheets anstatt mit dem Namen auch numerisch anspechen

    Visual Basic-Quellcode

    1. Set WS = WB.Sheets(1)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    MMh das mit den Datein hab ich nicht bedacht, wie würde man sowas umsetzen?

    Ok hab das jetzt mal alles versucht zusammenzubauen. Sieht jetzt wie folgt aus:

    Visual Basic-Quellcode

    1. Sub einladen(j, p, q, x)
    2. Dim i As Integer
    3. Dim n As Integer
    4. i = j
    5. x = 2 * i - 1
    6. Set Auswertung = ActiveWorkbook
    7. Dim RD As Worksheet
    8. Dim WS As Worksheet
    9. Set RD = Worksheets("Rohdaten")
    10. Set Auswahl = Application.FileDialog(msoFileDialogOpen) 'hier wird noch gar nichts geöffnet, sondern das Objekt für den Filedialog erzeugt
    11. Auswahl.AllowMultiSelect = True 'hier wird der Dialog so eingestellt, dass man mehrere Dateien angeklickt werden können
    12. If Auswahl.Show = -1 Then 'hier wird der Auswahl-Dialog angezeigt und gewartet, bis er mit OK oder Cancel beendet wird
    13. For Each Datei In Auswahl.SelectedItems 'SelectedItems ist eine Collection mit den ausgewählten Pfadnamen
    14. x = x + 2
    15. i = i + 1
    16. Set WB = Workbooks.Open(Datei) 'hier wird die Datei geöffnet und deren Workbook-Objekt der Variable WB zugewiesen
    17. Set WS = Worksheets(1)
    18. Auswertung.RD.Range(Auswertung.RD.Cells(1, x), Auswertung.RD.Cells(q - p, x)).Value = WB.WS.Range(WB.RS.Cells(p, 1), WB.WS.Cells(q, 1)).Value
    19. WB.Close False 'das Workbook wird wieder geschlossen, ohne es zu speichern
    20. Next 'gehe zur nächsten ausgewählten Datei
    21. End If
    22. End Sub


    Nun bekomme ich immer in Zeile 18 die Fehlermeldung: Laufzeitfehler 438 Objekt unterstützt diese Methode nicht

    Ich vermute mal ich hab nen Fehler in Zeile 6 beim zuweisen vom activeWorkbook, oder aber ich sprech die Cells in der Range falsch an. Kannst du mir da nen Tipp geben?

    glg Darky
    Ah wieder was gelernt! Dank dir, funktioniert!!! Anbei Code, falls jemand mal ein ähnliches Problem hat.

    Auf jeden Fall: Danke petaod!!!

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Sub einladen(j, p, q, x)
    2. Dim i As Integer
    3. Dim n As Integer
    4. i = j
    5. x = 2 * i - 1
    6. Set Auswertung = ActiveWorkbook
    7. Dim RD As Worksheet
    8. Dim WS As Worksheet
    9. Set RD = Auswertung.Worksheets("Rohdaten")
    10. Set Auswahl = Application.FileDialog(msoFileDialogOpen) 'hier wird noch gar nichts geöffnet, sondern das Objekt für den Filedialog erzeugt
    11. Auswahl.AllowMultiSelect = True 'hier wird der Dialog so eingestellt, dass man mehrere Dateien angeklickt werden können
    12. If Auswahl.Show = -1 Then 'hier wird der Auswahl-Dialog angezeigt und gewartet, bis er mit OK oder Cancel beendet wird
    13. For Each Datei In Auswahl.SelectedItems 'SelectedItems ist eine Collection mit den ausgewählten Pfadnamen
    14. x = x + 2
    15. i = i + 1
    16. Set WB = Workbooks.Open(Datei) 'hier wird die Datei geöffnet und deren Workbook-Objekt der Variable WB zugewiesen
    17. Set WS = WB.Worksheets(1)
    18. RD.Range(RD.Cells(1, x), RD.Cells(q - p, x)).Value = WS.Range(WS.Cells(p, 1), WS.Cells(q, 1)).Value
    19. WB.Close False 'das Workbook wird wieder geschlossen, ohne es zu speichern
    20. Next 'gehe zur nächsten ausgewählten Datei
    21. End If
    22. End Sub