Daten per VBA exportieren

  • Excel

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von Sam85.

    Nein, das geht wieder an der Sache vorbei, zumindest teilweise. Schleifenköpfe. Und zwar bitte von allen Schleifen der kompletten Exportfunktion. Natürlich könnte ich sie mir auch aus Deinem Projekt raussuchen, aber das ist auch nicht Sinn der Sache. Es geht mir nicht um If-Statements, sondern um Schleifen, also solche (ich hoffe, das ist klar), die mir For, Do oder While beginnen. Alles andere ist erstmal vollkommen egal.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    ok, ach ist gar nicht so einfach...meinst du es so? wobei ich mir beim "do" nicht sicher bin (hab bisher noch keine do Funktion verwendet).

    VB.NET-Quellcode

    1. For Each wks In Worksheets
    2. 'arbeitsblatt prüfen
    3. For i = 1 To alle_zeilen_patienten_termine
    4. 'prüfen ob termin bereich komplett leer ist
    5. For i = 1 To alle_spalten_therapeuten
    6. 'aktuelle spalte
    7. For i = 1 To alle_zeilen_uhrzeit
    8. 'abgleich mit patienten_termine
    9. Do until
    10. 'alle_zeilen_patienten_termin nacheinander prüfen und in export mit den übrigen Kriterien übertragen
    11. loop

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

    So eigentlich lief es heute wirklich mal ganz gut, bis auf drei Dinge die ich nicht so wirklich realisieren konnte:​
    1. das überspringen der Leerzeilen bei der Patienten Terminübertragung (siehe dazu Bild 1, in der Upload Datei Seite "Export"):
    2. Das "dran kopieren" an den bereits erzeugten Bereich, bzw. der Sprung in die nächste Spalte
    3. und was wenn die Zeile mit dem Tag leer ist?

    nun aber erstmal zu 1.) da habe ich den Bereich...

    VB.NET-Quellcode

    1. rowZeit = wks.Range(wks.Cells(6, 1), wks.Cells(6, 1).End(xlDown)).Rows.Count - 1
    2. For y = 0 To rowZeit 'anzahl zeilen für uhrzeit
    3. wks.Cells(3, 1).Copy Destination:=Worksheets(target).Cells(2 + y, 2) 'jahr fix


    ...und wollte die zwei vorletzten Zeilen nach Beginn der For Schleife hinzufügen. Dann wird aber dennoch eine Leerzeile eingefügt und die nächste Zeile die beschrieben ist bleibt aus.
    ​Wie kann ich vorgehen?

    VB.NET-Quellcode

    1. rowZeit = wks.Range(wks.Cells(6, 1), wks.Cells(6, 1).End(xlDown)).Rows.Count - 1
    2. For y = 0 To rowZeit 'anzahl zeilen für uhrzeit
    3. Set rngPatient = wks.Cells(6 + y, 2).End(xlDown).Rows ' #
    4. If Not IsEmpty(rngPatient) Then 'prüfen ob im bereich Patienten_termine leerzeilen sind #
    5. wks.Cells(3, 1).Copy Destination:=Worksheets(target).Cells(2 + y, 2) 'jahr fix


    Aktuelle Datei ist auch dabei, (frmMain, btn_export "Daten exportieren", Zeile 58)

    Der Vollständigkeit wegen auch noch der ganze Code...
    ​Vorgehen ist wie folgt:
    1. ​Arbeitsblatt nach Kriterium prüfen
    2. ​​Ganzen Patienten Bereich in einer Spalte nach Inhalt prüfen
    3. Patientenbereich in einer Spalte anhand der Uhrzeit exportieren, dabei Leerzeilen auslassen
      • nächste Spalte

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim rngPatient As Range, colTherapeut As Long, rowZeit As Long
    2. For Each wks In Worksheets
    3. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then
    4. colTherapeut = wks.Cells(5, Columns.Count).End(xlToLeft).Column - 1
    5. For x = 0 To colTherapeut 'Anzahl Spalten der Therapeuten
    6. Set rngPatient = wks.Cells(6, 2 + x).End(xlDown).Rows.Find("*", LookIn:=xlValues, lookat:=xlWhole)
    7. If Not rngPatient Is Nothing Then
    8. If Not wks.Cells(2, 2 + x) Is Nothing Then 'Tag auswählen
    9. rowZeit = wks.Range(wks.Cells(6, 1), wks.Cells(6, 1).End(xlDown)).Rows.Count - 1
    10. For y = 0 To rowZeit 'anzahl zeilen für uhrzeit
    11. ' Set rngPatient = wks.Cells(6 + y, 2).End(xlDown).Rows ' #
    12. ' If Not IsEmpty(rngPatient) Then 'prüfen ob im bereich Patienten_termine leerzeilen sind #
    13. wks.Cells(3, 1).Copy Destination:=Worksheets(target).Cells(2 + y, 2) 'jahr fix
    14. Worksheets(target).Cells(2 + y, 2).ClearFormats
    15. wks.Cells(4, 1).Copy Destination:=Worksheets(target).Cells(2 + y, 3) 'monat fix
    16. Worksheets(target).Cells(2 + y, 3).ClearFormats
    17. wks.Cells(2, 2).Copy Destination:=Worksheets(target).Cells(2 + y, 4) 'tag spaltenvariabel, zeilenfix
    18. Worksheets(target).Cells(2 + y, 4).ClearFormats
    19. warry() = Split(Worksheets(target).Cells(2 + y, 4), ",")
    20. For counter = LBound(warry) To UBound(warry)
    21. strg = warry(counter)
    22. Worksheets(target).Cells(2 + y, counter + 4).Value = Trim(strg)
    23. Worksheets(target).Cells(2 + y, counter + 4).Value = Format(Worksheets(target).Cells(2 + y, counter + 4), "dd.mm.yyyy")
    24. Next counter
    25. wks.Cells(6 + y, 1).Copy Destination:=Worksheets(target).Cells(2 + y, 6) 'zeit spaltenfix, zeilenvariabel
    26. wks.Cells(5, 2).Copy Destination:=Worksheets(target).Cells(2 + y, 7) 'therapeut spaltenvariabel,zeilenfix
    27. Worksheets(target).Cells(2 + y, 7).ClearFormats
    28. wks.Cells(6 + y, 2).Copy Destination:=Worksheets(target).Cells(2 + y, 8) 'patient variabel
    29. warry() = Split(Worksheets(target).Cells(2 + y, 8), "|")
    30. For counter = LBound(warry) To UBound(warry)
    31. strg = warry(counter)
    32. Worksheets(target).Cells(2 + y, counter + 8).Value = Trim(strg)
    33. Next counter
    34. Worksheets(target).Cells(2 + y, 1) = RowID + y 'id
    35. ' End If
    36. Next y
    37. Else
    38. 'was wenn Zeile Tag leer? dann letzten Tag auswählen #
    39. End If
    40. Else
    41. 'nächste spalte #
    42. End If
    43. Next x
    44. End If
    45. Next wks

    Bilder
    • Bild 1.PNG

      57,2 kB, 1.143×583, 16 mal angesehen
    Dateien
    • 2017 - up.zip

      (188,34 kB, 16 mal heruntergeladen, zuletzt: )
    Also erstmal: Wenn Du keine Do-Loop-Schleife in Deinem bisherigen Code hast, musst Du jetzt nicht anfangen, eine einzuführen. Denn ich bat ja nur um den Code

    VaporiZed schrieb:

    von allen Schleifen der kompletten Exportfunktion
    . Wenn dort bisher keine Do-Loop-Schleife ist, na dann eben nicht, macht ja nix. Wenn Du nur mit For-Schleifen arbeiten möchtest und keine der unbestimmten Schleifen wie Do-Schleife oder While-Schleife brauchst, ja dann musst Du natürlich auch keine erzeugen, ist doch OK. Es ging mir nur darum, dass alle ineinandergeschachtelten Schleifen mal kompakt zu sehen sind, um die erstmal analysieren zu können.
    1. Schleife bei Dir: Nach dem passenden Sheet schauen. OK.
    2. Schleife nennst Du in der Zusammenfassung For i = 1 To alle_zeilen_patienten_termine, im geposteten Code jedoch gibt es keine Entsprechung. Was soll diese Schleife machen? Das ergibt sich weder aus dem Code noch aus dem Namen.
    3. Schleife: Laut Post#22: For i = 1 To alle_spalten_therapeuten, im Code jedoch For x = 0 To colTherapeut. Ich versteh's grad echt nicht. Wir können mit theoretischem Code, der so in Deinem Programm nicht auftaucht, nicht an einem konkreten Problem arbeiten. X/ Also nehmen wir mal die Zeile aus Deinem echten Code. Ja, die passt.
    3. Schleife: Theorie: For i = 1 To alle_zeilen_uhrzeit, Tatsache: For y = 0 To rowZeit. Wenn man von dem Problem absieht, dass ich für Schleife 3 geschrieben habe, ist die Zeile auch OK.

    So. Angenommen, der ExportCode macht, was er soll, kommt also reihenfolgentechnisch folgendes z.B. raus:
    ID 1, Tag 1, Therapeut 1, 08:00, Patient 1
    ID 2, Tag 1, Therapeut 1, 09:00, Patient 1
    ID 3, Tag 1, Therapeut 1, 18:00, Patient 2
    ID 4, Tag 1, Therapeut 1, 18:30, Patient 2
    ID 5, Tag 1, Therapeut 2, 08:00, Patient 3
    ID 6, Tag 1, Therapeut 2, 08:30, Patient 3
    ID 7, Tag 1, Therapeut 2, 10:00, Patient 4
    ID 8, Tag 1, Therapeut 2, 12:00, Patient 5

    1. Willst Du diese Reihenfolge so? Jetzt ist es nach Therapeut sortiert. Erst alles von Therapeut 1 auflisten, dann Th. 2, ... Oder soll es nach Zeiten sortiert sein: Zuerst auflisten, was ggf. 8:00, was 9:00, ..., was 19:00 passiert, bevor dann innerhalb einer Zeit nach Therapeuten sortiert wird? Das wär dann folgende Auflistung:
    ID 1, Tag 1, Therapeut 1, 08:00, Patient 1
    ID 2, Tag 1, Therapeut 2, 08:00, Patient 3
    ID 3, Tag 1, Therapeut 2, 08:30, Patient 3
    ID 4, Tag 1, Therapeut 1, 09:00, Patient 1
    ID 5, Tag 1, Therapeut 2, 10:00, Patient 4
    ID 6, Tag 1, Therapeut 2, 12:00, Patient 5
    ID 7, Tag 1, Therapeut 1, 18:00, Patient 2
    ID 8, Tag 1, Therapeut 1, 18:30, Patient 2


    2. Wo willst Du die verschiedenen Tage des Monats in Deinem Code mit welcher Schleife einbringen? Noch sind die Tage ja nicht berücksichtigt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«

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

    da ich mich mit Do While schleifen nicht auskenne, obwohl ich natürlich die Vorzüge gegenüber eine For Schleife in Erfahrung bringen möchte, habe ich es erstmal bei den For Schleifen gelassen.
    ahh sorry..ich war mir nicht sicher ob du in der Übersicht nur das Konstrukt sehen wolltest...puhh ich war da etwas verwirrt. Aber nun versteht ich, realer Code aber nur die Headline.

    zu 2) Hmm..doch die vor Prüfung ob überhaupt etwas in dem Patienten Bereich eingetragen ist...das ist es doch, oder?

    VB.NET-Quellcode

    1. Set rngPatient = wks.Cells(6, 2 + x).End(xlDown).Rows.Find("*", LookIn:=xlValues, lookat:=xlWhole)
    2. If Not rngPatient Is Nothing Then


    zu 1 unten)
    Die Reihenfolge empfand ich so in Ordnung (siehe auch Bild im vorherigen Post)..so wird es ja bisher erzeugt. Nur wenn er in die nächste Spalte geht, überschreibt er einfach die Einträge. Zudem werden auch alle Leerzeilen mitgenommen.

    zu 2 unten)
    ja da hab ich auch schon überlegt, wenn die erste zweite spalte vorbei ist, muss der Wert ja solange festgehalten werden bis einer neuer Tageswert in der Spalte entsprechend der Therapeuten kommt. Falls du aber meintest sie kommen gar nicht vor dann Spalte D in Export (siehe Bild).

    VB.NET-Quellcode

    1. Else
    2. 'was wenn Zeile Tag leer? dann letzten Tag auswählen #
    3. End If
    4. Else
    5. 'nächste spalte #
    6. End If

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sam85“ ()

    Die Reihenfolge nach Zeit würde ich präferieren. Wie sorge ich aber dafür, dass die nächste Spalte für Therapeuten angesteuert und im Export angehängt wird?

    ​Bzgl. des Tages bin ich noch etwas überfragt was für eine Methode zu einen sinnvollen Ergebnis führen könnte?!

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

    Die Schleifenreihenfolge hat direkten Einfluss auf die Exportreihenfolge. Die Quelltabelle sieht ja so aus:


    Tag 1


    Tag 2



    Therapeut 1
    Th2
    Th3
    Th1
    Th2
    Th3
    8:00
    Patient A
    B

    E

    F
    9:00
    A

    D
    E


    10:00

    C

    E



    Du gehst die Schleifen ja grundsätzlich mit folgendem durch:

    Visual Basic-Quellcode

    1. For i = 0 To Spaltenzahl - 1 'Spaltenzahl = Therapeutenzahl x Werktagszahl
    2. For j = 0 To Zeilenzahl - 1 'Anzahl der Uhrzeitzeilen
    3. 'prüfen, ob was in der Zelle drinsteht; wenn ja, dann exportieren und danach ID um 1 erhöhen
    4. Next
    5. Next

    das führt eben zu:
    Tag 1: alle Termine von Th1, alle von Th2, alle von Th3
    Tag 2: alle Termine von Th1, alle von Th2, alle von Th3
    ...

    Wenn Du nun die Reihenfolge ändern willst, sodass eben steht:
    Tag 1: Uhrzeit 1: ggf. Termin von Th1, ggf. von Th2, ggf. von Th3
    Tag 1: Uhrzeit 2: ggf. Termin von Th1, ggf. von Th2, ggf. von Th3
    Tag 1: Uhrzeit 3: ggf. Termin von Th1, ggf. von Th2, ggf. von Th3
    Tag 2: Uhrzeit 1: ggf. Termin von Th1, ggf. von Th2, ggf. von Th3
    Tag 2: Uhrzeit 2: ggf. Termin von Th1, ggf. von Th2, ggf. von Th3
    Tag 2: Uhrzeit 3: ggf. Termin von Th1, ggf. von Th2, ggf. von Th3

    dann musst Du auch die Schleifen anders gestalten:

    Visual Basic-Quellcode

    1. Do Until Zelle(2, Spalte_des_aktuellen_Tages).Value = ""
    2. For i = 0 To Therapeutenzahl - 1
    3. For j = 0 To Zeilenzahl - 1
    4. 'prüfen, ob was in der Zelle drinsteht; wenn ja, dann exportieren und danach ID um 1 erhöhen
    5. Next
    6. Next
    7. Spalte_des_aktuellen_Tages += Therapeutenzahl
    8. Loop

    Falls Du die Do-Schleife meiden willst, musst Du eben schauen, wieviele Werktage der Monat hat und eine konkrete Zählschleife (=For-Schleife) draus machen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „VaporiZed“ ()

    Also nach der Erkennung des Arbeitsblattes erstmal prüfen wie viele therapeuten es gibt, dann eine do until schleife die schaut ob cell(2,spalte tage) einen Inhalt hat und wenn ja, dann soll der loop sooft wie Therapeuten Anzahl ausgeführt werden. (Geht das?, also kann ich festlegen wie oft geloopt wird?)
    Dann in der for schleife schauen, ob überhaupt ein Patient vorhanden ist und wenn ja, dann nur die zeilen schreiben die eine inhalt haben.

    So richtig verstanden?

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

    Sam85 schrieb:

    wenn ja, dann soll der loop sooft wie Therapeuten Anzahl ausgeführt werden. (Geht das?, also kann ich festlegen wie oft geloopt wird?)

    Ich glaube fast, dass Du da zwei Schleifen gedanklich vermischst.
    Die äußere von den beiden ist die Do-Schleife (oder vollenglisch: do loop). Der sagst Du: Schaue in Zelle(2, aktuelle_Spalte_für_den_Tag), ob da was steht. Wenn ja, dann führe die inneren Schleifen aus; wenn nicht, dann sind die Tage für den Monat vorbei. Wenn Du 5 Therapeuten hast, dann wird alle 5 Spalten ein neuer Tag beginnen. Das heißt, wenn Du die inneren Strukturen/Schleifen für einen Tag durchgegangen bist, addierst Du zu "aktuelle_Spalte_für_den_Tag" die Therapeutenanzahl, um zum Spaltenbereich für den nächsten Tag zu kommen.

    Sam85 schrieb:

    ob überhaupt ein Patient vorhanden ist und wenn ja, dann nur die zeilen schreiben die eine inhalt haben.

    Sehe ich als doppelt gemoppelt an. Da die Prüfung, ob was in den Zeilen drinsteht ja automatisch schon Deine Eingangsprüfung ("ob überhaupt ein Patient vorhanden ist") abdeckt. Du kannst die Eingangsprüfung zwar machen, aber Du schreibst mehr Code, nur um dem Programm vermeintlich Arbeit zu ersparen. Der kann aber zig einzelne Zellen in kürzester Zeit prüfen. Ob da Deine Vorprüfung hilft oder bremst ... ich würd sagen: lass die Eingangsprüfung weg.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    Ich dachte ja wirklich, nun bekomme ich es hin aber:
    • es wird immer der bereits beschriebene Bereich, überschrieben (also ist Therapeut 1 übertragen, wird Therapeut 2 über Therapeut 1 geschrieben) ;(
    ​Habe ich die Schleifen immer noch nicht korrekt definiert, bzw. irgendwas hab ich doch bestimmt vergessen? :huh:

    VB.NET-Quellcode

    1. Dim rngPatient As Range, colTherapeut As Long, rowZeit As Long, cntTherapeut As Integer, aktTag As Integer
    2. For Each wks In Worksheets 'Arbeitsblattprüfung
    3. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then
    4. aktTag = 2
    5. Do Until wks.Cells(2, aktTag).Value = "" 'Tages Schleife
    6. cntTherapeut = frmTherapeut.lb_therapeut.ListCount - 1
    7. For x = 0 To cntTherapeut 'Therapeuten Anzahl
    8. Set rngPatient = wks.Cells(6, 2 + x).End(xlDown).Rows.Find("*", LookIn:=xlValues, lookat:=xlWhole)
    9. If Not rngPatient Is Nothing Then ' Patienten auf Leere prüfen, wenn ja dann überspringen
    10. rowZeit = wks.Range(wks.Cells(6, 1), wks.Cells(6, 1).End(xlDown)).Rows.Count - 1
    11. For y = 0 To rowZeit 'Arbeitszeit Anzahl
    12. Set rngPatient = wks.Cells(6 + y, 2).End(xlDown).Rows
    13. If Not IsEmpty(rngPatient) Then 'Leerzeilen zwischen den nicht Leerzeilen aussortieren
    14. End If
    15. Next y
    16. End If
    17. Next x
    18. aktTag = aktTag + cntTherapeut
    19. Loop
    20. End If
    21. Next wks
    1. Da der (Über)Schreibcode in Zeile 15 stehen dürfte, wäre es auch gut, wenn Du jene Zeile(n) postest.
    2. die Do-Schleife sieht gut aus, ihr Wert wird aber (außer in Zeile 20) nirgends verwendet. Altes Problem: Nenne Deine Variablen so, dass man ihren Sinn erkennt. aktTag ist benennungstechnisch irreführend. Nenn sie z.B. SpalteDesAktuellenTagsInDerSchleife und schon erkennst Du, dass Du diesen Spaltenwert ja auch überall dort reinbringen musst, wo du relativ auf die Quelltabelle zugreifst/verweist. So z.B. in Zeile 9: wks.Cells(6, 2 + x) Da werden momentan unabhängig vom Tag immer wiederkehrend für x Werte von 0 bis cntTherapeut, also 0, 1, 2, 3, 4, ... eingetragen. Das ist aber Hunz, da dann immer nur auf die absoluten Zellspalten 2, 3, 4, 5, 6, ... verwiesen werden. Dieser Wert muss sich aber mit jedem Tag erhöhen => wks.Cells(6, 2 + x + aktTag) wäre korrekt. So setzt sich das Schlamassel fort.
    Und wieder: Schau mit Haltepunkten, wie im laufenden Betrieb Deine aktuellen Zeilen- und Spaltenkoordinaten aussehen bzw. welche Werte aktuell dort sind und schnell ist der Fehler gefunden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    Würde ich dann nicht in spalte 4 starten?

    VB.NET-Quellcode

    1. wks.Cells(6, 2 + x + aktTag)


    der code zum übertragen, hat dann aber vermutlich die selben Probleme da "SpalteDesAktuellenTagsInDerSchleife" nicht beachtet wird. (exemplarisch nur ein Wert damit es nicht zu überladen aussieht).

    VB.NET-Quellcode

    1. wks.Cells(3, 1).Copy Destination:=Worksheets(target).Cells(2 + y, 2) 'jahr fix
    2. Worksheets(target).Cells(2 + y, 2).ClearFormats
    1. ja => bitte selbständig Code entsprechend anpassen (das "+ 2" rauslöschen)
    2. wks.Cells(3, 1).Copy: schlechtes Beispiel, da ein fixer Wert (Jahr). Gib mal bitte eine Exportzeile, in der ein Patient in die Zieltabelle geschrieben wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    Das ist der Code zum Patienten Export (mit Split)

    VB.NET-Quellcode

    1. wks.Cells(6 + y, 2).Copy Destination:=Worksheets(target).Cells(2 + y, 8) 'patient variabel
    2. warry() = Split(Worksheets(target).Cells(2 + y, 8), "|")
    3. For counter = LBound(warry) To UBound(warry)
    4. strg = warry(counter)
    5. Worksheets(target).Cells(2 + y, counter + 8).Value = Trim(strg)
    6. Next counter


    Da kommt auch meine nächste Frage auf, warum werden bei dieser Funktion die Leerzeilen der Patienten nicht übersprungen?

    VB.NET-Quellcode

    1. Set rngPatient = wks.Cells(6, 2 + x).End(xlDown).Rows
    2. If Not IsEmpty(rngPatient.Value) Then 'Leerzeile von nicht Leerzeile trennen


    EDIT:
    Ok das ging so :)..
    muss ich dann wenn zeilen übersprungen wurden, einen separten Befehl zum entfernen der Leerzellen einbauen oder kann ich das im "Else" bereits definieren?

    VB.NET-Quellcode

    1. If Not IsEmpty(wks.Cells(6 + y, x + aktcolTaginDoLoop).Value) Then

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sam85“ ()

    1. wks.Cells(6 + y, 2).Copy = "kopiere aus der Quelltabelle aus Zeile 6 + y, Spalte 2 die Werte raus." Da wird trotz der vielen umherschwirrenden Schleifen immer nur aus Spalte 2 gelesen. Wieder keinerlei Variabilität. Da fehlt die x-Variable, die für die Therapeutenspalte steht, und der aktTag-Wert, der für die 1. aktuelle Tagesspalte steht.
    2. rngPatient ist eine Range, ein Bereich. Da kann m.E. nicht .Value geprüft werden => Jede einzelne Zielzelle muss auf Inhalt geprüft werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«

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

    Ja gut :) das habe ich jetzt angepasst...heisst überall wo ich nach unten gehen muss y für die Zeit dazu und überall wo ich zur Seite gehe das x und AktTag und die 2 weg weil aktTag beginnt mit 2.

    ​Wie verhindere ich nun das überschreiben der Werte? Es wird zwar alles richtig gelesen aber die erste Spalte wird von der zweiten überschrieben. Muss ich am Ende einen Befehl eintragen, "fortsetzen bei letzten Wert"?
    Worksheets(target).Cells(2 + y, counter + 8).Value = Trim(strg) same thing. statt "2 + y" mach ein 2 + fortlaufendeZeilennummer, die Du nach jedem erfolgreichen Export um 1 erhöhst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    woran kann ich die Messen? Definiert man dann expRow = 1 to last.usedcell?

    EDIT:

    :) ok hab ich hinbekommen.. :S klar ist ja expRow = 2
    und dann am Ende expRow = expRow + 1

    nun fehlt mir aber ab der zweiten Spalte das Datum/Tag. Mach ich dann AktTag minus irgendwas?

    VB.NET-Quellcode

    1. wks.Cells(2, x + aktcolTaginDoLoop).Copy Destination:=Worksheets(target).Cells(expRow, 4) 'Tag
    2. Worksheets(target).Cells(expRow, 4).ClearFormats
    3. warry() = Split(Worksheets(target).Cells(expRow, 4), ",")
    4. For counter = LBound(warry) To UBound(warry)
    5. strg = warry(counter)
    6. Worksheets(target).Cells(expRow, counter + 4).Value = Trim(strg)
    7. Worksheets(target).Cells(expRow, counter + 4).Value = Format(Worksheets(target).Cells(expRow, counter + 4), "dd.mm.yyyy")
    8. Next counter

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sam85“ ()

    Da gibt's nix zu messen. Die laufen nicht in einer eigenen Schleife. Einfach nur vor allen anderen Schleifen Dim expRow As Integer und expRow = 2 (ggf. Wert korrigieren. Und jedes Mal, wenn ne Zeile exportiert wird/in die Exporttabelle geschrieben wird: expRow = expRow +1. sonst nix
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    Sorry hab ich eben editiert :) mein Fehler...hab ich zu kurz gedacht.
    Und beim Datum hab ich einfach das x rausgenommen. Puhhh...das war eine schwere Geburt. Dafür bin ich dir unendlich dankbar...
    hätte nicht erwartet, dass es doch zu komplex wird. Besser ich übe noch eine ganze Weile weiter... :thumbsup:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim target As String, rngPatient As Range, colTherapeut As Long, rowZeit As Long, cntTherapeut As Integer, aktcolTaginDoLoop As Integer
    2. Dim warry() As String, counter As Integer, strg As String, expRow As Integer, RowID As Integer
    3. target = "Export"
    4. expRow = 2
    5. RowID = 0 - 1
    6. aktcolTaginDoLoop = 2
    7. For Each wks In Worksheets 'Arbeitsblatt prüfen
    8. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then
    9. Do Until wks.Cells(2, aktcolTaginDoLoop).Value = "" 'Tages Schleife
    10. cntTherapeut = frmTherapeut.lb_therapeut.ListCount - 1
    11. For x = 0 To cntTherapeut
    12. Set rngPatient = wks.Cells(6, x + aktcolTaginDoLoop).End(xlDown).Rows.Find("*", LookIn:=xlValues, lookat:=xlWhole)
    13. If Not rngPatient Is Nothing Then ' Patienten auf Leere prüfen ggf. unnötig
    14. rowZeit = wks.Range(wks.Cells(6, 1), wks.Cells(6, 1).End(xlDown)).Rows.Count - 1
    15. For y = 0 To rowZeit 'Arbeitszeit Bereich
    16. If Not IsEmpty(wks.Cells(6 + y, x + aktcolTaginDoLoop).Value) Then 'Leerzeile von nicht Leerzeile trennen
    17. wks.Cells(3, 1).Copy Destination:=Worksheets(target).Cells(expRow, 2) 'Jahr
    18. Worksheets(target).Cells(expRow, 2).ClearFormats
    19. wks.Cells(4, 1).Copy Destination:=Worksheets(target).Cells(expRow, 3) 'Monat
    20. Worksheets(target).Cells(expRow, 3).ClearFormats
    21. wks.Cells(5, x + aktcolTaginDoLoop).Copy Destination:=Worksheets(target).Cells(expRow, 7) 'Therapeut
    22. Worksheets(target).Cells(expRow, 7).ClearFormats
    23. wks.Cells(6 + y, 1).Copy Destination:=Worksheets(target).Cells(expRow, 6) 'Arbeitszeit
    24. Worksheets(target).Cells(expRow, 6).Value = Format(Worksheets(target).Cells(expRow, 6), "hh:mm:ss")
    25. wks.Cells(2, aktcolTaginDoLoop).Copy Destination:=Worksheets(target).Cells(expRow, 4) 'Tag
    26. Worksheets(target).Cells(expRow, 4).ClearFormats
    27. warry() = Split(Worksheets(target).Cells(expRow, 4), ",")
    28. For counter = LBound(warry) To UBound(warry)
    29. strg = warry(counter)
    30. Worksheets(target).Cells(expRow, counter + 4).Value = Trim(strg)
    31. Worksheets(target).Cells(expRow, counter + 4).Value = Format(Worksheets(target).Cells(expRow, counter + 4), "dd.mm.yyyy")
    32. Next counter
    33. wks.Cells(6 + y, x + aktcolTaginDoLoop).Copy Destination:=Worksheets(target).Cells(expRow, 8) 'Patient
    34. warry() = Split(Worksheets(target).Cells(expRow, 8), "|")
    35. For counter = LBound(warry) To UBound(warry)
    36. strg = warry(counter)
    37. Worksheets(target).Cells(expRow, counter + 8).Value = Trim(strg)
    38. Next counter
    39. If Worksheets(target).Cells(expRow, 8) <> "" Then
    40. Worksheets(target).Cells(expRow, 12) = Application.WorksheetFunction.VLookup(Worksheets(target).Cells(expRow, 9), Worksheets("Leistung").ListObjects("dt_Leistung").DataBodyRange, 5, False) 'Minuten
    41. Worksheets(target).Cells(expRow, 13) = Application.WorksheetFunction.VLookup(Worksheets(target).Cells(expRow, 9), Worksheets("Leistung").ListObjects("dt_Leistung").DataBodyRange, 4, False) 'Umsatz
    42. End If
    43. Worksheets(target).Cells(expRow, 1) = RowID + expRow 'ID
    44. expRow = expRow + 1
    45. End If
    46. Next y
    47. End If
    48. Next x
    49. aktcolTaginDoLoop = aktcolTaginDoLoop + cntTherapeut
    50. Loop
    51. End If
    52. Next wks