VBA Makro in Outlook 2016 sehr langsam (VBA)

DieSpeedy, Montag, 16.03.2020, 21:25 (vor 78 Tagen)

Hallo zusammen,

ich habe mir ein Makro zusammengestellt, um (eigentlich) E-Mails schneller ablegen zu können. Leider bringt mich die Performance zum Verzweifeln. Habt Ihr eine Idee, wie ich das optimieren kann? (Vorsicht: bin ziemlicher Anfänger ;-) - Aber für Unterstützung sehr dankbar.)

Hier das Makro:
Sub SaveCustomerMail()

Dim strPath As String

strPath = BrowseForFolder("C:\Pfad\")

SaveMail (strPath)

End Sub

Function BrowseForFolder(Optional sFolder As String) As String

Dim exApp As Object
Dim strPath As String: strPath = ""
Dim fldr As FileDialog
Dim bStarted As Boolean
On Error Resume Next
Set exApp = GetObject(, "Excel.Application")
On Error GoTo 0
If exApp Is Nothing Then
Set exApp = CreateObject("Excel.Application")
bStarted = True
End If
Set fldr = exApp.FileDialog(msoFileDialogFolderPicker)
With fldr
.Title = "Select a Folder"
.InitialFileName = sFolder
.AllowMultiSelect = False
If .Show <> -1 Then GoTo lbl_Exit
strPath = .SelectedItems(1) & Chr(92)
End With
lbl_Exit:
BrowseForFolder = strPath
If bStarted = True Then exApp.Quit 'Optional
Set exApp = Nothing
Exit Function
End Function

Function SaveMail(strPath As String)

Dim strText As String
Dim strDate As String

If strPath = "" Then
strPath = "C:\Pfad2\"
End If

'MsgBox (strPath)

i = 1
For Each msg In Application.ActiveExplorer.Selection

'MsgBox (msg)

If TypeOf Application.ActiveWindow Is Outlook.Explorer Then
Set obj = Application.ActiveWindow
Set obj = obj.Selection(i)
i = i + 1

Else

Set objInspector = ActiveInspector
objInspector.Activate

If objInspector.IsWordMail Then
'Set obj = Application.ActiveInspector.CurrentItem
Set obj = Application.ActiveInspector.Selection
End If

End If

With obj
strText = Replace(obj.Subject, "/", "_")
strText = Replace(strText, "!", "")
strText = Replace(strText, ".", "_")
strText = Replace(strText, "\", "_")
strText = Replace(strText, ":", "_")
strText = Replace(strText, "(", "")
strText = Replace(strText, ")", "")
strText = Replace(strText, """", "")

'MsgBox (strText)

strDate = Format(obj.ReceivedTime, "YYYYMMDD_hh-mm")

.SaveAs strPath & strDate & "_" & "von" & "_" & obj.SenderName & "_" & strText & ".msg"

End With

Next msg

End Function

VG
DieSpeedy

VBA Makro in Outlook 2016 sehr langsam

Martin Asal @, Mittwoch, 18.03.2020, 10:02 (vor 76 Tagen) @ DieSpeedy

Hallo Speedy,

ich wundere mich über deine Funktion BrowseForFolder. Das geht doch viel einfacher mit dem FileDialog-Objekt. Ungefähr so:

Function BrowseForFolder() As String
Dim f As Office.FileDialog
 
Set f = Application.FileDialog(msoFileDialogFolderPicker)
f.Show
BrowseForFolder = f.SelectedItems(1)
 
End Function

Weitere Infos zum FileDialog-Objekt findest du im Tutorial.

Aber das löst nicht dein Performance-Problem. Das wird irgendwo innerhalb deiner ForEach-Schleife in SaveMail verursacht (Übrigens, die Variable "i" sollte noch deklariert werden). Wenn ich das richtig gesehen habe, wird die Variable "obj" innerhalb der Schleife immer wieder neu eingelesen, kann sich aber nicht verändern. Wenn dem so ist, sollte das vor die Schleife gesetzt werden, also

 
If TypeOf Application.ActiveWindow Is Outlook.Explorer Then
....
End If

sollte vor das "For Each".

Martin

VBA Makro in Outlook 2016 sehr langsam

DieSpeedy, Samstag, 21.03.2020, 13:04 (vor 73 Tagen) @ Martin Asal

Hi Martin,

erstmal vielen Dank für Deine Rückmeldung. Die waren schon sehr hilfreich. Ich habe nach einigem probieren beinahe alles hinbekommen und das funktioniert auch gut.

Nur das mit dem FileDialog bekomme ich egal was ich tue, nicht hin. Selbst die einfachsten Beispiele (habe noch einiges nachgelesen dazu) bekomme ich immer mit einem Laufzeitfehler 438 zurück.

Hast Du hierzu vielleicht noch eine Idee?

VG
DieSpeedy

VBA Makro in Outlook 2016 sehr langsam

DieSpeedy, Samstag, 21.03.2020, 15:10 (vor 73 Tagen) @ DieSpeedy

Hi Martin,

nochmal ich. :)

Ich denke, jetzt habe ich es. Also wenn ich es richtig verstehen, kann Outlook das mit dem MsoFileDialog nur über Umwege (z.B. Excel).

Wenn ich jetzt Excel vorher starte, dann ist auch mein Makro super schnell. Offensichtlich starte er im Hintergrund sonst Excel und das dauert (öffnen, ausführen, schließen).

Solltest Du etwas anderes zum Thema Outlook und MsoFileDialog wissen, bin ich weiter offen für weitere Optimierungsmöglichkeiten.

Herzlichen Dank.

DieSpeedy

VBA Makro in Outlook 2016 sehr langsam

Martin Asal @, Samstag, 21.03.2020, 15:33 (vor 73 Tagen) @ DieSpeedy

Nur das mit dem FileDialog bekomme ich egal was ich tue, nicht hin.

sieh dir mal an, was im Tutorial zu Objektbibliotheken geschrieben steht. Auch mit Outlook dürfte es kein Problem geben, wenn entsprechend die "Microsoft Office Object Libary" eingebunden ist.

Martin

RSS-Feed dieser Diskussion
powered by my little forum