VBA Datum vergleichen und neu speichern?
Hallo,
ich bin leider noch eine niete was VBA angeht, weshalb ich gerade auf externe Hilfe angewiesen bin. Und zwar habe ich eine Excel Datei in dem z.B ab Zelle A15 bis A90 verschiedene Daten(Datum ebem) stehen.
Es kann auch sein dass manche Zellen ohne Datum sind. Nun versuche ich ein VBA Makro zu erstellen, welches sobald man die Datei öffnet durch ein MsgBox abfrage diese Daten mit dem heutigen Datum vergleicht und mir im Outlook einen Reminder eine Woche vorab erstellt wenn diese Daten älter als 5 Wochen sind und diese bald ablaufen.
Ich wäre euch äußerst Dankbar wenn man mir die Bausteine dazu zur Verfügung stellt.
Grüße
2 Antworten
Ich hab dir mal kurz was zusammengebastelt. Den Code musst du bei "Diese Arbeitsmappe" einfügen.
Private Sub Workbook_Open()
Dim aktuelleZelle As Range
Dim olApp As Outlook.Application
Dim olApt As Outlook.AppointmentItem
Dim i As Integer
If MsgBox("Sollen jetzt neue Erinnerungen in Outlook generiert werden?", vbYesNo) = vbYes Then
For Each aktuelleZelle In Sheets("Tabelle1").Range("A15:A90")
If IsDate(aktuelleZelle.Value) Then
If aktuelleZelle.Value < Date - (5 * 7) Then
' Reminder in Outlook erstellen
Set olApp = GetObject(, "Outlook.Application")
Set olApt = olApp.CreateItem(olAppointmentItem)
olApt.Start = aktuelleZelle.Value + (6 * 7)
olApt.AllDayEvent = True
olApt.ReminderSet = True
olApt.Subject = "Älter als 5 Wochen"
olApt.Save
End If
End If
Next aktuelleZelle
End If
End Sub
Du solltest in der Excel aber evtl. noch eine Spalte anlegen, in der steht, welche Termine schon in Outlook eingetragen sind, sonst legt dir die Prozedur jedes mal alle Termine neu an, die älter als 5 Wochen sind.
Statt dem Range("A15:A90") kannst du auch einen benannten Bereich in der Tabelle definieren, den du dann nach Lust und Laune größer oder kleiner ziehen kannst.
Achso, stimmt, hab ich vergessen. Du musst im VBA-Editor unter Extras > Verweise noch die "Microsoft Outlook 14.0 Object Library" (bzw. statt 14.0 halt das, was da ist) anhaken, damit Excel die Outlook Objekte findet.
Vielen Dank hat geklappt, jedoch bekomme ich den Fehler Index out of Range bzw Index außerhalb des gültigen Bereichs, woran kann das liegen? Fehler tritt beim Debuggern nach For Each aktuelleZelle.... auf.
Hallo, wow erstmal vielen Dank für deine Antwort. Das mit einer neuen Spalte wird leider nicht klappen denn die Tabelle wird aus dem SAP jedesmal überschrieben somit müsste man das jedesmal manuell machen, gibts da keine Block lösung, dass wenn schon ein Eintrag ist, diese nicht erneut eingetragen wird?
Das macht die Sache auf jeden Fall komplizierter. Gibt's da vielleicht eine eindeutige Nummer, die man in die Erinnerung reinschreiben kann? Dann könnte man alle Erinnerungen aus Outlook auslesen und nur die Erinnerungen von den Nummern erstellen, die in Outlook nicht gefunden werden.
Vielen Dank hat geklappt, jedoch bekomme ich den Fehler Index out of Range bzw Index außerhalb des gültigen Bereichs, woran kann das liegen?
Ja, es muss bei DieseArbeitsmappe rein, damit es beim Öffnen der Arbeitsmappe automatisch aufgerufen wird. Wenn du es in ein Modul rein machst, ist es einfach nur ein Makro, was "Workbook_open" heißt, aber was du dann manuell starten müsstest.
Bitteschön :)
Kann gut sein, dass es da noch einen zweiten Weg über irgendwelche Optionen gibt. Ich hab jetzt die Variante genommen, die ich kenne. Wenn man halt in "DieseArbeitsmappe" eine Prozedur namens Workbook_Open() anlegt, dann wird es beim Öffnen der der Excel-Datei automatisch gestartet
Wo kommt denn der Fehler "Index out of Range"? Das bedeutet normalerweise, dass du versuchst, auf ein Listenelement oder ein Tabellenelement zuzugreifen, was es nicht gibt. Also z.B. wenn du eine Liste mit 7 Einträgen hast und versuchst, auf das achte zuzugreifen, oder wenn du versuchst, auf die Zelle "A0" zuzugreifen oder sowas. Denk auch dran, dass VBA (und auch die meisten anderen Programmiersprachen) in der Regel bei 0 anfangen zu zählen. Also wenn du eine Liste mit 7 Elementen hast, sind sie von 0 - 6 nummeriert und es gibt kein Element mit der Nummer 7.
Nicht getestet, einfach mal so niedergeschrieben aus dem Kopf:
Private Sub Workbook_Open()
Const start = 1 ' indidiuell anpassen
Const ende = 1000 ' indidiuell anpassen
Const spalte = 2 ' indidiuell anpassen
Dim l as Long
Dim actDate as Date, warnDate as Date, setDate as Date
Dim chDate as Date
actDate = Date
warnDate = actDate + 35 ' Heute + 5 Wochen
For l = start to ende
chDate = Cells(l,spalte).Value
If chDate > warnDate Then
setDate = chDate - 7 ' Die Woche vorab
setDate_in_Outlook setDate ' siehe unten
End If
Next l
End Sub
Die Sub "setDate_in_Outlook" mit dem Parameter setDate kannst Du Dir hieraus abkupfern:
https://www.stallwanger.net/wordpress/outlook-vba-termin-automatisch-erstellen-aus-excel-daten/
Ich bekomme leider auch den Fehler Benutzerdefinierter Typ nicht definiert bei "Dim olApp As Outlook.Application" aber vielen vielen Dank du hast mich gerettet, ich war schon am Zweifeln und durch googlen habe ich mich immer mehr verwirrt. Aber dass das jedesmal erneut eingetragen wird ist denke ich nicht so schlimm, denn es wird nur einmal im Monat ausgeführt somit sollte das kein Problem sein.