Son aktif 1753357397

Revizyon c6e446626a6d9d06de1326b7d19ce32068874ed7

gistfile1.txt Ham
1' Serien-Kalendereinträge aus Excel erstellen mit Serienlogik, Löschung alter Einträge, Logging, Laufzeitmessung, Zusammenfassung und Simulationsmodus
2
3Sub SerienKalendereintraegeErstellen()
4 ' Benutzer wird gefragt, ob Simulation gewünscht ist
5 Dim userResponse As VbMsgBoxResult
6 userResponse = MsgBox("Möchtest du eine Simulation durchführen (keine Einträge werden erstellt oder gelöscht)?", vbYesNo + vbQuestion, "Simulationsmodus")
7 Dim DRYRUN As Boolean
8 DRYRUN = (userResponse = vbYes) ' True = Simulation, False = Echtbetrieb
9
10 Dim olApp As Object, olNS As Object
11 Dim allCalendars As Collection, selectedCalendar As Object
12 Dim calendarNames() As String, selectedIndex As Variant
13 Dim olItems As Object, ws As Worksheet
14 Dim lastRow As Long, i As Long, j As Long, erstelltCount As Long, serienCount As Long, geloeschtCount As Long, uebersprungenCount As Long
15 Dim eintraege As Collection
16 Dim datum As Date, startzeit As Date, endzeit As Date
17 Dim produkt As String, hinweis As String, veranstaltungsnummer As String
18 Dim titel As String, ort As String
19 Dim alreadyProcessed() As Boolean
20 Dim startTime As Double
21 Dim logSheet As Worksheet
22
23 startTime = Timer
24
25 On Error Resume Next
26 Set olApp = GetObject(, "Outlook.Application")
27 If olApp Is Nothing Then Set olApp = CreateObject("Outlook.Application")
28 On Error GoTo 0
29 If olApp Is Nothing Then
30 MsgBox "Outlook konnte nicht gestartet werden.", vbCritical
31 Exit Sub
32 End If
33 Set olNS = olApp.GetNamespace("MAPI")
34 Set allCalendars = New Collection
35
36 Dim store As Object, folder As Object
37 For Each store In olNS.Folders
38 For Each folder In store.Folders
39 If folder.DefaultItemType = 1 Then allCalendars.Add folder
40 Next folder
41 Next store
42
43 ReDim calendarNames(1 To allCalendars.Count)
44 For i = 1 To allCalendars.Count
45 calendarNames(i) = allCalendars(i).Parent.Name & " – " & allCalendars(i).Name
46 Next i
47 selectedIndex = Application.InputBox("Wähle den Zielkalender aus (Zahl):" & vbCrLf & Join(calendarNames, vbCrLf), "Kalenderauswahl", Type:=1)
48 If Not IsNumeric(selectedIndex) Or selectedIndex < 1 Or selectedIndex > allCalendars.Count Then Exit Sub
49
50 Set selectedCalendar = allCalendars(selectedIndex)
51 MsgBox "Ausgewählter Kalender: " & selectedCalendar.Name, vbInformation, "Kalenderbestätigung"
52 Set olItems = selectedCalendar.Items
53 olItems.Sort "[Start]"
54 olItems.IncludeRecurrences = True
55 Dim gefilterteItems As Object
56 Set gefilterteItems = olItems
57
58 Dim gefilterteItems As Object
59 Set gefilterteItems = olItems
60 End If
61 Set ws = ThisWorkbook.Sheets(1)
62 lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
63 ReDim alreadyProcessed(1 To lastRow)
64
65 Set eintraege = New Collection
66
67 For i = 2 To lastRow
68 Debug.Print "Verarbeite Zeile " & i & " – " & ws.Cells(i, "B").Text & " – Produkt: " & ws.Cells(i, "G").Text
69 If alreadyProcessed(i) Then GoTo Weiter
70 If Not IsDate(ws.Cells(i, "B").Value) Then
71 ws.Cells(i, "M").Value = "übersprungen (Datum fehlt)"
72 uebersprungenCount = uebersprungenCount + 1
73 GoTo Weiter
74 End If
75 If ws.Cells(i, "C").Value = "" Then
76 ws.Cells(i, "M").Value = "übersprungen (Startzeit fehlt)"
77 uebersprungenCount = uebersprungenCount + 1
78 GoTo Weiter
79 End If
80 If ws.Cells(i, "G").Value = "" Then
81 ws.Cells(i, "M").Value = "übersprungen (kein Produkt)"
82 uebersprungenCount = uebersprungenCount + 1
83 GoTo Weiter
84 End If
85
86 datum = DateValue(ws.Cells(i, "B").Value)
87 If IsDate(ws.Cells(i, "C").Value) Then
88 startzeit = TimeValue(ws.Cells(i, "C").Value)
89 Else
90 ws.Cells(i, "M").Value = "übersprungen (ungültige Startzeit)"
91 GoTo Weiter
92 End If
93 If IsDate(ws.Cells(i, "D").Value) Then
94 endzeit = TimeValue(ws.Cells(i, "D").Value)
95 Else
96 ws.Cells(i, "M").Value = "übersprungen (ungültige Endzeit)"
97 GoTo Weiter
98 End If
99
100 produkt = Trim(ws.Cells(i, "G").Value)
101 veranstaltungsnummer = Trim(ws.Cells(i, "F").Value)
102 hinweis = Trim(ws.Cells(i, "L").Value)
103 ort = Trim(ws.Cells(i, "J").Value)
104
105 If InStr(1, hinweis, "Lehrgang: ", vbTextCompare) > 0 Then
106 hinweis = Mid(hinweis, InStr(1, hinweis, "Lehrgang: ", vbTextCompare) + 10)
107 End If
108 titel = produkt & " - " & hinweis
109 If titel = " - " Or titel = "-" Then
110 ws.Cells(i, "M").Value = "übersprungen (kein gültiger Titel)"
111 GoTo Weiter
112 End If
113
114 ' Duplikatprüfung: Wenn in Outlook bereits ein Termin mit Datum und Veranstaltungsnummer vorhanden ist
115 Dim skip As Boolean: skip = False
116 If Not DRYRUN Then
117 Dim existingItem As Object, itemDate As Date
118 For Each existingItem In gefilterteItems
119 If existingItem.Class = 26 Then
120 itemDate = Int(existingItem.Start)
121 If itemDate = datum Then
122 If InStr(existingItem.Body, veranstaltungsnummer) > 0 Then
123 If existingItem.Subject <> titel Then
124 Dim msg As VbMsgBoxResult
125 msg = MsgBox("Ein Eintrag mit gleicher Veranstaltungsnummer aber abweichendem Titel existiert: " & existingItem.Subject & vbCrLf & _
126 "Neuer Titel wäre: " & titel & vbCrLf & "Trotzdem ersetzen?", vbYesNo + vbExclamation)
127 If msg = vbNo Then skip = True
128 Else
129 skip = True
130 End If
131 End If
132 End If
133 End If
134 Next existingItem
135 End If
136 If skip Then
137 ' Bestehenden Termin ggf. löschen
138 If Not DRYRUN Then
139 For Each existingItem In gefilterteItems
140 If existingItem.Class = 26 And Int(existingItem.Start) = datum Then
141 If InStr(existingItem.Body, veranstaltungsnummer) > 0 Then
142 existingItem.Delete
143 geloeschtCount = geloeschtCount + 1
144 Exit For
145 End If
146 End If
147 Next
148 End If
149 ws.Cells(i, "M").Value = "ersetzt (gelöscht + neu)"
150 GoTo Weiter
151 End If
152
153 ' Erstellung des Outlook-Termins oder Simulation
154 If DRYRUN Then
155 ws.Cells(i, "M").Value = "(Simulation) " & titel
156 ws.Cells(i, "M").Interior.Color = RGB(200, 200, 200)
157 Else
158 Dim appt As Object
159 Set appt = olApp.CreateItem(1)
160 With appt
161 .Start = datum + startzeit
162 .End = datum + endzeit
163 .Subject = titel
164 .Location = ort
165 .Body = veranstaltungsnummer
166 .ReminderSet = False
167 .BusyStatus = 2
168 .Save
169 End With
170 ws.Cells(i, "M").Value = titel
171 erstelltCount = erstelltCount + 1
172 End If
173 alreadyProcessed(i) = True
174
175 ' Serientermin-Erkennung: gleiche Veranstaltungsnummer an aufeinanderfolgenden Werktagen
176 Dim serieEndRow As Long: serieEndRow = i
177 Do While serieEndRow + 1 <= lastRow And Not alreadyProcessed(serieEndRow + 1)
178 Dim nextDatum As Date
179 If Not IsDate(ws.Cells(serieEndRow + 1, "B").Value) Then Exit Do
180 nextDatum = DateValue(ws.Cells(serieEndRow + 1, "B").Value)
181 If ws.Cells(serieEndRow + 1, "F").Value <> veranstaltungsnummer Then Exit Do
182 If Weekday(datum, vbMonday) = 5 Then ' Freitag
183 If DateDiff("d", datum, nextDatum) <> 3 Then Exit Do ' Freitag → Montag
184 Else
185 If DateDiff("d", datum, nextDatum) <> 1 Then Exit Do
186 End If
187 If ws.Cells(serieEndRow + 1, "G").Value = "" Then Exit Do
188 serieEndRow = serieEndRow + 1
189 Loop
190
191 If serieEndRow > i Then
192 ' Serien-Eintrag
193 If Not DRYRUN Then
194 Dim recurrenceAppt As Object
195 Set recurrenceAppt = olApp.CreateItem(1)
196 With recurrenceAppt
197 .Start = datum + startzeit
198 .End = datum + endzeit
199 .Subject = titel
200 .Location = ort
201 .Body = veranstaltungsnummer
202 .ReminderSet = False
203 .BusyStatus = 2
204 .Save
205 Dim pattern
206 Set pattern = .GetRecurrencePattern
207 pattern.RecurrenceType = 1 ' daily
208 pattern.PatternStartDate = datum
209 pattern.Occurrences = serieEndRow - i + 1
210 .Save
211 End With
212 For j = i To serieEndRow
213 alreadyProcessed(j) = True
214 ws.Cells(j, "M").Value = titel & " (Serie)"
215 Next j
216 serienCount = serienCount + 1
217 GoTo Weiter
218 Else
219 For j = i To serieEndRow
220 alreadyProcessed(j) = True
221 ws.Cells(j, "M").Value = "(Simulation) " & titel & " (Serie)"
222 ws.Cells(j, "M").Interior.Color = RGB(180, 180, 180)
223 Next j
224 serienCount = serienCount + 1
225 GoTo Weiter
226 End If
227 End If
228
229Weiter:
230 Next i
231
232 Dim elapsedTime As Double
233 elapsedTime = Timer - startTime
234 MsgBox "Fertig. " & erstelltCount & " Termine erstellt, " & serienCount & " Serientermine erstellt, " & geloeschtCount & " ersetzt, " & uebersprungenCount & " übersprungen." & vbCrLf & _
235 "Laufzeit: " & Format(elapsedTime, "0.00") & " Sekunden", vbInformation
236End Sub
237