Doppelte For Funktion

  • Excel

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

    Hmm.. 8| hab es es eben geprüft hatte nur eine Zeile etwas weiter nach oben getan :rolleyes: und das hat schon gereicht um es zu crashen.
    So nun ist mir aufgefallen, dass der 1. Januar im Arbeitsblatt mit Montag beginnt. Der 1. Januar 2017 war Sonntag. Muss da noch was beim "Weekday" angepasst werden?

    Edit: Hab jetzt weekay mit vbmonday ergänzt aber dann ist mir aufgefallen cb_monat hat ja auch eine Leerzeile in der Liste. Führt das zu der Abweichung?
    Nur wenn bei mir vbSunday steht, läuft es richtig. Das mit cb_monat führt nur zur korrekten Monatsberechnung. Die Leerzeile ist der 1. Eintrag => steht für Index 0 => die anderen Monate sind abhängig vom Listeneintragsplatz korrekt durchnummeriert. Wenn Du die Leerzeile wegnimmst, musst Du die Codezeilen mit cb_Monat.ListIndex zu (cb_Monat.ListIndex + 1) ändern.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja bei mir auch :thumbup: ..dann lass ich vbSunday.

    Wenn ich nun in der ComboBox in frmTermin, alle diese Tage die aufs Blatt geschrieben wurde eintragen möchte. Wie muss ich dann die Zeilen und Spalten Erkennung definieren?
    Ich hatte das so versucht aber das passt ja hinten und vorne nicht...

    VB.NET-Quellcode

    1. fspalte = ThisWorkbook.ActiveSheet.Cells(2, ActiveSheet.Columns.Count).End(xlToLeft).Column
    2. cb_tag.List = ThisWorkbook.ActiveSheet.Cells(2, fspalte).Value


    EDIT:
    Alternativ hattte ich auch mal das hier aber dann kommt nur die letzte Zeile ;(

    VB.NET-Quellcode

    1. fspalte = ThisWorkbook.ActiveSheet.Cells(2, ActiveSheet.Columns.Count).End(xlToLeft).Column
    2. For Each rng In Cells(2, fspalte)
    3. If rng <> "" Then cb_tag.AddItem rng
    4. Next

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

    Muss jetzt selber zur Arbeit, von daher bis später.
    Aber Deine letzte Anfrage versteh ich wieder mal nur halb. Bis ich herausgefunden hatte, welche ComboBox Du meinst, verging unnötig Zeit.

    Visual Basic-Quellcode

    1. fspalte = ThisWorkbook.ActiveSheet.Cells(2, ActiveSheet.Columns.Count).End(xlToLeft).Column
    2. cb_tag.List = ThisWorkbook.ActiveSheet.Cells(2, fspalte).Value
    find ich im bisherigen Code nicht. Aber da nun nicht in jeder Zelle der 2. Zeile ein Datum steht, muss da natürlich weitergeschaut werden.
    Entweder BruteForce: "Schreibe aus Zeile 2 ab Spalte 2 alle Daten raus, die Du finden kannst, zähle dabei die Leerzellen; wenn Du wieder was
    gefunden hast, dann setz den Leerzellenzähler auf Null; wenn 20x ne Leerzelle kam, dann Ende" Oder ne Berechnung mithilfe der
    Therapeutenzahl wieweit Excel die Spalten in Zeile 2 nach Werten schauen soll.

    Eh... mir fällt grad ein: Warum trägst Du nicht einfach in der Erstellungsschleife in FrmMain Deine Tage in die ComboBox von FrmTermin ein?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    hmm. du hast Recht würde ja am Ende den gleichen Effekt haben :S alternativ hatte ich damit angefangen (war leider nur ein EDIT Eintrag von mir).


    Sam85 schrieb:

    EDIT:
    Alternativ hattte ich auch mal das hier aber dann kommt nur die letzte Zeile

    VB.NET-Quellcode

    1. fspalte = ThisWorkbook.ActiveSheet.Cells(2, ActiveSheet.Columns.Count).End(xlToLeft).Column
    2. For Each rng In Cells(2, fspalte)
    3. If rng <> "" Then cb_tag.AddItem rng
    4. Next



    Dann Danke ich dir sehr für deine Hilfe :thumbsup: und entschuldige nochmal, dass ich manchmal die Dinge etwas umständlich erkläre.
    Bis später und viel Spass auf der Arbeit.
    @VaporiZed

    Wenn du wieder da bist, ich habe über deine Aussage ob ich Tage weglassen will nachgedacht. Ich habe meinen ursprünglichen Kalender angepasst (siehe Bild), so dass nur noch die aktiven Tage angezeigt werden.
    Nun richtet sich der Code aber gar nicht daran. Kann ich irgendwie...

    VB.NET-Quellcode

    1. datum = CDate(y & "." & cb_monat.ListIndex & "." & Right(tb_workbook.Text, 4))
    2. Cells(2, ofs * (y - 1) + 2).Value = WeekdayName(Weekday(datum), True, vbSunday) & ", " & y & "."


    ...anpassen so das ich an das Listobject("dt_Kalender") anknüpfe? Die Columns.name wären ja die gleichen wie in der ComboBox cb_monat

    Orientierung: Form "frmMain", Button "btn_month" "Monat erzeugen", Zeile 161. Hoffe das ist etwas besser definiert. Anbei auch die aktuelle Datei.

    VB.NET-Quellcode

    1. fspalte = ActiveSheet.Cells(5, ActiveSheet.Columns.Count).End(xlToLeft).Column + 1
    2. datatherapeut = frmTherapeut.lb_therapeut.ListCount - 1
    3. frmTherapeut.lb_therapeut.RowSource = "dt_Therapeut[Nachname_Therapeut]"
    4. For y = 1 To (tbl.ListColumns(monat).DataBodyRange.Count - wsf.CountBlank(tbl.ListColumns(monat).DataBodyRange))
    5. ofs = frmTherapeut.lb_therapeut.ListCount
    6. Set datacells = Range(Cells(5, fspalte), Cells(5, fspalte).Offset(0, datatherapeut))
    7. datum = CDate(y & "." & cb_monat.ListIndex & "." & Right(tb_workbook.Text, 4))
    8. Cells(2, ofs * (y - 1) + 2).Value = WeekdayName(Weekday(datum), True, vbSunday) & ", " & y & "."
    9. For i = 0 To frmTherapeut.lb_therapeut.ListCount - 1
    10. datacells(1, ofs * (y - 1) + i + 1) = frmTherapeut.lb_therapeut.List(i, 0)
    11. datacells(1, ofs * (y - 1) + i + 1).ColumnWidth = 30
    12. Next i
    13. Next y
    Bilder
    • Bild.PNG

      47,12 kB, 1.504×696, 103 mal angesehen
    Dateien
    • 2017 - upload.zip

      (171,87 kB, 78 mal heruntergeladen, zuletzt: )

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

    Vielleicht kann mir hierbei auch jemand anders helfen. (siehe Post darüber). Im Grund geht es darum, das die Werte vom Datum aus dem Monat erzeugt werden, nun war der Anstoss gegeben worden Feiertrage, Wochenenden etc. auszuschließen. Dafür habe ich auch bereits den entsprechenden Kalender, um überflüssige Daten beim einlesen der Spalte auszuschließen. Wie bekomme ich es nun hin, die Tabellenspalte als Ausgangspunkt der Erzeugung zu nutzen. Die Spaltenüberschrift ist auch der Text aus der ComboBox.
    Hach ja, hab nur immer kurz in der Arbeit reingeschaut, aber bisher keine Zeit gehabt, sinnvoll zu antworten.
    Ok, also Du hast nen vorgefertigten Kalender. Und da sollen jetzt die Therapeutennamen rein, aber nur, wenn ein Werktag ist, richtig? Oder soll (noch) was anderes rein?
    Bzgl. Feiertage: Ist der bei Dir bestehende Kalender zuverlässig? Stichwort bewegliche Feiertagen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Ja, der sollte relativ exakt sein, (auch bewegliche Feiertage, hab da eine Formel gefunden gehabt und auch getestet) jetzt nicht zwingend für alle Bundesländer aber ich kann dafür sicher auch eine Möglichkeit finden, es dynamisch zu halten. Der Kalender ist auch in der upgeloadeten Version, hab sie vorhin erneuert.

    Aber erstmal zu dem Anderen:

    Ich bin eigentlich noch an der Form von vorgestern, da hast du ja dafür gesorgt, das die Therapeuten Namen anhand des Monats auf das Arbeitsblatt gestellt wurden, anhand der Tage eines Monats.
    Nun war dein Anstoß, Tage auszulassen. Nun weiß ich nicht in wie weit dafür eine VBA Codierung umzusetzen ist, daher habe ich mich rudimentär für einen separaten Kalender als ListObject entschieden. Theoretisch kann ich doch nun eine Spalte (Spalten Name ist entsprechende des Monats zum Erzeugen des Arbeitsblattes) als Kriterium nutzen anstatt...

    VB.NET-Quellcode

    1. datum = CDate(y & "." & cb_monat.ListIndex + 1 & "." & Right(tb_workbook.Text, 4))
    2. Cells(2, ofs * (y - 1) + 2).Value = WeekdayName(Weekday(datum), True, vbSunday) & ", " & y & "."


    ... dem hier oder?

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

    Ah, also soll nicht der Kalender gefüllt/manipuliert werden, sondern das Tabellenblatt mithilfe des Kalenders, um das es gestern ging. Jetzt ist's klar.
    Ok, eines blick ich noch nicht: Wo finde ich den Kalender in Deinem Projekt?

    EDIT: Hab ihn.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Einfach einblenden heißt Kalender. :) Genau, manipulieren bzw. füllen funktioniert eigentlich schon. Mit Doppelklick öffnet sich die Form und dann kann man Befehle ausführen.
    Mein Vorschlag: direkt nach der Zeile mit For y = 1 To einen If-Block erzeugen, der bis Next i geht, sodass das entsprechende End If zwischen Next i und Next y steht. Die Bedingung müsste dann so lauten, dass das aktuell bearbeitete Datum in der Schleife mit dem passenden Kalendereintrag abgeglichen wird, eben ob im Kalender was drinsteht, also z.B: If Sheets("Kalender").Cells(y + 1, cb_monat.ListIndex + 1).Value <> "" Then
    WICHTIG: Wenn Du es dabei belässt, bleiben die betroffenen Spalten in der erzeugten Tabelle leer, da in dem Schleifencode y zur Festlegung der zu beschreibenden Spalte verwendet wird. y darfst Du dann nicht mehr verwenden, sondern musst eine neue Integer-Variable einführen, die zwar auch mit 1 startet, aber nur erhöht wird, wenn kein freier Tag war. Das schaffst Du ;)
    btw: Jeden Tag in KalenderX zu markieren, ob er Feiertag oder was anderes ist, ist ... mühsam. @VB1963 hatte da mal ne passende Funktion zusammengeschraubt, die auch die beweglichen Feiertage mit Spencers Osterformel berechnet.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Es gibt noch ein weiteres Tabellenblatt mit der Berechnung der Feiertage so das nichts händisch gemacht werden muss, bis auf den Jahreswechsel. :) Das Blatt heisst Feiertag und muss auch erst eingeblendet werden. Aber ich werde eine weitere Form einbauen, da es ja auch wie dieses Jahr vorkommen kann, dass ein Feiertag Jubiläum hat. Ansonsten werden ich für Samstag und Sonntag ebenfalls steuern lassen, wie in Kalenderx schon zu sehen. Dann baue ich eine variable ein und stell sie mit in die Form, so das man manuell Switchen kann. :) ​ Danke für die Ideen.

    ​Gut dann versuche ich mich mal den deinen Vorschlag mit dem Code. Falls ich wieder in Schwierigkeiten gerade, melde ich mich nochmal aber natürlich versuche ich es gerne :thumbsup: vielen Dank für deine Hilfe.
    @VaporiZed

    Ich bin jetzt nicht sicher ob es so wirklich sinnvoll ist, was ich da zusammen gebastelt habe. Dort wo "" steht wird dafür ein leeres Element erstellt anstatt übersprungen zu werden.
    Zudem werden die Tage auch falsch berechnet. Das könnte sicher auch daran liegen, dass ich...

    ​EDIT: Das hat sicher erledigt, dafür läuft etwas anderes nicht...

    VaporiZed schrieb:

    WICHTIG: Wenn Du es dabei belässt, bleiben die betroffenen Spalten in der erzeugten Tabelle leer, da in dem Schleifencode y zur Festlegung der zu beschreibenden Spalte verwendet wird. y darfst Du dann nicht mehr verwenden, sondern musst eine neue Integer-Variable einführen, die zwar auch mit 1 startet, aber nur erhöht wird, wenn kein freier Tag war. Das schaffst Du


    ...etwas möglichweise nicht richtig verstanden bzw. beachtet habe. Wenn ich das jetzt richtig deute soll das neue y = x oder etwas anderes werden und das als integer. Und ich muss den Wert von 1 bis zur Anzahl nicht leerer Zeilen in der Spalte anpassen. Ist das richtig interpretiert? Dann muss auch noch ein weiteres For Next dazu, dass vor dem neuen IF beginnt und vor dem next y endet?

    VB.NET-Quellcode

    1. Dim x As integer
    2. For y = 1 To (tbl.ListColumns(monat).DataBodyRange.Count - wsf.CountBlank(tbl.ListColumns(monat).DataBodyRange))
    3. For x = 1 To (tbl.ListColumns(monat).DataBodyRange.Count - wsf.CountBlank(tbl.ListColumns(monat).DataBodyRange))
    4. If Sheets("Kalender").Cells(x + 1, cb_monat.ListIndex + 1).Value <> "" Then
    5. ofs = frmTherapeut.lb_therapeut.ListCount
    6. Set datacells = Range(Cells(5, fspalte), Cells(5, fspalte).Offset(0, datatherapeut))
    7. datum = CDate(y & "." & cb_monat.ListIndex & "." & Right(tb_workbook.Text, 4))
    8. Cells(2, ofs * (y - 1) + 2).Value = WeekdayName(Weekday(datum), True, vbSunday) & ", " & y & "."
    9. For i = 0 To frmTherapeut.lb_therapeut.ListCount - 1
    10. datacells(1, ofs * (y - 1) + i + 1) = frmTherapeut.lb_therapeut.List(i, 0)
    11. datacells(1, ofs * (y - 1) + i + 1).ColumnWidth = 30
    12. Next i
    13. End If
    14. Next x
    15. Next y


    EDIT: Ok, das war schon mal nichts :S
    Bilder
    • Bild 1.PNG

      39,31 kB, 1.491×590, 84 mal angesehen

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

    Ich hatte nix von ner zusätzlichen Schleife gesagt.
    Einfach Dim x As Integer und x = 0 und dann nach der Zeile If Sheets("Kalender"): x = x + 1
    Und überall dort, wo in dem If-Block noch y steht, muss x hin.
    Erläuterung:
    y ist dafür da, alle Tage durchzugehen.
    x ist dafür da, die Spaltenkoordinate zu bestimmen und wird nur erhöht, wenn an Tag y ein Werktag ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Also ungefähr so... y ist sozusagen der große Kreis um den kleinen Kreis x...

    ich hab das jetzt mal so ausprobiert, doch das klappt nicht, dann habe ich das x in dem IF Clause zum y gemacht aber es klappt immer noch nicht (wobei ich denke, dass das sowieso nicht sein sollte) ... ;( 8| puhh...

    VB.NET-Quellcode

    1. Dim x As Integer
    2. x = 0
    3. For y = 1 To (tbl.ListColumns(monat).DataBodyRange.Count - wsf.CountBlank(tbl.ListColumns(monat).DataBodyRange))
    4. If Sheets("Kalender").Cells(x + 1, cb_monat.ListIndex + 1).Value <> "" Then
    5. x = x + 1
    6. ofs = frmTherapeut.lb_therapeut.ListCount
    7. Set datacells = Range(Cells(5, fspalte), Cells(5, fspalte).Offset(0, datatherapeut))
    8. datum = CDate(x & "." & cb_monat.ListIndex & "." & Right(tb_workbook.Text, 4))
    9. Cells(2, ofs * (x - 1) + 2).Value = WeekdayName(Weekday(datum), True, vbSunday) & ", " & x & "."
    10. For i = 0 To frmTherapeut.lb_therapeut.ListCount - 1
    11. datacells(1, ofs * (x - 1) + i + 1) = frmTherapeut.lb_therapeut.List(i, 0)
    12. datacells(1, ofs * (x - 1) + i + 1).ColumnWidth = 30
    13. Next i
    14. End If
    15. Next y


    VB.NET-Quellcode

    1. If Sheets("Kalender").Cells(y + 1, cb_monat.ListIndex + 1).Value <> "" Then

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

    y enthält nur die Anzahl der Werktage, was ja nun nicht mehr passt, da alle Tage quasi auf die Eigenschaft "Werktag" durch Vergleich mit dem Kalender geprüft werden.

    Hier das funktionierende Codefragment:

    Visual Basic-Quellcode

    1. Dim x As Integer
    2. x = 0
    3. For y = 1 To (tbl.ListColumns(monat).DataBodyRange.Count)
    4. If Sheets("Kalender").Cells(y + 1, cb_monat.ListIndex + 1).Value <> "" Then
    5. x = x + 1
    6. ofs = frmTherapeut.lb_therapeut.ListCount
    7. Set datacells = Range(Cells(5, fspalte), Cells(5, fspalte).Offset(0, datatherapeut))
    8. datum = CDate(y & "." & cb_monat.ListIndex + 1 & "." & Right(tb_workbook.Text, 4))
    9. Cells(2, ofs * (x - 1) + 2).Value = WeekdayName(Weekday(datum), True, vbSunday) & ", " & y & "."
    10. For i = 0 To frmTherapeut.lb_therapeut.ListCount - 1
    11. datacells(1, ofs * (x - 1) + i + 1) = frmTherapeut.lb_therapeut.List(i, 0)
    12. datacells(1, ofs * (x - 1) + i + 1).ColumnWidth = 30
    13. Next i
    14. End If
    15. Next y
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank @VaporiZed

    ​war eine schwere Geburt für mich...und für dich vermutlich noch mehr..es hätte also kein Abzug mehr erfolgen müssen bei y. ||

    :thumbsup: ​dafür geht es jetzt. Vielen Dank dafür...