Daten per VBA exportieren

  • Excel

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

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

    Daten per VBA exportieren

    Hallo,

    ich versuche gerade mehrere Tabellenblätter Spalte für Spalte zu exportieren und dabei bestimmte Kriterien zu beachten.
    Mit dem Code unten, kann ich zwar das Gesamte Arbeitsblatt kopieren aber nicht so wie ich es mir vorstelle.

    In Bild 1 ist der Zustand wie die Datentabelle ist. Und Bild 2 zeigt, wie ich es am Ende aussehen lassen möchte.
    In wie weit kann ich einrichten, dass Excel immer bis zum ersten Wert in der Spalte geht diesen dann kopiert woanders einfügt und dann in der selben Spalte bis zum nächsten geht usw.
    Dazu kommen dann noch weitere Kriterien die sich auf der Seite stets wiederholen (Jahr, Monat) und mit jedem Zeilen Eintrag nach dem Therapeuten, kommt die Arbeitszeit dazu. Zudem steht am Anfang noch der Tag, der sich entsprechend der Therapeuten Anzahl verändert.

    Beispiel anbei. (Geht um frmMain, Button "btn_export", Zeile 19.

    Wie kann ich, um es umzusetzen, Schritt für Schritt vorgehen?
    Freue mich über Feedback.

    VB.NET-Quellcode

    1. Dim loLetzteActive As Long, loLetzte As Long, inLetzte As Long, gZaehler As Long, igZielReg As String, igZaehler As Long
    2. igZielReg = "Export"
    3. For Each wks In Worksheets
    4. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then
    5. loLetzteActive = Worksheets(igZielReg).UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1
    6. loLetzte = wks.UsedRange.SpecialCells(xlCellTypeLastCell).Row
    7. inLetzte = wks.UsedRange.SpecialCells(xlCellTypeLastCell).Column
    8. wks.Range(wks.Cells(2, 1), wks.Cells(loLetzte, inLetzte)).Copy
    9. Worksheets(igZielReg).Cells(loLetzteActive, 1).PasteSpecial xlValues
    10. End If
    11. Next wks

    Bilder
    • Export Bild 1.PNG

      35,81 kB, 1.587×625, 43 mal angesehen
    • Export Bild 2.PNG

      17,41 kB, 961×198, 44 mal angesehen
    Dateien
    • 2017 - upload.zip

      (155,8 kB, 21 mal heruntergeladen, zuletzt: )

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

    Abend,

    ich versuche gerade mich logisch an die Aufgabe heranzutasten. Bin ich mit meiner Annahme hier richtig herangegangen, um mein gewünschtes Ergebnis zu erhalten? Bzw. ist das in VBA so umsetzbar?
    Freue mich über Feedback.

    VB.NET-Quellcode

    1. for each wks in worksheets
    2. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then
    3. x = 1 to letzte zeile
    4. y = x + 1
    5. spalte 1 | 1ter gefundener Wert(J) .copy = paste in wks(export) zeile y(2), spalte 2
    6. spalte 1 | 2ter gefundener Wert(M) .copy = paste in wks(export) zeile y(2), spalte 3
    7. spalte 1 | 3ter gefundener Wert(A) .copy = paste in wks(export) zeile y(2), spalte 4
    8. next column(2)
    9. spalte 2 | 1ter gefundener Wert(D) .copy = paste in wks(export) zeile y(2), spalte 5
    10. spalte 2 | 2ter gefundener Wert(T) .copy = paste in wks(export) zeile y(2), spalte 6
    11. spalte 2 | 3ter gefundener Wert(P) .copy = paste in wks(export) zeile y(2), spalte 7, split(cells(y(2),spalte 7,"|") in spalte 8 + 9 + 10
    12. wks(export) zeile 2, spalte 1 = x + y(2)
    13. back column(1)
    14. spalte 1 | 1ter gefundener Wert(J) .copy = paste in wks(export) zeile y(3), spalte 2
    15. spalte 1 | 2ter gefundener Wert(M) .copy = paste in wks(export) zeile y(3), spalte 3
    16. spalte 1 | 4ter gefundener Wert(A) .copy = paste in wks(export) zeile y(3), spalte 4
    17. next column(2)
    18. spalte 2 | 1ter gefundener Wert(D) .copy = paste in wks(export) zeile y(3), spalte 5
    19. spalte 2 | 2ter gefundener Wert(T) .copy = paste in wks(export) zeile y(3), spalte 6
    20. spalte 2 | 4ter gefundener Wert(P) .copy = paste in wks(export) zeile y(3), spalte 7, split(cells(y(3), spalte 7,"|") in spalte 8 + 9 + 10
    21. wks(export) zeile 3, spalte 1 = x + y(3)
    22. back column(1)
    23. spalte 1 | 1ter gefundener Wert(J) .copy = paste in wks(export) zeile y(4), spalte 2
    24. spalte 1 | 2ter gefundener Wert(M) .copy = paste in wks(export) zeile y(4), spalte 3
    25. spalte 1 | 3ter gefundener Wert(A) .copy = paste in wks(export) zeile y(4), spalte 4
    26. next column(3)
    27. spalte 3 | 1ter gefundener Wert(D) .copy = paste in wks(export) zeile y(4), spalte 5
    28. spalte 3 | 2ter gefundener Wert(T) .copy = paste in wks(export) zeile y(4), spalte 6
    29. spalte 3 | 3ter gefundener Wert(P) .copy = paste in wks(export) zeile y(4), spalte 7, split(cells(y(4),spalte 7,"|") in spalte 8 + 9 + 10
    30. wks(export) zeile 4, spalte 1 = x + y(4)
    31. back column(1)
    32. end if
    33. next

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

    Was ist denn, wenn zur gleichen Zeit in 2 Räumen je ein Therapeut was macht? Wie soll das in die Exporttabelle gehen? Nach Zeit sortiert? Nach Therapeut?
    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 kann vorkommen, es kann sogar passieren das zwei Therapeuten einen Patienten im gleichen Raum an der gleichen Maschine haben. (Der Raum ist relativ groß mit mehreren Maschinen). Aber im Grunde nach Zeit sortiert, da jeder Therapeut seine eigene Spalte hat.
    Hach, mit Excel bevorzuge ich ne BruteForce-Methode: Das Makro soll einfach doof weitersuchen, bis nix mehr zu holen ist.
    Als Pseudocode:

    Quellcode

    1. aktuelle_Spalte = 1, ID = 0
    2. Mach folgendes, bis Zelle(2, aktuelle_Spalte).Wert ist leer:
    3. aktuelle_Uhrzeitzeile = 6
    4. Mache folgendes, bis Zelle(aktuelle_Uhrzeitzeile, 1) leer ist ' = keine Zeit mehr eingetragen = Tagesende
    5. Zähle i von 0 bis Therapeutenzahl - 1
    6. Wenn Zelle(aktuelle_Tätigkeitszeile + aktuelle_Spalte * Therapeutenzahl, i + 1).Wert nicht leer, dann
    7. ID += 1
    8. SchreibeDatenInExportTabelle
    9. Ende WennDann
    10. EndeZählschleife
    11. Uhrzeitzeile += 1
    12. EndMachSchleife
    13. aktuelle_Spalte += Therapeutenanzahl
    14. EndMachSchleife
    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.«
    @VaporiZed Ich bin mir zwar sicher das es nicht 100% stimmt aber versuchen wollte ich es zumindest, dass geschriebene in Code zu fassen. :)

    VB.NET-Quellcode

    1. Dim target As String, aspalte As Integer, azeit As Integer, aleistung As Integer
    2. target = "Export"
    3. aspalte = 1
    4. ID = 0
    5. For Each wks In Worksheets
    6. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then
    7. If wks.Cells(2, aspalte).Value = "" Then
    8. For i = 0 To frmTherapeut.lb_therapeut.ListCount - 1
    9. If wks.Cells((aleistung + aspalte) * frmTherapeut.lb_therapeut.ListCount, i + 1).Value <> "" Then
    10. ID = i + 1
    11. 'Daten schreiben
    12. End If
    13. Next
    14. azeit = i + 1
    15. End If
    16. aspalte = frmTherapeut.lb_therapeut.ListCount
    17. End If
    18. Next wks

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

    Da der nachhaltige Effekt für Dich größer ist, wenn Du selbst auf einen passenden Code kommst, gehen wir doch mal Deinen Code so in Gedanken durch:
    Zeile 8+9 = "Finde das passende Sheet" Joa, an sich ok
    Zeile 10: "Wenn in Zeile 2, Spalte 1 nichts drinsteht, dann arbeite den Exportcode ab" Was befindet sich in Zeile 2, Spalte 1? Ich seh da erstmal nur Euer Logo. Ist das gewollt?
    Zeile 11: "zähle i von 0 bis Therapeutenzahl - 1" klingt überzeugend
    Zeile 12: "wenn in Zeile (komplexe Rechnung), Spalte i + 1 etwas drinsteht, dann mach den Exportcode." Schau Dir mal die Zeilenberechnung an. aleistung ist da noch gar nicht auf nen Wert festgelegt und wird im restlichen Code auch nicht verändert.
    Zeile 13: "ID in der Exporttabelle soll i + 1 sein" Echt? Dann gibt's aber periodisch die gleichen IDs, da i ja immer wieder nur von ... bis ... geht, siehe Zeile 11.
    Zeile 17: azeit? Du meinst das richtige, bringst azeit aber nirgends in Deinem Code unter.
    Zeile 19: "aspalte (sorry, da denk ich automatisch an Hinternritze =O ) wird auf den Wert der Therapeutenzahl gestellt." Ist das sinnvoll? Schließlich wird aspalte damit immer wieder auf z.B. 5 gesetzt.

    Mein Vorschlag: Arbeite an den Variablennamen. Mach sinnvolle draus, bei denen Du sofort weißt, wofür sie stehen. Warum heißt es aspalte und azeit? Warum nicht azeile? Oder gleich aktuelle_Zeile oder gar aktuelle_Zeitzeile? Mir brauchst Du dazu keine Erklärung zu geben, nur eben demjenigen, der am meisten Deinen Code liest und in zwei Wochen beim Lesen nicht weiß, was dort gemeint war. Denn das wirst wahrscheinlich Du selber sein.
    Auch eine Aufteilung der Funktionen wäre sehr sinnvoll. Früher war das Credo, welches ich gelernt hab: Man packt jenen Code in eine Funktion, den man mehrfach im Programm verwendet. Heute ist es eher (entsprechend SRP): Eine Funktion hat nur eine Aufgabe. Sie kann nicht sinnvoll weiter in sinnvolle Teilaufgaben aufgeteilt werden. Und die Aufgabe, die sie hat, soll sie gut erfüllen.
    Und: Für mich sieht das Lock-Symbol auf den Formen aus wie ne Bombe. Hab beim ersten Mal fast schon Angst gehabt draufzuklicken. Aber das ist ein anderes Thema.
    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.«
    @VaporiZed Ich gebe dir da recht, wenn ich mehrere Dinge mit dem Identischen System bewältigen kann, dann warum jeden Code einzeln schreiben. Sagen wir einfach, das "hinschreiben" war eine wirklich gute Übung :), sonst hast du definitiv recht. Alleine schon wegen der Effizienz als auch der Effektvität.

    Ich habe den Anfang jetzt mal versucht auszubessern..bin aber nicht ganz sicher, ob ich das so richtig angegangen bin...denke das ich da etwas mitverstehe in der Syntax..(das mit der spalte :) hab ich auch mal ausgebessert...) bzgl. der "Bombe"..ich schau mal ob ich einen schönen Schlüssel oder sowas finde.

    VB.NET-Quellcode

    1. Dim target As String, ColAktu As Integer, RowJahr As Integer, RowMonat As Integer, RowZeit As Integer
    2. target = "Export"
    3. ColAktu = 1 'aktuelle spalte
    4. RowJahr = 3 'spalte 1, zeile 3 = zeile jahr
    5. RowMonat = 4 'spalte 1, zeile 4 = zeile monat
    6. RowZeit = 6 'spalte 1, ab zeile 6 = zeile zeit
    7. RowLeistung = 6 'ab spalte 2, zeile 6 = zeile leistung
    8. ID = 0
    9. For Each wks In Worksheets
    10. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then
    11. If wks.Cells(RowJahr, ColAktu).Value <> "" Then 'jahr
    12. .Cells(RowJahr, ColAktu).Copy
    13. If wks.Cells(RowMonat, ColAktu).Value <> "" Then 'monat
    14. .Cells(RowMonat, ColAktu).Copy
    @VaporiZed

    hab jetzt mal ein bisschen rum überlegt und gebastelt...bin ich so auf dem richtigen Weg oder auf dem Holzweg? ?(

    VB.NET-Quellcode

    1. Dim target As String, ColAktu As Integer, RowJahr As Integer, RowMonat As Integer, RowZeit As Long, RowPatient As Long, RowID As Integer
    2. Dim izeiten As Integer, ipatienten As Integer
    3. target = "Export"
    4. ColAktu = 1 'aktuelle spalte
    5. RowJahr = 3 'spalte 1, zeile 3 = zeile jahr
    6. RowMonat = 4 'spalte 1, zeile 4 = zeile monat
    7. RowZeit = 6 'spalte 1, ab zeile 6 = zeile zeit
    8. RowPatient = 6 'ab spalte 2, zeile 6 = zeile patient
    9. RowID = 0
    10. For Each wks In Worksheets
    11. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then
    12. For izeiten = 1 To wks.Cells(RowZeit, 1).End(xlUp).Row 'erste zeit bis letzte zeit
    13. If wks.Cells(RowJahr, 1).Value <> "" Then 'jahr
    14. .Cells(RowJahr, 1).Copy 'Destination:=worksheets(target).cells(2,2)
    15. If wks.Cells(RowMonat, 1).Value <> "" Then 'monat
    16. .Cells(RowMonat, 1).Copy 'Destination:=worksheets(target).cells(2,3)
    17. For i = 0 To frmTherapeut.lb_therapeut.ListCount - 1
    18. For ipatienten = 1 To wks.Cells(RowPatient, ColAktu).End(xlUp).Row 'erster patient bis letzter patient
    19. If Cells((RowPatient + ColAktu) * frmTherapeut.lb_therapeut.ListCount, i + 1).Value <> "" Then
    20. .Cells(RowPatient, ColAktu).Copy 'Destination:=worksheets(target).cells(2,5)
    21. End If
    22. Next ipatienten
    23. Next i
    24. End If
    25. End If
    26. Next izeiten
    27. End If
    28. Next wks
    4-fach For-Schleife zzgl. If-Statements. Also, wenn Du da noch durchblickst, dann herzlichen Glückwunsch.
    Ich werd mich mit weiteren Lösungen und Beiträgen insoweit zurückhalten, da Dein Problem etwas zuviel von meiner Freizeit verschlingt.

    Hilfe zur Selbsthilfe: Mach es doch anderweitig noch Schritt für Schritt: Kommentier die Zeilen 15 bis 29 erstmal aus und schau, ob die verbleibenden Anweisungen das machen, was sie sollen. Notfalls per Haltepunkt, Variablenwertanzeige und MsgBox. Wenn z.B. die For-Schleifen den Bereich abdecken, der gewollt ist, ok. Dann tiefer in die Struktur rein, will heißen: die Kommentierung Zeile für Zeile aufheben. Wieder in Quelltabelle und Zieltabelle schauen, ob die Werte und Zuordnungen passen. Dadurch kannst Du Dich Schritt für Schritt Deiner Lösung nähern.
    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.«
    Danke bis hierhin. Sollte ich dennoch an einen Punkt nicht so ganz weiter kommen (ich werde natürlich erstmal rumprobieren und ein Ergebnis erzeugen). Komme ich nochmal wieder. Und danke für deine Zeit. Es hat mir schon sehr geholfen, zumindest die Richtung gezeigt zu bekommen. :)
    Ich bin jetzt soweit, dass zumindest der erste Wert komplett in die erste Zeile von Export übertragen wird. Bekomme aber nicht hin, den Offset also den Sprung in die nächste Zeile und Spalte zu machen.
    Kann mir jemand sagen, wo und wie ich den platzieren muss?

    Freue mich über Feedback.

    Datei auch anbei.(frmMain, btn_export "Daten exporteiren", Zeile 20)

    VB.NET-Quellcode

    1. For Each wks In Worksheets
    2. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then 'arbeitsblatt prüfen
    3. ' ColZeit = wks.Range(wks.Cells(RowZeit, 1), wks.Cells(RowZeit, 1).End(xlDown)).Rows.Count
    4. ColZeit = wks.Cells(6, 1).End(xlDown).Rows
    5. For x = 0 To ColZeit 'erste zeit bis letzte zeit
    6. wks.Cells(3, 1).Copy Destination:=Worksheets(target).Cells(2 + x, 2) 'jahr fix
    7. wks.Cells(4, 1).Copy Destination:=Worksheets(target).Cells(2 + x, 3) 'monat fix
    8. wks.Cells(2, ColTag).Copy Destination:=Worksheets(target).Cells(2 + x, 4) 'tag spaltenvariabel, zeilenfix
    9. warry() = Split(Worksheets(target).Cells(2 + x, 4), ",")
    10. For counter = LBound(warry) To UBound(warry)
    11. strg = warry(counter)
    12. Worksheets(target).Cells(2 + x, counter + 4).Value = Trim(strg)
    13. Next counter
    14. Worksheets(target).Cells(2 + x, 5) = Format(Worksheets(target).Cells(2 + x, 5), "dd.mm.yyyy")
    15. wks.Cells(RowZeit, 1).Copy Destination:=Worksheets(target).Cells(2 + x, 6) 'zeit spaltenfix, zeilenvariabel
    16. wks.Cells(5, ColAktu).Copy Destination:=Worksheets(target).Cells(2 + x, 7) 'therapeut spaltenvariabel,zeilenfix
    17. wks.Cells(RowPatient, ColAktu).Copy Destination:=Worksheets(target).Cells(2 + x, 8) 'patient variabel
    18. warry() = Split(Worksheets(target).Cells(2 + x, 8), "|")
    19. For counter = LBound(warry) To UBound(warry)
    20. strg = warry(counter)
    21. Worksheets(target).Cells(2 + x, counter + 8).Value = Trim(strg)
    22. Next counter
    23. Worksheets(target).Cells(2 + x, 1) = RowID 'id
    24. x = x + 1
    25. Next x
    26. End If
    27. Next wks
    Dateien
    • 2017 - up.zip

      (185,79 kB, 22 mal heruntergeladen, zuletzt: )
    Was ist "warry"?
    Warum in Zeile 10+19 LBound to UBound? Ist LBound bei Dir je was anderes als Null?
    Warum in Zeile 24 x = x + 1, wenn Du eh schon in einer For-Schleife mit x unterwegs bist?
    Wo wird RowID gesetzt/erhöht? Oder sollte das in Zeile 24 passieren?
    Wo ist das Spaltenoffset, welches nach jedem abgeschlossenen Tag um Therapeutenanzahl erhöht wird?
    Was bedeutet "strg" ausgesprochen bei Dir (Zeile 11)? Steuerung?
    Wo wird wie colAktu aus Zeile 16/17 verändert?
    Wo gehst Du die ganzen Therapeuten pro Tag durch und schaust, ob bei denen bei ner bestimmten Zeit überhaupt was eingetragen ist?
    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.«
    Warry ist nur der Array für den Split beim Patient und bei Datum. Daher auch U und LBound..das hat aber gut funktioniert, finde ich. Da gehört auch das "strg" dazu..hab es in einem Tutorial so abgelesen, war mein erster Split Versuch...stand leider nicht dabei warum es zu abgekürzt war, vermute mal sowas wie string.
    Ja mit dem x bin ich die Ganze Zeit schon am hadern..ich wollte eigentlich nur zum nächsten Wert (Zeile)...dann kam mir das mit dem Offset.
    RowID wird noch nirgends hoch gesetzt, genauso wie alle anderen Werte (da hader ich auch).
    Genau diesen Spalten Offset versuche ich gerade unterzubringen, damit der Therapeut abschließt und der nächste kommt.
    ColAktu wird auch noch nicht verändert, wollte erstmal schaffen in die nächste Zeile zu kommen, bevor die nächste Spalte kommt.
    Das mit dem Therapeuten überspringen habe ich vor kurzem auch überlegt und mir so gedacht:
    Ich geb zu, dass ich nicht so ohne...

    VB.NET-Quellcode

    1. Dim rng As Range, x As Integer
    2. For Each wks In Worksheets
    3. If Left(wks.Name, 4) = Left(ThisWorkbook.Name, 4) Then
    4. x = 5
    5. Set rng = wks.Cells(6, 2 + x).End(xlDown).Rows.Find("*", LookIn:=xlValues, lookat:=xlWhole)
    6. If Not rng Is Nothing Then
    7. MsgBox ("Vorhanden")
    8. Else
    9. wks.Cells(6, 2 + x).Offset(0, 2).Select
    10. End If
    Du gehst ja einen Tag von morgens bis abends durch, bevor Du zum nächsten tag wechselst, richtig? Und innerhalb einer Zeit gehst Du jeden Therapeuten durch =>
    äußerste bzw. 1. Schleife: die Tage
    2. Schleife: die Uhrzeit
    3. Schleife (die innerste) die Therapeuten

    Gib mal nur die Schleifenköpfe als Code für die 3 Schleifen an, die Deiner Meinung nach passend sind.
    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.«
    ja genau soweit habe ich theoretisch auch überlegt bzw. prüfe ich nach dem tagzuerst ob ein der Therapeut überhaupt etwas hat und wenn nicht, gehe ich gleich zum nächsten oder gehört das dann woanders dazu?

    die drei Schleifenköpfe als Code...ich kann dir nicht ganz folgen?
    Schleifenköpfe in Code: For i = 0 to ... oder Do Until x = ... eben. Damit wir sehen können, ob die dortigen Bedingungen sinnvoll sind.
    Eben von den 3 von mir beschriebenen. Und dazu noch, welche Reihenfolge Du als sinnvoll erachtest. Vielleicht hast Du eine andere als die in Post#15 von mir vorgeschlagene.
    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.«
    Reihenfolge:
    1. Erst prüfen ober Therapeut einen Patient hat, sonst nächste Spalte.
    2. Wenn Therapeut einen Patient hat dann den Tag prüfen (wenn leer dann x spalten zurück den tag wählen)
    3. dann eine do until schleife für die Patienten anhand der Zeit und prüfen ob zu der jeweiligen Zeit ein Patient eingetragen ist.
    4. Wenn zu einer Zeit kein Patient dann überspringen, ansonsten für jeden Zeitpunkt eine neue Zeile mit Patient, Tag, Therapeut, Jahr, Monat.

    das wäre meine Vorstellung...nur irgendwie weniger ifs...

    VB.NET-Quellcode

    1. For Each wks In Worksheets
    2. If Left(wks.Name, 4) = Right(tb_workbook.Text, 4) Then
    3. x = 0 'anzahl benutzter spalten beim therapeuten
    4. Set rng = wks.Cells(6, 2 + x).End(xlDown).Rows.Find("*", LookIn:=xlValues, lookat:=xlWhole) 'patieten bereich auf leer prüfen
    5. If Not rng Is Nothing Then
    6. If wks.Cells(2, 2 + x) = "" Then
    7. Worksheets(target).Cells(2, 4) = wks.Cells(2, 2 + x - x) 'tag zurück wenn leer
    8. Else
    9. Worksheets(target).Cells(2, 4) = wks.Cells(2, 2 + x) 'tag
    10. End If
    11. Worksheets(target).Cells(2, 7) = wks.Cells(5, 2 + x) 'therapeut
    12. For y = 1 To wks.Cells(6, 1).End(xlDown).Rows 'letze zeit zeile
    13. If rng = "" Then
    14. Next
    15. Else
    16. Worksheets(target).Cells(2, 8) = wks.Cells(6 + y, 2 + x) 'patient
    17. End If
    18. Next
    19. Else
    20. 'nächste spalte
    21. End If
    22. End If
    23. Next


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

    Ich bat absichtlich nur um die Schleifenköpfe und deren Reihenfolge, nicht um die ganzen Schleifen mit allem drum und dran. Je mehr Code Du postest, desto anstrengender wird es für uns jenen zu lesen und DIr weiterzuhelfen.
    Deine Schleifen-Reihenfolge hat natürlich direkten Einfluss auf die Sortierung in der Endtabelle.

    Zeile 3: Der Kommentar ist verwirrend. Welchen Verwendungszweck hat x? Nun, ich weiß es, denn ich kann es mir aus dem Code erschließen. Aber mit der Zeile verpasst Du dem Leser eine Ohrfeile links und rechts. Einmal weil der Variablenname absolut nichts über den Verwendungszweck sagt und dann noch der Kommentar einfach den Leser auf die falsche Fährte führt.
    Zeile 7: + x - x: x minus x gleich 0 => lass die beiden x gleich weg
    nochmal Zeile 7: Was soll das bewirken? Willst Du nur einen Therapeuten auswerten? Nein. Oder hat sich Dein Quelltabellendesign verändert? Nein, hat es sich nicht. Aber immer auf wks.Cells(2, 2) zu verweisen, schreibt in Deine Zieltabelle immer den ersten Tag des Monats.
    Zu Zeile 15: Ein Next ist dort nicht möglich. VBA kennt leider kein Continue For. Man könnte mit Goto arbeiten, dieses Schlüsselwort steht aber auf der code-smell-Liste => wer sowas verwendet, dem muss unterstellt werden, dass die Codequalität auch an anderen Stellen fragwürdig ist.
    Daher wieder mein Vorschlag: Aufteilung der Schleifen in Einzelfunktionen.
    Wo wird x erhöht?

    Je weniger Du die Gesamtaufgabe in Einzelteile aufteilst (nicht nur von der Codestruktur, sondern auch von dem Code, den Du zusammenbaust und auch noch postest), desto länger, anstrengender und frustrierender wird es, endlich zur Lösung zu kommen.
    Folgendes klingt vielleicht etwas fies: Viele von uns, die sich etwas in Deinen Code eingearbeitet haben, könnten Dir ne funktionierende Lösung präsentieren. Aber das ist weder Sinn noch Zweck des Forums. Es geht um Hilfe zur Selbsthilfe. Um Probleme, bei denen man aus Wissensmangel nicht weiterkommt. Aber hier geht es weniger um Wissensmangael als um Struktur- und Debugdefizite, die Dich von der Lösung abhalten. Ohne Herunterbrechen des Problems in winzige Schritte/Teilprobleme wird es Dir nie effizient gelingen, ein großes Programmierproblem zu lösen.
    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“ ()

    Das war mein Fehler, ist es so von der Verständlichkeit so besser? Ja du hast wohl recht, dann lieber Mini-Schritt machen...

    VB.NET-Quellcode

    1. For Each wks In Worksheets
    2. 'arbeitsblatt prüfen
    3. If Not patienten_termine Is Nothing Then
    4. 'weiter, ansonsten nächste spalte
    5. If Not zelle_tag Is Nothing Then
    6. 'tag auswählen, ansonsten spalte zurück und den tag auswählen
    7. For i = 1 To patienten_termine
    8. 'prüfen ob zelle leer ist, wenn ja dann nächste zeile

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