VBA Problem nach Umstieg von OL2016 auf OL365

Moderator: ModerationP

VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon HKindler » 14. Feb 2019, 09:34

Hallo,

ich habe seit langer Zeit (seit OL2013) ein Makro laufen, das einzelne Ordner anspricht und Elemente darin löscht. Unter OL2013 und OL2016 hat es klaglos seine Dienste verrichtet. Jetzt wurde bei uns auf Office 365 umgestellt. Und plötzlich funktioniert das Makro nicht mehr. Schon beim Start kommt der Fehler:
Fehler beim Kompilieren:
Funktionsmerkmal der Objektbibliothek nicht unterstützt
dabei wird in der Zeile
Dim Ordner As Folder
Ordner = Application.Session.GetDefaultFolder(olFolderDeletedItems)
der Ausdruck .GetDefaultFolder blau hinterlegt. Gebe ich den Befehl im Direktfenster ein, wird er anstandslos ausgeführt.

Hat einer von euch eine Idee, was hier schief laufen könnte?
Gruß,
Helmut

----------------------------
Windows 10 Enterprise (64 Bit) / Office 365 ProPlus (32 Bit)
Benutzeravatar
HKindler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3799
Registriert: 04. Jul 2013, 09:02

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon halweg » 14. Feb 2019, 10:19

Könnte es sein, dass du in dieser Session keinen offiziellen Papierkorbfolder hast? Und du weißt schon, dass vor "Ordner" ein "Set" stehen muss?

Ansonsten: Versuche alternativ an die Ordnerobjekte ranzukommen, z. B.:
Session.GetDefaultFolder(olFolderDeleteditems) (Ohne "Application.")
oder der lange Weg:
ThisOutlookSession.GetNamespace("MAPI").GetDefaultFolder(olFolderDeletedItems)

Als Workaround könntest du eine Schleife bauen, etwa
For each ordner in Session.Folders
For each unterordner in order.Folders
...


um zu ermitteln, welche Nummern dein Papierkorbordner hat.

Viele Grüße, Halweg
Office 2002, 2010; Windows 7, 10
Benutzeravatar
halweg
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 560
Registriert: 21. Okt 2010, 08:04
Wohnort: Dresden

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon mmarkus » 14. Feb 2019, 10:27

Folder ist ein Klasse.
VBA fordert bei Objektzuweisungen ein Set.
Fehlt das nur hier in deinem Post?

Code: Alles auswählen
Set Ordner = Application.Session.GetDefaultFolder(olFolderDeletedItems)


Ansonsten solltest du prüfen, ob sich bei der Methode GetDefaultFolder etwas geändert hat, und die Fehlermeldung nicht ignorieren.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1609
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon HKindler » 14. Feb 2019, 11:07

Hi Halweg,

danke für die Antwort. Das mit dem Set weiß ich, habe ich nur für dieses Beispiel vergessen. In Wahrheit sehen die Zeilen so aus:
Code: Alles auswählen
Sub AlteMailsWeg
Const cTage As Long = 45    'wie alt soll eine Mail mindestens sein um endgültig gelöscht zu werden
Dim GelöschteMails As String
Dim Empfänger As String
...
With Application.Session
    Empfänger = .CurrentUser.AddressEntry.GetExchangeUser.PrimarySmtpAddress
    i = LoescheAlteObjekteImOrdner(.GetDefaultFolder(olFolderDeletedItems), cTage, GelöschteMails)
End With
...
End Sub

Function LoescheAlteObjekteImOrdner(Ordner As Folder, _
                                    Tage As Long, _
                                    ByRef Protokoll As String, _
                                    Optional NurGelesen As Boolean = False) As Long
Aber ich wollte nicht zu sehr verwirren. :)

Session.GetDefaultFolder und ThisOutlookSession.GetNamespace("MAPI").GetDefaultFolder lassen sich leider auch beide nicht kompilieren.

Das Seltsame ist, dass .CurrentUser kompiliert und .GetDefaultFolder funktioniert ja auch im Direktfenster.

