Hi,
Ich möchte aus einem Formular wiederkehrende Termine für einen bestimmten Zeitraum in eine Tabelle schreiben. Immer im Monatsintervallen Im Formular habe ich die Felder:
txtEventStart (Startdatum der Terminserie)
txtEventEnd (Enddatum der Terminserie)
txtInterval (alle wieviel Monate wiederholt werden soll)
txtEventDescrption (Beschreibung des Termins)
Mittels diesem VBA Code:
Private Sub cmdSave_Click()
Dim rst As DAO.Recordset
Dim i As Long
Dim r As Long
Set rst = CurrentDb.OpenRecordset("SELECT EventDate, EventSubject FROM tblEvent")
r = Me.txtEventEnd
For i = Me.txtEventStart To r
With rst
If DateDiff("m", i, Me.txtEventStart) Mod Me.txtInterval = 0 Then
.AddNew
!EventDate = DateAdd("m", Me.txtInterval, i)
!EventSubject = Me.txtEventDescrption
.Update
End If
End With
Next i
rst.Close
Set rst = Nothing
End Sub
möchte ich es in die Tabelle tblEvent schreiben das klappt auch so weit... nur werden die Daten zwischen den Terminen einfach aufgefüllt, was ja nicht sein soll. Wenn ich z.B. heute als Startdatum hätte und das Enddatum 2 Jahre später müssen 3 Termine generiert werden 12.01.2019, 12.07.2019, 12.01.2020
Aber das Ergebnis sieht leider so aus:
was ist falsch an meinem Script ich hab jetzt stundenlang versucht das zu lösen aber komme nicht mehr weiter....
tblEvent
EventID EventDate EventSubject
706079 12.07.2019 grbrehzfe
706080 13.07.2019 grbrehzfe
706081 14.07.2019 grbrehzfe
706082 15.07.2019 grbrehzfe
706083 16.07.2019 grbrehzfe
706084 17.07.2019 grbrehzfe
706085 18.07.2019 grbrehzfe
706086 19.07.2019 grbrehzfe
706087 20.07.2019 grbrehzfe
706088 21.07.2019 grbrehzfe
706089 22.07.2019 grbrehzfe
706090 23.07.2019 grbrehzfe
706091 24.07.2019 grbrehzfe
706092 25.07.2019 grbrehzfe
706093 26.07.2019 grbrehzfe
706094 27.07.2019 grbrehzfe
706095 28.07.2019 grbrehzfe
706096 29.07.2019 grbrehzfe
706097 30.07.2019 grbrehzfe
706098 31.07.2019 grbrehzfe
706099 01.01.2020 grbrehzfe
706100 02.01.2020 grbrehzfe
706101 03.01.2020 grbrehzfe
706102 04.01.2020 grbrehzfe
706103 05.01.2020 grbrehzfe
706104 06.01.2020 grbrehzfe
706105 07.01.2020 grbrehzfe
706106 08.01.2020 grbrehzfe
706107 09.01.2020 grbrehzfe
706108 10.01.2020 grbrehzfe
706109 11.01.2020 grbrehzfe
706110 12.01.2020 grbrehzfe
706111 13.01.2020 grbrehzfe
706112 14.01.2020 grbrehzfe
706113 15.01.2020 grbrehzfe
706114 16.01.2020 grbrehzfe
706115 17.01.2020 grbrehzfe
706116 18.01.2020 grbrehzfe
706117 19.01.2020 grbrehzfe
706118 20.01.2020 grbrehzfe
706119 21.01.2020 grbrehzfe
706120 22.01.2020 grbrehzfe
706121 23.01.2020 grbrehzfe
706122 24.01.2020 grbrehzfe
706123 25.01.2020 grbrehzfe
706124 26.01.2020 grbrehzfe
706125 27.01.2020 grbrehzfe
706126 28.01.2020 grbrehzfe
706127 29.01.2020 grbrehzfe
706128 30.01.2020 grbrehzfe
706129 31.01.2020 grbrehzfe
706130 01.07.2020 grbrehzfe
706131 02.07.2020 grbrehzfe
706132 03.07.2020 grbrehzfe
706133 04.07.2020 grbrehzfe
706134 05.07.2020 grbrehzfe
706135 06.07.2020 grbrehzfe
706136 07.07.2020 grbrehzfe
706137 08.07.2020 grbrehzfe
706138 09.07.2020 grbrehzfe
706139 10.07.2020 grbrehzfe
706140 11.07.2020 grbrehzfe
706141 12.07.2020 grbrehzfe
706142 13.07.2020 grbrehzfe
706143 14.07.2020 grbrehzfe
706144 15.07.2020 grbrehzfe
706145 16.07.2020 grbrehzfe
706146 17.07.2020 grbrehzfe
706147 18.07.2020 grbrehzfe
706148 19.07.2020 grbrehzfe
706149 20.07.2020 grbrehzfe
706150 21.07.2020 grbrehzfe
706151 22.07.2020 grbrehzfe
706152 23.07.2020 grbrehzfe
706153 24.07.2020 grbrehzfe
706154 25.07.2020 grbrehzfe
706155 26.07.2020 grbrehzfe
706156 27.07.2020 grbrehzfe
706157 28.07.2020 grbrehzfe
706158 29.07.2020 grbrehzfe
706159 30.07.2020 grbrehzfe
706160 31.07.2020 grbrehzfe
706161 01.01.2021 grbrehzfe
706162 02.01.2021 grbrehzfe
706163 03.01.2021 grbrehzfe
706164 04.01.2021 grbrehzfe
706165 05.01.2021 grbrehzfe
706166 06.01.2021 grbrehzfe
706167 07.01.2021 grbrehzfe
706168 08.01.2021 grbrehzfe
706169 09.01.2021 grbrehzfe
706170 10.01.2021 grbrehzfe
706171 11.01.2021 grbrehzfe
706172 12.01.2021 grbrehzfe
Hallo,
Zitatnur werden die Daten zwischen den Terminen einfach aufgefüllt, was ja nicht sein soll.
Wie soll es denn sein? Was heißt "zwischen den Terminen"?
Hi,
es soll z.B. alle 6 Monate (wird über Interval eingegeben) ein Termin erstellt werden über den Zeitraum der über Start und Enddatum eingegeben wird.
In der angehängten Tabelle kannst Du sehen das der erste Termin richtig esrtellt wird... dann wir warum auch immer der Monat voll gemacht mit Terminen erst dann kommt wieder der 6 Monatssprung natürlich dann auch zum 1. und nicht zum 12. ... ich weiß nicht warum da der Monat immer voll gemacht wird ....
also wenn ich heute generiere müssten diese 3 Termine erstellt werden:12.01.2019, 12.07.2019, 12.01.2020 es wird aber ebend zwischen den Beiden Terminen immer der Monat vom Termin mit Daten aufgefüllt 12.01.2019 stett jetzt den zweiten termin zu bringen wird bis 31.01.2019 für jeden Tag ein Termin erstellt erst dann kommt wieder der Sprung von 6 Monaten.
For i = Me.txtEventStart To r
' ...
!EventDate = DateAdd("m", Me.txtInterval, i)
Deine Schleife zählt das Startdatum jeweils um 1 (=> einen Tag) hoch. Damit erhältst Du das gezeigte Ergebnis.
Man würde eher so etwas ansetzen:
!EventDate = DateAdd("m", Me.txtInterval * i, Me.txtEventStart)
... und dabei die Schleifengrenzen passend setzen.
Mit einer einfachen Zahlenhilfstabelle braucht man dann gar keine Schleife, sondern arbeitet mit einer performanteren Abfrage:
Grundlagen - SQL ist leicht (1) - Hilfstabellen (https://www.ms-office-forum.net/forum/showthread.php?t=298414)
ZitatMan würde eher so etwas ansetzen:
Code: [Auswählen]
!EventDate = DateAdd("m", Me.txtInterval * i, Me.txtEventStart)
... und dabei die Schleifengrenzen passend setzen.
das verursacht bei mir einen Fehler beim Prozeduraufruf... So ganz verstanden habe ichs auch nicht ;) Werde trotzdem mir das mit den Hilfstabellen mal ansehen....
"so etwas" ... ist jetzt auch kein vollständiger kopierfähiger Code zur 1:1-Verwendung, sondern soll Denkanstoß sein.
Zitat"so etwas"
;D
tut mir leid ich stehe voll auf der Leitung, check das irgendwie nicht. Ich sage ja mit DateAdd("m", 6, i) das er 6 Monate draufaddieren soll, macht er ja auch beim ersten Datum. Ich komme nur nicht drauf wie ich jetzt der Schleife sage das sie beim nächsten Durchlauf auch 6 Monate weiter gehen soll... Da hab ich gerade voll die Blockade...
Zum Hinzufügen von Folgeterminen (etwas verallgemeinert):
For i = 1 To Endwert
Debug.Print DateAdd("m", Intervall * i, Startdatum)
Next
... wobei der Endwert aus der Differenz aus Endwert und Startwert zu bilden wäre.
Man würde also dem Startdatum jeweils Vielfache des Intervalls hinzufügen, um auf Folgetermine zu kommen.
Vielen Dank für die Erklärung!
Private Sub cmdSave_Click()
Dim rst As DAO.Recordset
Dim i As Long
Dim Endwert As Long
Set rst = CurrentDb.OpenRecordset("SELECT EventDate, EventSubject FROM tblEvent")
Endwert = Me.txtEventEnd - Me.txtEventStart
For i = 1 To Endwert / 30 / Me.txtIntervall
With rst
.AddNew
!EventDate = DateAdd(IntervallID, Me.txtIntervall * i, Me.txtEventStart)
!EventSubject = Me.txtEventDescrption
.Update
End With
Next i
rst.Close
Set rst = Nothing
End SubJetzt macht das Script was es soll... Gott stand ich auf der Leitung. Danke!
Kann man das hier noch eleganter lösen?
ZitatFor i = 1 To Endwert / 30 / Me.txtIntervall
In meiner DB kommt es jetzt nicht auf Taggenauigkeit an aber falls man es irgendwann für ein anderes Project benötigt....
EndwertSchleife = DateDiff("m", Startdatum, Enddatum) \ Intervall
Ggf. noch um 1 korrigieren, je nach dem, ob man den letzten Folgetermin richtig erwischt.
Wunderbar super, das haut jetzt bestens hin... Vielen Dank!