none
Probleme mit Array-Index

    Allgemeine Diskussion

  • Hallo Zusammen,

    ich nutze VBA um Mails über Outlook in Access respektive SQL-Server einzulesen. (Andere Wege dies zu tun habe ich bisher nicht gefunden.)

    Das klappt auch im Grunde, nur bekomme ich immer wieder eine Fehlermeldung (Array-Index außerhalb des zulässigen Bereichs) wenn sich mehrere Mails im auszulesenden Exchange Ordner befinden. Sicherlich ist das nur eine kleine Sache, aber ich komme nicht drauf. Ggf. kann sich mal jemand meine Vorgehensweise anschauen und mir einen Tip geben? (ich habe den Code mal auf das wesentliche gekürzt um es übersichtlich zu halten.)

    Function GetServiceEMails(Folderpath, strSubjektNr As String)

    Dim aFolders
    Dim i
    Dim objNS As Outlook.NameSpace
    Dim objOutlApp As Outlook.Application
    Dim objPubFolder As Outlook.MAPIFolder
    Dim objParentFolder As Outlook.MAPIFolder
    Dim objTargetFolder As Outlook.MAPIFolder
    Dim myMovedItem As Object

    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim strSQL As String
    Dim strNow As String

    strNow = Now

    Set cnn = CurrentProject.Connection
     
    Set objOutlApp = CreateObject("Outlook.Application")
    Set objNS = objOutlApp.GetNamespace("MAPI")

      strFolderpath = Replace(Folderpath, "/", "\")
      aFolders = Split(Folderpath, "\")

      'set the root folder
      Set objPubFolder = objNS.Folders(aFolders(0))
     
      'loop through the array to get the subfolder
      'loop is skipped when there is only one element in the array
      For i = 1 To UBound(aFolders)
     
      Set objParentFolder = objPubFolder
     
        Set objPubFolder = objPubFolder.Folders(aFolders(i))
       
    If objPubFolder Is Nothing Or Err.Number <> 0 Then

    MsgBox "Der Ordner " & aFolders(i) & " existiert nicht.", vbOKOnly, "Ordner nicht vorhanden"

    Exit Function

    End If
     
      Next

    'Folder nach Inhalt durchsuchen

    Dim strEntryID As String, strBetreff As String, strBody As String, strEMail As String
    Dim strEmpfangsdatum As String, strDateTime As String, strKMitarbeiter
    Dim strTicketNr As String, strSaveAs As String, strAblagepfad As String

    Set objTargetFolder = objPubFolder.Folders("bearbeitet")

    'strStoreID = objTargetFolder.StoreID

    strAnzItems = objPubFolder.Items.Count

    For i = 1 To objPubFolder.Items.Count

    'For i = 1 To strAnzItems


    With objPubFolder.Items(i) ' HIER GIBTS DANN DIE FEHLERMELDUNG!

    strEntryID = .EntryID
    strEMail = .SenderEmailAddress
    strBetreff = .Subject
    strBody = .Body
    strEmpfangsdatum = .ReceivedTime
    strDateTime = Format(strEmpfangsdatum, "yyyymmdd_hhmmss")
    strDateTime = Replace(strDateTime, ".", "")
    strDateTime = Replace(strDateTime, ":", "")
    strDateTime = Replace(strDateTime, " ", "_")

    .UnRead = False
    .Save

    'Mail verschieben

    Set myMovedItem = .Move(objTargetFolder)
    strEntryID = myMovedItem.EntryID
    'Set objTargetFolder = Nothing
    myMovedItem.UnRead = False
    myMovedItem.Save

    ' Jetzt kommen einige Prozeduren in denen die o.g. ausgelesenen Daten verarbeitet werden. Diese habe ich Aufgrund der Übersichtlichkeit entfernt

    'Variablen löschen
    strKMitarbeiter = Empty
    strEmpfangsdatum = Empty
    strKMitarbeiter = Empty
    strBetreff = Empty
    strBody = Empty
    strEntryID = Empty
    strTicketNr = Empty

    'Nächsten Datensatz im Folder ansprechen

    'strAnzItems = objPubFolder.Items.Count
    strAnzItems = strAnzItems - 1 'Beides ist eigentlich nicht mehr nötig weil ich ja oben immer die aktuelle Anzahl ermittle. Aber auch das "manuelle" Herunterzählen der Anzahl  bringt den gleichen Fehler.

    Next i

    cnn.Close
    End Function

    Was mache ich falsch?

    Viele Grüße und vielen Dank

    Patrick

    Freitag, 4. Januar 2013 10:46

Alle Antworten

  • Da ich es jetzt nicht mehr auswendig weiß: War Items ein Array oder eine Collection? Wenn letzteres der Fall ist, dann würde ich mal mit for each darüber laufen.

    Ansonsten kann ich mich daran erinnern, das ich einmal den Fall hatte, wo es immer nur von 1 bis Count-1 funktioniert hat. Frag mich jetzt aber nicht nach 'nem Beispiel.

    Freitag, 4. Januar 2013 10:58
    Moderator
  • Hallo Stefan,

    ich weiss es leider auch nicht, habe es aber einfach mal probiert. Habe eine neue Variable definiert:

    Dim objEMail As Outlook.MailItem

    und dann mit For Ech gearbeitet:

    For Each objEMail In objPubFolder
    With objEMail

    strEntryID = .EntryID
    strEMail = .SenderEmailAddress
    strBetreff = .Subject
    strBody = .Body

    [..]

    Next objEMail

    Aber ich bekomme die Fehlermeldung "Objekt unterstützt diese Eigenschaft oder Methode nicht" bei For Each objEMail In objPubFolder

     

    Freitag, 4. Januar 2013 11:21
  • Hallo Zusammen,

    ich habe es jetzt mit Hilfe dieses Links http://www.office-loesung.de/ftopic335985_0_0_asc.php umgebaut und jetzt läuft es problemlos:

    Function GetServiceEMails(Folderpath, strSubjektNr As String)

        Dim objOutlook As Outlook.Application, objNameSpace As Outlook.NameSpace
        Dim objMailordner As Outlook.MAPIFolder
        Dim objGAINMailordner As Outlook.MAPIFolder
        Dim objAttachment As Outlook.Attachment, objMail As Outlook.Items
        Dim objEMail As Outlook.MailItem
        Dim intCtr As Integer
       
    Dim strEntryID As String, strStoreID As String, strBetreff As String, strBody As String, strEMail As String
    Dim strEmpfangsdatum As String, strDateTime As String, strKMitarbeiter
    Dim strTicketNr As String, strSaveAs As String, strAblagepfad As String

      'Suchordner festlegen
        Set objOutlook = New Outlook.Application
        Set objNameSpace = objOutlook.GetNamespace("MAPI")
        Set objMailordner = objNameSpace.GetDefaultFolder(olFolderInbox)

      strFolderpath = Replace(Folderpath, "/", "\")
      aFolders = Split(Folderpath, "\")

      'set the root folder
      Set objGAINMailordner = objNameSpace.Folders(aFolders(0))
     
      'loop through the array to get the subfolder
      'loop is skipped when there is only one element in the array
      For i = 1 To UBound(aFolders)
     
        Set objGAINMailordner = objGAINMailordner.Folders(aFolders(i))
       
    If objGAINMailordner Is Nothing Or Err.Number <> 0 Then

    MsgBox "Der Ordner " & aFolders(i) & " existiert nicht.", vbOKOnly, "Ordner nicht vorhanden"

    Exit Function

    End If
     
      Next

    Set objTargetFolder = objGAINMailordner.Folders("bearbeitet")
    Set objMail = objGAINMailordner.Items
           
        'Mails auslesen
        For Each objEMail In objMail
        With objEMail
           
    strEntryID = .EntryID
    strEMail = .SenderEmailAddress
    strBetreff = .Subject
    strBody = .Body
    strEmpfangsdatum = .ReceivedTime
    strDateTime = Format(strEmpfangsdatum, "yyyymmdd_hhmmss")
    strDateTime = Replace(strDateTime, ".", "")
    strDateTime = Replace(strDateTime, ":", "")
    strDateTime = Replace(strDateTime, " ", "_")

    .UnRead = False
    .Save
    'Mail verschieben im Ordner "bearbeitet"

    Set myMovedItem = .Move(objTargetFolder)
    strEntryID = myMovedItem.EntryID
    myMovedItem.UnRead = False
    myMovedItem.Save

    '[..]

    End With

    'Variablen löschen
    strKMitarbeiter = Empty
    strEmpfangsdatum = Empty
    strKMitarbeiter = Empty
    strBetreff = Empty
    strBody = Empty
    strEntryID = Empty
    strTicketNr = Empty
           
    'Nächste Mail aufrufen
        Next objEMail
       
    'Function abschließen
        Set objAttachment = Nothing
        Set objMail = Nothing
        Set objMailordner = Nothing
        Set objGAINMailordner = Nothing
        Set objNameSpace = Nothing
        Set objOutlook = Nothing

    End Function

    Freitag, 4. Januar 2013 15:36
  • Hallo Zusammen,

    ich muss den Thread doch nochmal aufmachen. Der Code läuft jetzt zwar ohne Fehlermeldung durch, aber es werden nicht alle Mails im Ordner ausgelesen. Bei wenigen Mails (also bei ca. unter 10) geht es in der Tat problemlos aber wenn mehr Mails im Ordner sind stoppt der Code einfach irgendwann als wäre er fertig. Und danach werden bei jedem weiteren Start immer nur exakt die Hälfte der restlichen vorhandenen Mails bearbeitet. Auch dann wenn nur noch 2 Mails im Ordner sind. Dann wir nur eine abgefragt und beim nächsten Mal die Zweite.

    Wenn man den Vorgang lange nicht gemacht hat, werden beim ersten Start auch schon mal alle Mails abgefragt, wenn nicht zu viele im Ordner sind. Ist der Vorgang jedoch erstmal abgebrochen wird immer nur die Hälfte abgerufen.

    Hat jemand dazu eine Idee? Leere ich ggf. eine Variable nicht? Oder könnte das ggf. eher ein Exchange bzw. Outlook Problem sein? Bzw. ggf. auch eine Sicherheitseinstellung?

    Vielen Dank für Hilfe.

    Patrick

    Dienstag, 15. Januar 2013 10:28