Ich habe auch schon Application.Session.Folders("Deleted Items") versucht. Hier bleibt das Kompilieren bei .Folders mit derselben Fehlermeldung hängen.

Von daher wird der von dir vorgeschlagene Workaround auch nicht funktionieren. :(

Seltsame Geschichte...
Gruß,
Helmut

----------------------------
Windows 10 Enterprise (64 Bit) / Office 365 ProPlus (32 Bit)
Benutzeravatar
HKindler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3799
Registriert: 04. Jul 2013, 09:02

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon HKindler » 14. Feb 2019, 11:13

Hi mmarkus,

bin beim Erstellen meiner vorigen Antwort aufgehalten worden. Daher habe ich jetzt erst deine Antwort gesehen. Wie gesagt, das mit dem fehlenden Set war ein Versehen, sozusagen ein Dreckfuhler. :)

Übrigens kann ich den Fehler gar nicht ignorieren, da sich das Makro nicht kompilieren lässt, sondern an der Stelle hängen bleibt. Gebe ich die Befehle einzeln im Direktfenster ein funktioniert es jedoch.
Gruß,
Helmut

----------------------------
Windows 10 Enterprise (64 Bit) / Office 365 ProPlus (32 Bit)
Benutzeravatar
HKindler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3799
Registriert: 04. Jul 2013, 09:02

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon mmarkus » 14. Feb 2019, 11:35

Ich vermute der Fehler hat nichts mit dem zu tun was markiert wurde.
Du könntest die fraglichen Passagen einfach mal auskommentieren und schauen ob was der Compiler macht wenn du den Code kompilierst.
Gibt es irgend welche Addins, oder sonstige Klassen außerhalb von Outlook die verwendet werden?
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1609
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon HKindler » 14. Feb 2019, 13:08

Hi mmarkus,

wenn ich alle Zeilen mit .GetDefalutFolder und .Folders weg kommentiere, dann kompiliert das Makro. Es wird auch die Kontroll-Mail erzeugt und gesendet. Die eigentliche Arbeit, das löschen der alten Mails, erfolgt dann natürlich nicht, da diese Zeilen dann ja auskommentiert sind.

Hier mal das komplette Modul:
Code: Alles auswählen
Option Explicit
Function LoescheAlteObjekteImOrdner(Ordner As Folder, _
                                    Tage As Long, _
                                    ByRef Protokoll As String, _
                                    Optional NurGelesen As Boolean = False) As Long
'löscht Mails in "Ordner" die älter als "Tage" Tage sind
'in "Protokoll" wird ein Protokoll zurück gegeben
'wird NurGelesen gesetzt, so werden ungelesene Mails nicht gelöscht
'Rückgabe: Anzahl gelöschter Mails
Dim i As Long
Dim k As Long
Dim MaxDat As Date
MaxDat = Now - Tage
With Ordner
    Protokoll = Protokoll & vbCrLf
    Protokoll = Protokoll & "Ordner: " & .Name & vbTab
    Protokoll = Protokoll & "Tage: " & Tage & " (" & MaxDat & ")"
    Protokoll = Protokoll & vbCrLf & vbCrLf
    On Error Resume Next
        For i = .Items.Count To 1 Step -1
            With .Items(i)
                If .CreationTime < MaxDat Then
                    If NurGelesen And .UnRead Then
                        'Nur gelesene sollen gelöscht werden, dieses Item ist aber nicht gelesen!
                    Else
                        k = k + 1
                        Protokoll = Protokoll & k & vbTab
                        Protokoll = Protokoll & i & vbTab
                        Protokoll = Protokoll & .CreationTime & Space(4)
                        Protokoll = Protokoll & olKlasse(.Class) & vbTab
                        Protokoll = Protokoll & Chr(34) & .Subject & Chr(34) & Space(4)
                        Protokoll = Protokoll & "Von: " & Chr(34)
                        Protokoll = Protokoll & .SenderName
                        Protokoll = Protokoll & Chr(34) & Space(4)
                        Protokoll = Protokoll & "An: " & Chr(34)
                        Protokoll = Protokoll & .Recipients(1).Name
                        Protokoll = Protokoll & Chr(34)
                        If .Recipients.Count > 1 Then
                            Protokoll = Protokoll & " ... (+" & .Recipients.Count - 1 & ")"
                        End If
                        Protokoll = Protokoll & vbCrLf
                        .Delete
                    End If  'NurGelesen And .Unread
                End If  'CreationTime < MaxDat
            End With    'Items(i)
        Next i
    On Error GoTo 0
    If k = 0 Then   'nichts gelöscht
        Protokoll = Protokoll & "nichts zu löschen" & vbCrLf
    End If
