Hallo zusammen,
ich arbeite immer noch am Schulungstool. Ich weiß das meine Beziehungen nicht korrekt sind, aber so lange ich bei dem anderen Post auf eine Fortsetzung warte, versuche ich schon mal andere Probleme zu lösen.
ich hab schon im Forum gestöbert und auch versucht zu googlen, aber ich komm nicht auf den Trichter. Ich möchte Access so mit Outlook verbinden, dass jede Änderung in Access auch in Outlook übernommen wird. Ich hab die Funktionen Namespace und Mapi gefunden, denke damit sollte ich arbeiten?!
Mein Problem:
Falls Änderungen an Terminen, Uhrzeiten, Teilnehemrgruppen..... vorkommen, möchte ich per Button eine Aktualisierung verschicken. Also auf den schon verschickten Termin zugreifen und diesen ändern. Bei Outlook ist das die Funktion "Update senden". Falls ich einen Schulungsblock lösche, also einen Datensatz lösche, sollte eine Absage an alle bereits eingeladenen Teilnehmer verschickt werden.
Wie bekomme ich das hin?
Mein Code bis jetzt ohne Namespace und MAPI:
Option Compare Database
Option Explicit
Public Function fncOutlook_Termin_Eintragen(parSubject As String, SFN As Boolean, SFH As Boolean, Praktikanten As Boolean, _
dStart1 As Date, dEnd1 As Date, dStart2 As Date, dEnd2 As Date, dStart3 As Date, dEnd3 As Date, _
dStart4 As Date, dEnd4 As Date, dStart5 As Date, dEnd5 As Date)
Dim counter1 As Integer
Dim Start(5) As Date
Dim Ende(5) As Date
Dim db As Database
Dim rs As Recordset
Start(0) = dStart1 'Array für 5 Termine
Ende(0) = dEnd1
Start(1) = dStart2
Ende(1) = dEnd2
Start(2) = dStart3
Ende(2) = dEnd3
Start(3) = dStart4
Ende(3) = dEnd4
Start(4) = dStart5
Ende(4) = dEnd5
For counter1 = 0 To 4
If Start(counter1) > "01.01.1900" Then
Dim outApp As Outlook.Application
Dim outtest As Outlook.AppointmentItem
Dim myRequiredAttendee As Outlook.Recipient
Set outApp = New Outlook.Application
Set outtest = outApp.CreateItem(olAppointmentItem)
With outtest
.MeetingStatus = olMeeting 'Termin wird zu Besprechung
.Start = Start(counter1)
.End = Ende(counter1)
.Body = Forms![frm_Schulungsblock_erstellen].Form![frm_Thema].Controls("Thema") _
And Forms![frm_Schulungsblock_erstellen].Form![frm_Thema].Controls("Beschreibung") 'noch schauen wie ich Body mit mehreren Felder füllen kann
.AllDayEvent = False
.ReminderMinutesBeforeStart = 15
.Subject = parSubject
If Forms![frm_Schulungsblock_erstellen].Controls("TeilnehmergruppeSFN") = True Then 'SFN Mitarbeiter einladen
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT Vorname, Nachname, EmailAdresse FROM qry_MitarbeiterSFN")
Do Until rs.EOF
.Recipients.Add rs!EmailAdresse
rs.MoveNext
Loop
.Save
.Send
End If
If Forms![frm_Schulungsblock_erstellen].Controls("TeilnehmergruppeSFH") = True Then 'SFH Mitarbeiter einladen
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT Vorname, Nachname, EmailAdresse FROM qry_MitarbeiterSFH")
Do Until rs.EOF
.Recipients.Add rs!EmailAdresse
rs.MoveNext
Loop
.Save
.Send
End If
If Forms![frm_Schulungsblock_erstellen].Controls("TeilnehmergruppePraktikanten") = True Then 'Praktikanten einladen
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT Vorname, Nachname, EmailAdresse FROM qry_MitarbeiterPraktikanten")
Do Until rs.EOF
.Recipients.Add rs!EmailAdresse
rs.MoveNext
Loop
.Save
.Send
End If
End With
End If
Next counter1
'Alle Object-Variablen hier zerstören
rs.Close
Set db = Nothing
Set rs = Nothing
End Function
Function Blocker_senden_Click()
Const frmNSchulBlock = "frm_Schulungsblock_erstellen"
Const frmNThema = "frm_Thema_Tutor"
Const t1b = "Termin1Beginn"
Const t1e = "Termin1Ende"
Const t2b = "Termin2Beginn"
Const t2e = "Termin2Ende"
Const t3b = "Termin3Beginn"
Const t3e = "Termin3Ende"
Const t4b = "Termin4Beginn"
Const t4e = "Termin4Ende"
Const t5b = "Termin5Beginn"
Const t5e = "Termin5Ende"
Dim t1beginn As Date
Dim t1ende As Date
Dim t2beginn As Date
Dim t2ende As Date
Dim t3beginn As Date
Dim t3ende As Date
Dim t4beginn As Date
Dim t4ende As Date
Dim t5beginn As Date
Dim t5ende As Date
If IsNull(Forms(frmNSchulBlock).Controls(t1b)) And IsNull(Forms(frmNSchulBlock).Controls(t1e)) _
And IsNull(Forms(frmNSchulBlock).Controls(t2b)) And IsNull(Forms(frmNSchulBlock).Controls(t2e)) _
And IsNull(Forms(frmNSchulBlock).Controls(t3b)) And IsNull(Forms(frmNSchulBlock).Controls(t3e)) _
And IsNull(Forms(frmNSchulBlock).Controls(t4b)) And IsNull(Forms(frmNSchulBlock).Controls(t4e)) _
And IsNull(Forms(frmNSchulBlock).Controls(t5b)) And IsNull(Forms(frmNSchulBlock).Controls(t5e)) Then
MsgBox "Bitte Termin eingeben", vbInformation
Exit Function
End If
If Forms(frmNSchulBlock).Controls(t1b) > Forms(frmNSchulBlock).Controls(t1e) _
Or Forms(frmNSchulBlock).Controls(t2b) > Forms(frmNSchulBlock).Controls(t2e) _
Or Forms(frmNSchulBlock).Controls(t3b) > Forms(frmNSchulBlock).Controls(t3e) _
Or Forms(frmNSchulBlock).Controls(t4b) > Forms(frmNSchulBlock).Controls(t4e) _
Or Forms(frmNSchulBlock).Controls(t5b) > Forms(frmNSchulBlock).Controls(t5e) Then
MsgBox "Das von Ihnen angegebene Ende liegt vor dem Beginn", vbInformation
Exit Function
End If
If IsNull(Forms(frmNSchulBlock).Controls(t1b)) Xor IsNull(Forms(frmNSchulBlock).Controls(t1e)) _
Xor IsNull(Forms(frmNSchulBlock).Controls(t2b)) Xor IsNull(Forms(frmNSchulBlock).Controls(t2e)) _
Xor IsNull(Forms(frmNSchulBlock).Controls(t3b)) Xor IsNull(Forms(frmNSchulBlock).Controls(t3e)) _
Xor IsNull(Forms(frmNSchulBlock).Controls(t4b)) Xor IsNull(Forms(frmNSchulBlock).Controls(t4e)) _
Xor IsNull(Forms(frmNSchulBlock).Controls(t5b)) Xor IsNull(Forms(frmNSchulBlock).Controls(t5e)) Then
MsgBox "Termin Beginn und Ende wählen", vbCritical
Exit Function
End If
If Forms(frmNSchulBlock).Controls("TeilnehmergruppeSFN") = False And Forms(frmNSchulBlock).Controls("TeilnehmergruppeSFH") = False _
And Forms(frmNSchulBlock).Controls("TeilnehmergruppePraktikanten") = False Then
MsgBox "Bitte wählen Sie eine Teilnehmergruppe aus", vbInformation
Exit Function
End If
If IsNull(Forms(frmNSchulBlock).Controls(t1b)) Or IsNull(Forms(frmNSchulBlock).Controls(t1e)) Then
t1beginn = "01.01.1900"
t1ende = "01.01.1900"
Else
t1beginn = Forms(frmNSchulBlock).Controls(t1b)
t1ende = Forms(frmNSchulBlock).Controls(t1e)
End If
If IsNull(Forms(frmNSchulBlock).Controls(t2b)) Or IsNull(Forms(frmNSchulBlock).Controls(t2e)) Then
t2beginn = "01.01.1900"
t2ende = "01.01.1900"
Else
t2beginn = Forms(frmNSchulBlock).Controls(t2b)
t2ende = Forms(frmNSchulBlock).Controls(t2e)
End If
If IsNull(Forms(frmNSchulBlock).Controls(t3b)) Or IsNull(Forms(frmNSchulBlock).Controls(t3e)) Then
t3beginn = "01.01.1900"
t3ende = "01.01.1900"
Else
t3beginn = Forms(frmNSchulBlock).Controls(t3b)
t3ende = Forms(frmNSchulBlock).Controls(t3e)
End If
If IsNull(Forms(frmNSchulBlock).Controls(t4b)) Or IsNull(Forms(frmNSchulBlock).Controls(t4e)) Then
t4beginn = "01.01.1900"
t4ende = "01.01.1900"
Else
t4beginn = Forms(frmNSchulBlock).Controls(t4b)
t4ende = Forms(frmNSchulBlock).Controls(t4e)
End If
If IsNull(Forms(frmNSchulBlock).Controls(t5b)) Or IsNull(Forms(frmNSchulBlock).Controls(t5e)) Then
t5beginn = "01.01.1900"
t5ende = "01.01.1900"
Else
t5beginn = Forms(frmNSchulBlock).Controls(t5b)
t5ende = Forms(frmNSchulBlock).Controls(t5e)
End If
If IsNull(Forms(frmNSchulBlock).Controls("SchulungsblockTitel")) Then
MsgBox "Bitte richtigen Schulungsblock Titel eingeben"
Forms(frmNSchulBlock).Controls("SchulungsblockTitel") = "???"
Exit Function
Else
Forms(frmNSchulBlock).Controls("SchulungsblockTitel") = Forms(frmNSchulBlock).Controls("SchulungsblockTitel")
End If
If MsgBox("Blocker jetzt versenden?", vbYesNo + vbQuestion, "Frage") = vbNo Then Exit Function
Call fncOutlook_Termin_Eintragen(Forms(frmNSchulBlock).Controls("SchulungsblockTitel"), Forms(frmNSchulBlock).Controls("TeilnehmergruppeSFN"), _
Forms(frmNSchulBlock).Controls("TeilnehmergruppeSFH"), Forms(frmNSchulBlock).Controls("TeilnehmergruppePraktikanten"), _
t1beginn, t1ende, t2beginn, t2ende, t3beginn, t3ende, t4beginn, t4ende, t5beginn, t5ende)
End Function
Im Anhang auch noch das Formular zum veranschaulichen.
Ich hoffe auf eure Hilfe.
Beste Grüße
Daniel
Zitat von: Daniel92 am November 30, 2017, 11:46:37
ich hab schon im Forum gestöbert und auch versucht zu googlen
Hier gehts ja nicht nur um eine Kleinigkeit, sondern um eine umfassende Automatisierung von Outlook.
Ein bisschen Googeln ist da zu wenig. Du wirst dich nicht um eine Auseinandersetzung mit den Grundlagen drücken können. Versuchen kann man es natürlich ;D
Es gibt eh einige Seiten die Outlook VBA Code zeigen:
http://www.vboffice.net/de/developers.
http://dbwiki.net/index.php?search=outlook&title=Spezial%3ASuche&go=Seite
https://www.howto-outlook.com/
LG Markus
Hallo zusammen,
ich kämpfe immer noch mit der Umsetzung und wäre für jeden Vorschlag dankbar!
mein Lösungsansatz ist dieser:
Beim klicken auf den Button "löschen" oder "aktualisieren" erstellt sich eine temporäre Tabelle in Access, die mit dem Ordner "Gesendete Elemente" aus Outlook befüllt wird. Anschließend wird diese nach dem Betreff gefiltert, z.B. Schulungsblock 2.
Als nächstes soll jede Mail, also jeder Datensatz in der Tabelle, nacheinander geöffnet werden und z.B. gelöscht werden, oder die Uhrzeit aktualisiert und eine Update gesendet werden.
Bis zum erstellen und filtern der temporären Tabelle bekomme ich es hin, ab da läufts nicht mehr.
Was haltet ihr von dem Ansatz und wie würdet ihr das umsetzen?
@markus: mir ist schon klar, dass das kein Kleinigkeit ist, aber irgendwie lösen muss ich es ja trotzdem! ;) Profi in VBA bin ich nicht, aber denke die Grundlagen beherrsche ich!
Beste Grüße
Daniel
Zitat von: Daniel92 am Dezember 06, 2017, 10:06:05
erstellt sich eine temporäre Tabelle in Access, die mit dem Ordner "Gesendete Elemente" aus Outlook befüllt wird.
Man kann in Access direkt Outlook Tabellen verknüpfen.
Dann kannst du die Daten in ein Form/Recordset einbinden und filtern.
Mit der Outlook Methode GetItemFromID kann man dann ein konkretes Objekt öffnen.
Ich bin jetzt auch nicht der Outlook Profi, wenn man aber mit Objekten und VBA grundsätzlich umgehen kann, findet man in der Hilfe und im Web alles was man braucht.
LG Markus
ZitatMan kann in Access direkt Outlook Tabellen verknüpfen.
Danke für den Tipp, ist auf jeden Fall ne feine Sache!
Ich versuch mich mal mit der GetItemFromID Methode.
Beste Grüße
Daniel
Hallo zusammen,
gibt es die Möglichkeit die EntryID von einer Mail rauszufinden, bei einer verknüpften Tabelle mit dem Outlook Ordner?
Wenn ich eine Tabelle per Code erstelle, kann ich mir die EntryID mit importieren lassen, dann ist die Tabelle aber nicht verknüpft....
Bitte um eure Hilfe.
Beste Grüße
Daniel
Zitat von: Daniel92 am Dezember 08, 2017, 11:32:25
gibt es die Möglichkeit die EntryID von einer Mail rauszufinden, bei einer verknüpften Tabelle mit dem Outlook Ordner?
Hallo Daniel,
da staune ich jetzt aber nicht schlecht, dass das nicht geht - absolut unlogisch.
Persönlich verwende ich nie Verknüpfungen zu Outlook.
Ich greife immer per ADO auf das MapiTable zu. Dafür nutze ich Redemption Klassen.
Siehe: http://www.dimastr.com/redemption/mapitable.htm
Vielleicht findest du aber im Web, einen Weg direkt per DAO.Recordsets auf die Daten zuzugreifen.
Mit den Redemption ist das alles ja ganz einfach, aber du musst die Redemption Library installieren und dich etwas einlesen. Redemption ermöglicht in Bezug auf Outlook sehr viel, was mit Outlook direkt nicht möglich ist.
LG Markus
Hallo Markus,
danke für deinen Tipp! Hab es gelöst bekommen, indem ich den Outlook Kalender in eine Tabelle importiere und immer wieder aktualisiere. Dort arbeite ich dann mit dem DAO.Recordset....
War mein 4. Ansatz und endlich klappts!
Beste Grüße
irgendwie gehts ja immer.