Moin allerseits,
vielleicht vorab zum Szenario meiner Anfrage: Ich betreibe das Forum VBAsteleien.de, das sich mit VBA in der MS-Office-Familie mit Schwerpunkt Excel beschäftigt. Dort wurde vor einiger Zeit ein Thema (siehe Titel) aufgemacht, dessen XL-VBA-Seite in mehreren Versionen gelöst werden konnte. Versendet sollen sowohl einzelne als auch Serien-Mails mit Daten von Empfänger, CC, Betreff bis hin zu Body und vor allem einem Anhang aus XL per
IBM Notes 10.
Leider gibt es auf VBAsteleien.de niemand (außer dem Fragesteller), der LN zur Verfügung hat. Der folgende Code hat wenigstens schon mal erfolgreich zum Einzelversand geführt. Wenn damit allerdings Verteiler mit > 50 Empfängern erreicht werden sollen, wird die Sache träge: von mehr als drei Minuten wird berichtet. Wir suchen also nach einer Lösung, die Serien-Mails deutlich beschleunigt und haben über diese Konzepte nachgedacht:
- Tatsächlich sequenziell Einzelmails, die dann zuerst im LN Postausgang abgelegt werden und anschließend versandt werden. Dafür haben wir aber keinen LN-Code gefunden
- Alternativ der direkte Versand jeder einzelnen Mail und Rückkehr zu VBA für die nächste (m.E. die schlechteste Methode). Hier zu nutzen wir bisher den Code unten, wobei ich vermute, dass sich der durch das gezielte, nicht für jede Mail wiederholte Laden/Entladen der LN-COM-Objekte beschleunigen ließe.
Der Code liegt in einem allg.VBA-Modul:
| Option Explicit |
| Const EMBED_ATTACHMENT As Long = 1454 |
| |
| Sub SingleMail() |
| Dim sMailTo As String, sCopyTo As String, sSubject As String, sPDF As String, sBody As String, iMails As Integer |
| Dim sht As Worksheet |
| |
| |
| With ActiveSheet |
| |
| |
| sMailTo = .Cells(1, 1) |
| sCopyTo = .Cells(1, 2) |
| sSubject = .Cells(1, 3) |
| sPDF = ThisWorkbook.Path & "\Test " & Date & " " & Timer & ".pdf" |
| sBody = "Das Protokoll vom " & Date |
| iMails = 1 |
| |
| |
| ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=sPDF, _ |
| Quality:=xlQualityStandard, IncludeDocProperties:=False, _ |
| IgnorePrintAreas:=True, OpenAfterPublish:=True |
| |
| |
| Send_LN_Mail sMailTo, sCopyTo, sSubject, sPDF, sBody, iMails |
| |
| End With |
| |
| End Sub |
| |
| Sub Send_LN_Mail(sMailTo As String, sCopyTo As String, sSubject As String, sPDF As String, sBody As String, iMails As Integer) |
| Dim LN_Session As Object, LN_Database As Object, LN_Document As Object |
| Dim LN_Workspace As Object, LN_EmbedObject As Object, LN_attachement As Object |
| |
| |
| Set LN_Session = CreateObject("Notes.NotesSession") |
| Set LN_Database = LN_Session.GETDATABASE("", "") |
| |
| |
| If LN_Database.IsOpen = False Then LN_Database.OPENMAIL |
| |
| |
| Set LN_Document = LN_Database.CreateDocument |
| Set LN_attachement = LN_Document.CreateRichTextItem("sPDF") |
| Set LN_EmbedObject = LN_attachement.EmbedObject(EMBED_ATTACHMENT, "", sPDF) |
| |
| With LN_Document |
| .Form = "Memo" |
| .sendTo = sMailTo |
| .copyTo = sCopyTo |
| .Subject = sSubject |
| .body = sBody |
| .SaveMessageOnSend = True |
| .PostedDate = Now() |
| End With |
| |
| |
| Set LN_Workspace = CreateObject("Notes.NotesUILN_Workspace") |
| Call LN_Workspace.EDITDOCUMENT(True, LN_Document).GOTOFIELD("Body") |
| |
| |
| Set LN_EmbedObject = Nothing |
| Set LN_attachement = Nothing |
| Set LN_Document = Nothing |
| Set LN_Database = Nothing |
| Set LN_Session = Nothing |
| |
| MsgBox iMails & " Mail(s) wurde(n) erstellt. Bitte zu NOTES wechseln" |
| |
| End Sub |
Als Idee würde ich für einen Mehrfachversand per Schleife einen Teil der Set LN_... = Nothing an den Schluss der Schleife stellen. Das könnte dann vielleicht so aussehen:
| Option Explicit |
| Const EMBED_ATTACHMENT As Long = 1454 |
| |
| Sub MultiMail() |
| |
| Dim sMailTo As String, sCopyTo As String, sSubject As String, iMails As Integer |
| Dim sPDF As String, sBody As String, sht As Worksheet |
| |
| Dim LN_Session As Object, LN_Database As Object, LN_Document As Object |
| Dim LN_Workspace As Object, LN_EmbedObject As Object, LN_attachement As Object |
| |
| |
| |
| |
| Application.ScreenUpdating = False |
| For Each sht In ThisWorkbook.Sheets |
| |
| |
| If Left(sht.CodeName, 4) <> "tab_" Then |
| sht.Activate |
| With ActiveSheet |
| |
| |
| sMailTo = .Cells(1, 1) |
| sCopyTo = .Cells(1, 2) |
| sSubject = .Cells(1, 3) |
| sPDF = ThisWorkbook.Path & "\Test " & Date & " @ " & Timer & ".pdf" |
| sBody = "Das Protokoll vom " & Date |
| iMails = iMails + 1 |
| |
| |
| .ExportAsFixedFormat Type:=xlTypePDF, Filename:=sPDF, _ |
| Quality:=xlQualityMinimum, IncludeDocProperties:=False, _ |
| IgnorePrintAreas:=True, OpenAfterPublish:=False |
| End With |
| |
| |
| |
| |
| Set LN_Session = CreateObject("Notes.NotesSession") |
| Set LN_Database = LN_Session.GETDATABASE("", "") |
| |
| |
| If LN_Database.IsOpen = False Then LN_Database.OPENMAIL |
| |
| |
| Set LN_Document = LN_Database.CreateDocument |
| Set LN_attachement = LN_Document.CreateRichTextItem("sPDF") |
| Set LN_EmbedObject = LN_attachement.EmbedObject(EMBED_ATTACHMENT, "", sPDF) |
| |
| With LN_Document |
| .Form = "Memo" |
| .sendTo = sMailTo |
| .copyTo = sCopyTo |
| .Subject = sSubject |
| .body = sBody |
| .SaveMessageOnSend = True |
| .PostedDate = Now() |
| End With |
| |
| |
| Set LN_Workspace = CreateObject("Notes.NotesUILN_Workspace") |
| Call LN_Workspace.EDITDOCUMENT(True, LN_Document).GOTOFIELD("Body") |
| |
| |
| Set LN_Document = Nothing |
| Set LN_attachement = Nothing |
| |
| |
| |
| |
| End If |
| |
| |
| Next |
| Application.ScreenUpdating = True |
| |
| |
| Set LN_EmbedObject = Nothing |
| Set LN_Database = Nothing |
| Set LN_Session = Nothing |
| |
| MsgBox iMails & " Mails für den Versand vorbereitet, bitte zu Notes wechseln." |
| |
| End Sub |
Ganz schön viel auf einmal und für einen ersten Beitrag, ich weiß. Vielleicht kann ja trotzdem jemand (wahrscheinlich mit nur wenigen Zeilen

) helfen.
Dafür schon vorab ganz lieben Dank! die wir natürlich auch mit einem entsprechenden Link hierher belohnen