End With    'Ordner
LoescheAlteObjekteImOrdner = k
End Function
Function olKlasse(Code As Long) As String
'gibt die Outlook-Klasse von "Code" zurück
Dim s As String
s = "Application,Namespace,Folder,,Recipient,Attachment,,AddressList,AddressEntry,,,,,,,Folders,Items,Recipients,Attachments,,AddressLists,AddressEntries,,,,,Appointment,,RecurrencePattern,Exceptions,Exception,,"
s = s & "Action,Actions,Explorer,Inspector,Pages,FormDescription,UserProperties,UserProperty,Contact,Document,Journal,Mail,Note,Post,Report,Remote,Task,TaskRequest,TaskRequestUpdate,TaskRequestAccept,"
s = s & "TaskRequestDecline,MeetingRequest,MeetingCancellation,MeetingResponseNegative,MeetingResponsePositive,MeetingResponseTentative,,,Explorers,Inspectors,Panes,OutlookBarPane,OutlookBarStorage,OutlookBarGroups,"
s = s & "OutlookBarGroup,OutlookBarShortcuts,OutlookBarShortcut,DistributionList,PropertyPageSite,PropertyPages,SyncObject,SyncObjects,Selection,,,Search,Results,Views,View,,,,,,,,,,,,,,,,,,ItemProperties,ItemProperty,Reminders,"
s = s & "Reminder,Conflict,Conflicts,Sharing,Account,Accounts,Store,Stores,SelectNamesDialog,ExchangeUser,ExchangeDistributionList,PropertyAccessor,StorageItem,Rules,Rule,RuleActions,RuleAction,MoveOrCopyRuleAction,"
s = s & "SendRuleAction,Table,Row,AssignToCategoryRuleAction,PlaySoundRuleAction,MarkAsTaskRuleAction,NewItemAlertRuleAction,RuleConditions,RuleCondition,ImportanceRuleCondition,FormRegion,CategoryRuleCondition,"
s = s & "FormNameRuleCondition,FromRuleCondition,SenderInAddressListRuleCondition,TextRuleCondition,AccountRuleCondition,ClassTableView,ClassIconView,ClassCardView,ClassCalendarView,ClassTimeLineView,ViewFields,ViewField,,"
s = s & "OrderField,OrderFields,ViewFont,AutoFormatRule,AutoFormatRules,ColumnFormat,Columns,CalendarSharing,Category,Categories,Column,ClassNavigationPane,NavigationModules,NavigationModule,MailModule,"
s = s & "CalendarModule,ContactsModule,TasksModule,JournalModule,NotesModule,NavigationGroups,NavigationGroup,NavigationFolders,NavigationFolder,ClassBusinessCardView,AttachmentSelection,AddressRuleCondition,"
s = s & "FolderUserProperty,UserDefinedProperty,FolderUserProperties,UserDefinedProperties,FromRssFeedRuleCondition,ClassTimeZone,ClassTimeZones,,SolutionsModule,Conversation,SimpleItems,Outspace,MeetingForwardNotification,"
s = s & "ConversationHeader,ClassPeopleView"
'olKlasse = "ol" & Split(s, ",")(Code)
olKlasse = Split(s, ",")(Code)
End Function
Sub AlteMailsWeg()
'loescht alte Mails
Const cTage As Long = 45    'wie alt soll eine Mail mindestens sein um endgültig gelöscht zu werden
Const cTage2 As Long = 25   'wie alt soll eine Mail mindestens sein um verschoben zu werden
Dim i As Long
Dim i2 As Long
Dim Brief As MailItem
Dim Empfänger As String
Dim GelöschteMails As String
Dim VerschobeneMails As String
'If Now - StartZeit < TimeSerial(0, 0, 10) Then Exit Sub
'GelöschteMails = "DIES IST NUR EINE SIMULATION!" & vbCrLf & vbCrLf
With Application.Session
    Empfänger = .CurrentUser.AddressEntry.GetExchangeUser.PrimarySmtpAddress
    i = LoescheAlteObjekteImOrdner(.GetDefaultFolder(olFolderDeletedItems), cTage, GelöschteMails)
    i2 = LoescheAlteObjekteImOrdner(.GetDefaultFolder(olFolderJunk), cTage2, VerschobeneMails)
    i2 = i2 + LoescheAlteObjekteImOrdner(.Folders(Empfänger).Folders("Ordner") _
                                         .Folders("(JunkFilterNachrichten)"), cTage2, VerschobeneMails)
    i2 = i2 + LoescheAlteObjekteImOrdner(.Folders(Empfänger).Folders("Ordner").Folders("(Privat)") _
                                         .Folders("LinkedIn"), cTage2, VerschobeneMails, True)
    i2 = i2 + LoescheAlteObjekteImOrdner(.Folders(Empfänger).Folders("Ordner").Folders("(Privat)") _
                                         .Folders("Xing"), cTage2, VerschobeneMails, True)
