Outlook Kalender auslesen(heutige Termine)

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von KatjaS87.

    Outlook Kalender auslesen(heutige Termine)

    Guten Abend zusammen,

    ich würde gerne mir meine heutigen Termine Anzeigen lassen. Dabei hatte ich mir bereits aus Codeschnipseln in VBA folgendes gebastelt:

    Visual Basic-Quellcode

    1. Sub FindApptsInTimeFrame()
    2. Dim myStart As Date
    3. Dim myEnd As Date
    4. Dim oCalendar As Outlook.folder
    5. Dim oItems As Outlook.items
    6. Dim oResItems As Outlook.items
    7. Dim oAppt As Outlook.AppointmentItem
    8. Dim strRestriction As String
    9. Dim i As Long
    10. Dim strh As String
    11. Dim strhh As String
    12. Dim xx() As String
    13. Dim co As Integer
    14. myStart = Format(Now - 1, "dd.mm.yyyy")
    15. myEnd = DateAdd("d", 5, myStart)
    16. Debug.Print "Start:", myStart
    17. Debug.Print "End:", myEnd
    18. Set oCalendar = Outlook.Application.session.GetDefaultFolder(olFolderCalendar)
    19. Set oItems = oCalendar.items
    20. oItems.IncludeRecurrences = True
    21. oItems.Sort "[Start]"
    22. strRestriction = "[Start] <= '" & Format$(myEnd, "mm/dd/yyyy hh:mm AMPM") _
    23. & "' AND [End] >= '" & Format(myStart, "mm/dd/yyyy hh:mm AMPM") & "'"
    24. Debug.Print strRestriction
    25. 'Restrict the Items collection
    26. Set oResItems = oItems.Restrict(strRestriction)
    27. i = 6
    28. strhh = Format(Now, "dd.mm.yyyy")
    29. For Each oAppt In oResItems
    30. strh = oAppt.Start
    31. Debug.Print strhh & " " & strh
    32. 'If InStr(strh, strhh) Then
    33. If InStr(oAppt.Start, Format(Now, "dd.mm.yyyy")) Then
    34. ReDim Preserve xx(co)
    35. 'Cells(i, 2).Value = oAppt.Start
    36. 'Cells(i, 1).Value = oAppt.Subject
    37. xx(co) = oAppt.Subject & " " & oAppt.Start
    38. co = co + 1
    39. End If
    40. i = i + 1
    41. Next
    42. Dim msgString As String
    43. msgString = Join(xx, vbCr)
    44. MsgBox "Heutige Termine:" & vbCr & msgString
    45. End Sub


    Ich habe zwar schon ein ähnliches Thema im Forum entdeckt, leider zeigt dieses bspw. keine Terminserien usw. an. Der obige Code als Excel-Makro schon.

    Meine Frage wäre ob mir jemand dabei helfen könnte, den obigen VBA Code als VB.Net Code zu übersetzen.
    Ich habe mich bereits mehrere Stunden daran versucht, dabei ist folgendes entstanden (ist aber leider nicht lauffähig) :

    VB.NET-Quellcode

    1. Me.Height = 489
    2. Me.Width = 816
    3. Dim myStart As Date
    4. Dim myEnd As Date
    5. Dim oCalendar As Microsoft.Office.Interop.Outlook.Folder
    6. Dim oItems As Microsoft.Office.Interop.Outlook.Items
    7. Dim oResItems As Microsoft.Office.Interop.Outlook.Items
    8. Dim oAppt As Microsoft.Office.Interop.Outlook.AppointmentItem
    9. Dim strRestriction As String
    10. Dim i As Long
    11. Dim strh As String
    12. Dim strhh As String
    13. Dim xx() As String
    14. Dim co As Integer
    15. myStart = Format(DateAndTime.Now, "dd.mm.yyyy")
    16. myEnd = DateAdd("d", 5, myStart)
    17. 'Debug.Print "Start:", myStart
    18. 'Debug.Print "End:", myEnd
    19. oCalendar = Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar)
    20. oItems = oCalendar.Items
    21. oItems.IncludeRecurrences = True
    22. oItems.Sort "[Start]"
    23. strRestriction = "[Start] <= '" + Format$(myEnd, "mm/dd/yyyy hh:mm AMPM") _
    24. + "' AND [End] >= '" + Format(myStart, "mm/dd/yyyy hh:mm AMPM") + "'"
    25. 'Debug.Print strRestriction
    26. 'Restrict the Items collection
    27. oResItems = oItems.Restrict(strRestriction)
    28. i = 6
    29. strhh = Format(Now, "dd.mm.yyyy")
    30. For Each oAppt In oResItems
    31. strh = oAppt.Start
    32. ' Debug.Print strhh + " " + strh
    33. 'If InStr(strh, strhh) Then
    34. If InStr(oAppt.Start, Format(Now, "dd.mm.yyyy")) Then
    35. ReDim Preserve xx(co)
    36. 'Cells(i, 2).Value = oAppt.Start
    37. 'Cells(i, 1).Value = oAppt.Subject
    38. xx(co) = oAppt.Subject + " " + oAppt.Start
    39. co = co + 1
    40. End If
    41. i = i + 1
    42. Next
    43. Dim msgString As String
    44. msgString = Join(xx, vbCr)
    45. MessageBox.Show("Heutige Termine:" + vbCr + msgString)


    EDIT: Outlook-Verweise sind gesetzt.

    Bin für jede Hilfe Dankbar :saint:

    Beste Grüße

    Katja :)
    Willkommen im Forum. :thumbup:
    Welche DLL hast Du Deinem Projekt hinzugefügt, um Outlook zu instanziieren?

    KatjaS87 schrieb:

    (ist aber leider nicht lauffähig) :
    Wie äußert sich das?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank :D

    Ich erhalte folgende Fehlermeldungen, (ich meine ich hatte davor noch einige mehr ?( ) :
    Warnung BC42104 Die xx-Variable wird verwendet, bevor ihr ein Wert zugewiesen wird. Zur Laufzeit kann eine Nullverweisausnahme auftreten Zeile 51 vom zweiten Code-Ausschnitt
    Fehler BC30205 end of-Anweisung erwarte Zeile 22 vom zweiten Code-Ausschnitt
    Fehler BC30800 Methodenargumente müssen in Klammern stehen. Zeile 26 vom zweiten Code-Ausschnitt
    Fehler BC30311 Der Wert vom Typ "OlDefaultFolders" kann nicht in "Folder" konvertiert werden. Zeile 22 vom zweiten Code-Ausschnitt Zeile 22 vom zweiten Code-Ausschnitt

    Q:Welche DLL hast Du Deinem Projekt hinzugefügt, um Outlook zu instanziieren?

    A: Bin mir da nicht vollkommen sicher X/

    Microsoft Office 16.0 Object Libary
    Microsoft Outlook 16.0 Object Libary
    Microsoft Outlook Sharepoint SOcial Provider
    Mirosoft Outlook Social Provider Extensibility
    Microsoft Outlook View COntorl
    Microsoft Visual Basic for Applications Extensibilty 5.3
    OLE Automation

    Evtl. blöde Frage, welche brauch ich denn? Ich habe alle verfügbaren von Outlook selektiert.
    @KatjaS87 Ich hab folgende Verweise drin:

    Folgender Code compiliert. Ob er funktioniert, weiß ich nicht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub FindApptsInTimeFrame()
    2. ' Outlook als Objekt festlegen
    3. Dim objOutlook As Outlook.Application
    4. Dim myStart As Date
    5. Dim myEnd As Date
    6. Dim oCalendar As Outlook.MAPIFolder
    7. Dim oItems As Outlook.Items
    8. Dim oResItems As Outlook.Items
    9. Dim oAppt As Outlook.AppointmentItem
    10. Dim strRestriction As String
    11. Dim i As Long
    12. Dim strh As Date
    13. Dim strhh As String
    14. Dim xx() As String = Nothing
    15. Dim co As Integer
    16. Dim xxx = Marshal.GetActiveObject("Outlook.Application")
    17. objOutlook = DirectCast(xxx, Microsoft.Office.Interop.Outlook.Application)
    18. myStart = DateTime.Now.AddDays(-1)
    19. myEnd = myStart.AddDays(5)
    20. Debug.Print("Start {0}", myStart)
    21. Debug.Print("End {0}", myEnd)
    22. oCalendar = objOutlook.Session.GetDefaultFolder(olFolderCalendar)
    23. oItems = oCalendar.Items
    24. oItems.IncludeRecurrences = True
    25. oItems.Sort("[Start]")
    26. strRestriction = "[Start] <= '" & myEnd.ToString("mm/dd/yyyy hh:mm AMPM") _
    27. & "' AND [End] >= '" & myStart.ToString("mm/dd/yyyy hh:mm AMPM") & "'"
    28. Debug.Print(strRestriction)
    29. 'Restrict the Items collection
    30. oResItems = oItems.Restrict(strRestriction)
    31. i = 6
    32. strhh = Format(Now, "dd.mm.yyyy")
    33. For Each oAppt In oResItems
    34. strh = oAppt.Start()
    35. Debug.Print(strhh & " " & strh)
    36. 'If InStr(strh, strhh) Then
    37. If oAppt.Start.ToString().Contains(DateTime.Now.ToString("dd.mm.yyyy")) Then
    38. ReDim Preserve xx(co)
    39. 'Cells(i, 2).Value = oAppt.Start
    40. 'Cells(i, 1).Value = oAppt.Subject
    41. xx(co) = oAppt.Subject & " " & oAppt.Start
    42. co = co + 1
    43. End If
    44. i = i + 1
    45. Next
    46. MessageBox.Show("Heutige Termine:" & vbCr & String.Join(vbCr, xx))
    47. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe die gleichen Verweise hinterlegt, bekomme es aber nicht kompliliert.

    Mit folgenden Fehlermeldungen:

    Fehler BC30002 Der Typ "Outlook.Application" ist nicht definiert.
    Fehler BC30002 Der Typ "Outlook.MAPIFolder" ist nicht definiert.
    Fehler BC30002 Der Typ "Outlook.Items" ist nicht definiert.
    Fehler BC30002 Der Typ "Outlook.Items" ist nicht definiert.
    Fehler BC30002 Der Typ "Outlook.AppointmentItem" ist nicht definiert
    Fehler BC30451 "Marshal" wurde nicht deklariert. Aufgrund der Schutzstufe ist unter Umständen kein Zugriff möglich.
    Fehler BC30451 "olFolderCalendar" wurde nicht deklariert. Aufgrund der Schutzstufe ist unter Umständen kein Zugriff möglic
    Fehler BC32023 Der Ausdruck ist vom Typ "Outlook.Items". Dies ist kein Sammlungstyp

    Scheinbar fehlt mir trotzdem noch etwas ;(
    Ich nutze:
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    könnte es daran liegen ? Oder sonstige Ideen? :P
    Die entsprechenden Namespaces müssen vermutlich noch importiert werden.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Ich habe es versucht mit :

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop.Outlook

    Das ist vermutlich falsch
    Wie kann ich diese korrekt importieren?

    EDIT:

    Habe nun folgende Anpassungen gemacht (dadurch erhalte ich nur noch eine Fehlermeldung):

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop.Outlook
    2. Imports System
    3. Imports System.Text
    4. Imports System.Runtime.InteropServices
    5. Dim objOutlook As Microsoft.Office.Interop.Outlook.Application
    6. Dim myStart As Date
    7. Dim myEnd As Date
    8. Dim oCalendar As Microsoft.Office.Interop.Outlook.MAPIFolder
    9. Dim oItems As Microsoft.Office.Interop.Outlook.Items
    10. Dim oResItems As Microsoft.Office.Interop.Outlook.Items
    11. Dim oAppt As Microsoft.Office.Interop.Outlook.AppointmentItem
    12. Dim strRestriction As String
    13. Dim i As Long
    14. Dim strh As Date
    15. Dim strhh As String
    16. Dim xx() As String = Nothing
    17. Dim co As Integer
    18. Dim xxx = Marshal.GetActiveObject("Outlook.Application")
    19. objOutlook = DirectCast(xxx, Microsoft.Office.Interop.Outlook.Application)
    20. myStart = DateTime.Now.AddDays(-1)
    21. myEnd = myStart.AddDays(5)
    22. Debug.Print("Start {0}", myStart)
    23. Debug.Print("End {0}", myEnd)
    24. oCalendar = objOutlook.Session.GetDefaultFolder(olFolderCalendar)
    25. oItems = oCalendar.Items
    26. oItems.IncludeRecurrences = True
    27. oItems.Sort("[Start]")
    28. strRestriction = "[Start] <= '" & myEnd.ToString("mm/dd/yyyy hh:mm AMPM") _
    29. & "' AND [End] >= '" & myStart.ToString("mm/dd/yyyy hh:mm AMPM") & "'"
    30. Debug.Print(strRestriction)
    31. 'Restrict the Items collection
    32. oResItems = oItems.Restrict(strRestriction)
    33. i = 6
    34. strhh = Format(Now, "dd.mm.yyyy")
    35. For Each oAppt In oResItems
    36. strh = oAppt.Start()
    37. Debug.Print(strhh & " " & strh)
    38. 'If InStr(strh, strhh) Then
    39. If oAppt.Start.ToString().Contains(DateTime.Now.ToString("dd.mm.yyyy")) Then
    40. ReDim Preserve xx(co)
    41. 'Cells(i, 2).Value = oAppt.Start
    42. 'Cells(i, 1).Value = oAppt.Subject
    43. xx(co) = oAppt.Subject & " " & oAppt.Start
    44. co = co + 1
    45. End If
    46. i = i + 1
    47. Next
    48. MessageBox.Show("Heutige Termine:" & vbCr & String.Join(vbCr, xx))


    Jetzt taucht nur noch diese Fehlermeldung auf:
    Fehler BC30451 "olFolderCalendar" wurde nicht deklariert. Aufgrund der Schutzstufe ist unter Umständen kein Zugriff möglich.

    Zwecks Behebung habe ich keine Ahnung X/

    Über bisheriges und kommendes Input bin ich sehr Dankbar :thumbsup:


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

    Ja, Meldung ist ja eindeutig. Die genannte Variable muss du irgendwo (z.b. innerhalb der Methode) unter Angabe des korrekten Datentypen deklarieren und ggf. mit dem passenden Wert befüllen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    besser ist es Outlook mit Namespace öffnen

    VB.NET-Quellcode

    1. 'NameSpace,Logon
    2. Dim objOutlookoNS As Outlook.NameSpace = objOutlook.GetNamespace("mapi")
    3. objOutlookoNS.Logon("Outlook", Reflection.Missing.Value, False, True)


    das ganze sieht dann so aus, ich habe nur ein paar elemente in der Datatable eingefügt,
    denn Filter habe ich auskommentiert. Ich verwende das um nach "TerminLeichen" zu suchen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Office.Interop
    3. Imports Microsoft.Office.Interop.Outlook
    4. Public Class Form1
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. Dim objOutlook As Outlook.Application = New Outlook.Application()
    7. 'NameSpace,Logon
    8. Dim objOutlookoNS As Outlook.NameSpace = objOutlook.GetNamespace("mapi")
    9. objOutlookoNS.Logon("Outlook", Reflection.Missing.Value, False, True)
    10. Dim outLookAppointment As Outlook.MAPIFolder = objOutlookoNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
    11. Dim outLookItems As Outlook.Items = outLookAppointment.Items
    12. 'deine Datatable
    13. Dim dtAppointment As New DataTable
    14. dtAppointment.Columns.Add("Location")
    15. dtAppointment.Columns.Add("Start")
    16. dtAppointment.Columns.Add("Ende")
    17. 'suche Leichen
    18. Dim drAppointment As DataRow
    19. For iCounter As Integer = 1 To outLookAppointment.Items.Count
    20. Dim myAppointment = DirectCast(outLookItems.Item(iCounter), AppointmentItem)
    21. 'hier Filter für Heute setzen
    22. 'If myAppointment.Start.Date = Date.Today Then
    23. 'oder alles nach Leichen durchsuchen
    24. drAppointment = dtAppointment.NewRow
    25. drAppointment("Location") = myAppointment.Location
    26. drAppointment("Start") = myAppointment.Start
    27. drAppointment("Ende") = myAppointment.End
    28. dtAppointment.Rows.Add(drAppointment)
    29. 'End If
    30. Next
    31. 'Ausgabe in DGV
    32. DataGridView1.DataSource = dtAppointment
    33. objOutlookoNS.Logoff()
    34. objOutlookoNS = Nothing
    35. outLookItems = Nothing
    36. objOutlook = Nothing
    37. End Sub
    38. End Class