End With
GelöschteMails = i & " Mails gelöscht" & vbCrLf & _
                 i2 & " Mails verschoben (zum Löschen)" & vbCrLf & vbCrLf & _
                 GelöschteMails & _
                 VerschobeneMails
Set Brief = Application.CreateItem(olMailItem)
With Brief
    .Recipients.Add Empfänger
    .Subject = "Am " & Now & " gelöschte Mails (" & i & "/" & i2 & ")"
    .BodyFormat = olFormatPlain
    .Body = GelöschteMails
    .BodyFormat = olFormatRichText
    .DeleteAfterSubmit = True
    '.Display
    .Send
End With
End Sub


AddIns sind einige geladen (siehe Screenshots)
2019-02-14 13_01_13-COM-Add-Ins.png

2019-02-14 13_01_33-COM-Add-Ins.png


Und dann noch die aktivierten Verweise
2019-02-14 13_06_41-Verweise - Projekt1.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Gruß,
Helmut

----------------------------
Windows 10 Enterprise (64 Bit) / Office 365 ProPlus (32 Bit)
Benutzeravatar
HKindler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3799
Registriert: 04. Jul 2013, 09:02

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon halweg » 14. Feb 2019, 13:19

HKindler hat geschrieben:Ich habe auch schon Application.Session.Folders("Deleted Items") versucht. Hier bleibt das Kompilieren bei .Folders mit derselben Fehlermeldung hängen.
Von daher wird der von dir vorgeschlagene Workaround auch nicht funktionieren. :(

Das dürfte so nicht funktionieren, da du ja die Ordner auf der richtigen Verzeichnisebene adressieren musst (siehe meine Schleife oben). Hier also eher
Session.Folders(1).Folders("Deleted Items")
Und ja, natürlich müsstest du auch darauf achten, dass dein Standardlöschordner so heißt (meiner heißt z. B. "Gelöschte Objekte").

Übrigens, jetzt da du den Use Case beschreibst: Das Ziel des Löschens von alten Mails über einen bestimmten Zeitraums kannst du auch makrofrei erreichen, indem du dir einen passenden Suchordner anlegst, dessen Elemente du dann nur noch markieren und löschen musst.
Office 2002, 2010; Windows 7, 10
Benutzeravatar
halweg
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 560
Registriert: 21. Okt 2010, 08:04
Wohnort: Dresden

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon HKindler » 14. Feb 2019, 14:15

Hi halweg,

danke, du hast recht, ich hatte das aus dem Gedächtnis wiedergegeben. Es heißt tatsächlich session.folders(1).Folders("Deleted Items")
Und ja, der Löschordner heißt bei mir so.

Das ändert aber alles nichts daran, dass das Makro bisher so funktioniert hat und sicher auch weiter funktionieren würde, wenn Outlook es denn kompilieren würde. Denn wenn ich die Befehle im Editor tippe, werden mir die entsprechenden Befehle per IntelliSense so vorgeschlagen. Auch im Editorfenster eingetippt, werden die Befehle korrekt ausgeführt. Nur weigert sich VBA das Makro zu kompilieren.

So etwas hatte ich echt noch nie!

Danke für den Tipp mit dem Suchordner. Aber mit dem Makro ging das halt ohne einen einzigen Klick, da ich es im Quit-Event hinterlegt hatte:
Code: Alles auswählen
Private Sub Application_Quit()
AlteMailsWeg
End Sub
Gruß,
Helmut

----------------------------
Windows 10 Enterprise (64 Bit) / Office 365 ProPlus (32 Bit)
Benutzeravatar
HKindler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3799
Registriert: 04. Jul 2013, 09:02

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon mmarkus » 14. Feb 2019, 14:38

halweg hat geschrieben:
HKindler hat geschrieben:Ich habe auch schon Application.Session.Folders("Deleted Items") versucht. Hier bleibt das Kompilieren bei .Folders mit derselben Fehlermeldung hängen.
Von daher wird der von dir vorgeschlagene Workaround auch nicht funktionieren. :(

Das dürfte so nicht funktionieren, da du ja die Ordner auf der richtigen Verzeichnisebene adressieren musst (siehe meine Schleife oben).


Kompilieren müsste aber funktionieren, da der Code syntaktisch ja korrekt ist.

Ich vermute, dass das Problem es nichts mit dem Code zu tun hat.
VBA ist leider nicht sehr stabil.
Da kann vieles zu solchen Problemen führen.
(schon das simple Löschen von Code, fehlende/fehlerhafte Referenzen, nicht korrekt registrierte Klassen usw.)
Es wird dann mitunter irgend eine Fehler reklamiert, der aber nichts mit dem Problem zu tun hat.

Für mich ist so ein Verhalten nicht neu.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1609
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon HKindler » 14. Feb 2019, 15:10

Hi mmarkus,

sapperlot! Dein letzter Post hat die Lösung gebracht. Ich habe jetzt einfach mal ganz vorne folgende Routine eingefügt:
Code: Alles auswählen
Sub Test()
Dim Ordner As Folder
Set Ordner = Application.Session..GetDefaultFolder(olFolderDeletedItems)
MsgBox Ordner.Name
End Sub
Und was ist los? Das verdammte Teil kompiliert komplett durch. Inklusive der alten Makros. Auch nach dem Löschen von Test() läuft nun alles immer noch.

Also im VBA-Bereich von Excel, in dem ich mich normalerweise rumtreibe, hatte ich so etwas noch nie!
Gruß,
Helmut

----------------------------
Windows 10 Enterprise (64 Bit) / Office 365 ProPlus (32 Bit)
Benutzeravatar
HKindler
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3799
Registriert: 04. Jul 2013, 09:02

Re: VBA Problem nach Umstieg von OL2016 auf OL365

Beitragvon mmarkus » 14. Feb 2019, 20:59

@HKindler, ja manchmal hat man Glück - oder eben Pech.
In Access ist so was mitunter schon problematischer.
Es hat auch schon genügt eine Klasse zu löschen und nichts geht mehr.
Wenn du dann mehrere Hundert Module hast, dann schaust blöd.
Daher speichere ich alle Module als Text um sie notfalls in ein neues Projekt zu importieren
und man hat in der Regel eine saubere Installation.
Das ist bei jeder anderen Programmierumgebung (bis auf wenigen Ausnahmen) der Standard.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1609
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich


Zurück zu Outlook Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste