VB-Outlook-Skript
Ich möchte gerne eine Mail versenden, die andere Mails im Anhang hat
Hallo erstmal.
Ich habe einen Code verfasst, der ausgewählte Spammails als Anhang an eine festgelegte Mail-Adresse schicken soll, beim Betätigen eines Buttons.
Die E-Mail soll keinen Text und keinen Betreff enthalten, nur eben die markierten Spammails als Anhang.
Leider erhalte ich immer wieder Fehler und weiss nicht mehr weiter, da ich absoluter Neuling auf VB-Ebene bin.
Es geht um den folgenden Code:
Private Lfn As Integer
Sub Markierte_Mails_Verschicken()
Dim Ordner As MAPIFolder
Dim SelektierteMail As MailItem
Dim Selektion As Selection
Dim Anzahl_kopierte_Mails As Integer
On Error GoTo Fehler
Ordner = Application.ActiveExplorer.CurrentFolder 'Den aktuell geöffneten Ordner verwenden.
Selektion = Ordner.Selection 'Die markierten Mails benutzen
Anzahl_kopierte_Mails = 0 'Set kopierte = 0
If Selektion.Count = 0 Then
MsgBox ("Bitte Mails auswählen!")
Else: For Each SelektierteMail In Selektion
Mail_senden (SelektierteMail) 'Übergeben der Mails an das Unterprogramm
Anzahl_kopierte_Mails = Anzahl_kopierte_Mails + 1
Next
End If
Exit Sub
Fehler:
MsgBox (Err.Description + " Bitte sicherstellen, dass im gewählten Ordner Mails markiert sind und der Ordner ein Mailordner ist!")
End Sub
Private Sub Mail_senden(ByVal Mail As Object)
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
With olApp.CreateItem(0)
'Empfänger
.Recipients.Add "Mail@Mail.de
'Lesebestätigung aus
.ReadReceiptRequested = False
'Dateianhang
.Attachments.Add Mail
.Send
End With
Set olApp = Nothing
End Sub
Ich erhalte bei der Zeile "Ordner = Application.ActiveExplorer.CurrentFolder 'Den aktuell geöffneten Ordner verwenden." immer den Fehler: Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt.
Leider habe ich absolut keine Ahnung, wie ich weiter vorgehen muss. Bin, wie schon gesagt, absoluter Neuling auf dem Gebiet.
Hallo erstmal.
Ich habe einen Code verfasst, der ausgewählte Spammails als Anhang an eine festgelegte Mail-Adresse schicken soll, beim Betätigen eines Buttons.
Die E-Mail soll keinen Text und keinen Betreff enthalten, nur eben die markierten Spammails als Anhang.
Leider erhalte ich immer wieder Fehler und weiss nicht mehr weiter, da ich absoluter Neuling auf VB-Ebene bin.
Es geht um den folgenden Code:
Private Lfn As Integer
Sub Markierte_Mails_Verschicken()
Dim Ordner As MAPIFolder
Dim SelektierteMail As MailItem
Dim Selektion As Selection
Dim Anzahl_kopierte_Mails As Integer
On Error GoTo Fehler
Ordner = Application.ActiveExplorer.CurrentFolder 'Den aktuell geöffneten Ordner verwenden.
Selektion = Ordner.Selection 'Die markierten Mails benutzen
Anzahl_kopierte_Mails = 0 'Set kopierte = 0
If Selektion.Count = 0 Then
MsgBox ("Bitte Mails auswählen!")
Else: For Each SelektierteMail In Selektion
Mail_senden (SelektierteMail) 'Übergeben der Mails an das Unterprogramm
Anzahl_kopierte_Mails = Anzahl_kopierte_Mails + 1
Next
End If
Exit Sub
Fehler:
MsgBox (Err.Description + " Bitte sicherstellen, dass im gewählten Ordner Mails markiert sind und der Ordner ein Mailordner ist!")
End Sub
Private Sub Mail_senden(ByVal Mail As Object)
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
With olApp.CreateItem(0)
'Empfänger
.Recipients.Add "Mail@Mail.de
'Lesebestätigung aus
.ReadReceiptRequested = False
'Dateianhang
.Attachments.Add Mail
.Send
End With
Set olApp = Nothing
End Sub
Ich erhalte bei der Zeile "Ordner = Application.ActiveExplorer.CurrentFolder 'Den aktuell geöffneten Ordner verwenden." immer den Fehler: Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt.
Leider habe ich absolut keine Ahnung, wie ich weiter vorgehen muss. Bin, wie schon gesagt, absoluter Neuling auf dem Gebiet.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 130181
Url: https://administrator.de/forum/vb-outlook-skript-130181.html
Ausgedruckt am: 09.04.2025 um 22:04 Uhr
16 Kommentare
Neuester Kommentar
Ich würde dir empfehlen mit solchen anfragen ein auf Code spezialisiertes Forum zu befragen. Für VB.Net fällt mir spontan nur dieses hier ein: http://www.vbarchiv.net
Hier hüpfen mehr Admins als Coder rum
Btw. gotos sind sehr umstritten, viele sagen, dass das man diese vermeiden soll, weil es nichts mit ordentlichen Programmieren zu tun hat. Aber die Frage will ich hier eigentlich nicht aufwerfen
Hier hüpfen mehr Admins als Coder rum
Btw. gotos sind sehr umstritten, viele sagen, dass das man diese vermeiden soll, weil es nichts mit ordentlichen Programmieren zu tun hat. Aber die Frage will ich hier eigentlich nicht aufwerfen

Zitat von @Gilneas:
Btw. gotos sind sehr umstritten, viele sagen, dass das man diese
vermeiden soll, weil es nichts mit ordentlichen Programmieren zu tun
hat. Aber die Frage will ich hier eigentlich nicht aufwerfen
Das ist wohl der größte Schwachsinn, den ich je gehört habeBtw. gotos sind sehr umstritten, viele sagen, dass das man diese
vermeiden soll, weil es nichts mit ordentlichen Programmieren zu tun
hat. Aber die Frage will ich hier eigentlich nicht aufwerfen
Gruß Dieter
Sers
ich hab zwar von VB keine groß Ahnung jedoch aber solche Fehelermeldungen gibt es auch bei VBA. Meistens liegt es daran, dass der Angegeben Pfad/Ordner/Zelle o. ä. nicht gefunden wurde. An deiner Stelle würde ich einfach mal Versuchen über eine Inputbox den Pfad zu der Datei/Ordner händig einzugeben. Somit könntest du jedenfalls testen ob es daran liegt, dass VB den Ordner nicht annehmen will.
@ Dieter
Also in VBA gelten GoTo Anweisungen als nicht gerade schön programmiert. Vorallem weil man meist so programmieren kann das die GoTo Anweisung nicht benötigt wird.
ich hab zwar von VB keine groß Ahnung jedoch aber solche Fehelermeldungen gibt es auch bei VBA. Meistens liegt es daran, dass der Angegeben Pfad/Ordner/Zelle o. ä. nicht gefunden wurde. An deiner Stelle würde ich einfach mal Versuchen über eine Inputbox den Pfad zu der Datei/Ordner händig einzugeben. Somit könntest du jedenfalls testen ob es daran liegt, dass VB den Ordner nicht annehmen will.
@ Dieter
Also in VBA gelten GoTo Anweisungen als nicht gerade schön programmiert. Vorallem weil man meist so programmieren kann das die GoTo Anweisung nicht benötigt wird.

Hallo duffman521!
Gruß Dieter.
Zitat von @TheEternalPhenom:
Also in VBA gelten GoTo Anweisungen als nicht gerade schön
programmiert. Vorallem weil man meist so programmieren kann das die
GoTo Anweisung nicht benötigt wird.
Was meinst Du wie If-, Case-, For- oder While-Schleifen funktionieren. Ihr habt wahrscheinlich noch nie einen Maschinencode (Assembler) gesehen. Wie sonst sollen den Wahr/Falsch-Verzweigungen oder Schleifendurchläufe ohne ein Goto (nicht sichtbar) stattfinden?Also in VBA gelten GoTo Anweisungen als nicht gerade schön
programmiert. Vorallem weil man meist so programmieren kann das die
GoTo Anweisung nicht benötigt wird.
Gruß Dieter.
Zitat von @76109:
Hallo duffman521!
> Zitat von @TheEternalPhenom:
Was meinst Du wie If-, Case-, For- oder While-Schleifen
funktionieren. Ihr habt wahrscheinlich noch nie einen Maschinencode
(Assembler) gesehen.
Wie sonst sollen den Wahr/Falsch-Verzweigungen oder
Schleifendurchlauf ohne ein nicht sichtbares Goto stattfinden?
Gruß Dieter.
Hallo duffman521!
> Zitat von @TheEternalPhenom:
Was meinst Du wie If-, Case-, For- oder While-Schleifen
funktionieren. Ihr habt wahrscheinlich noch nie einen Maschinencode
(Assembler) gesehen.
Wie sonst sollen den Wahr/Falsch-Verzweigungen oder
Schleifendurchlauf ohne ein nicht sichtbares Goto stattfinden?
Gruß Dieter.
Zum einen sagte man kann meistens ohen GoTo programmieren zum anderen habe ich wegen der Verwendung eines GoTo in meine Abschlussprüfung abzüge bekommen. Mit GoTo war der Code 600 Zeichen lang ohne GoTo musste ich knapp 50 Zeichen mehr einbauen.
Und dann rede ich nur von VB und VBA in beiden Programmiersprachen kann man die GoTo Anwendung zu 90 Prozent, wenn nicht so gar öfter, durch If-, Case-, For- oder While-Schleifen verhindern. Wie es in anderen Sprachen genau aussieht kann ich nicht objektive beurteilen bisher habe ich aber großteils nur negatives über die GoTo Anweisung gehört.

Hallo duffman521!
Hatte mich falsch ausgedrückt und oben korrigiert. Also grundsätzlich werden alle Programmiersprachen beim Compilern in einen Maschinecode (Assembler) übersetzt. Und eine If-, Case-, While- oder For-Schleife kann ohne ein Goto (Goto = Sprung zu einer anderen Stelle im Programmcode) nicht funktionieren. Allerdings geb ich Dir insofern recht, dass Goto-Anweisungen über große Distanzen nicht effizient sind. Also bei 600 Zeilen Code würde auch ich keinen Goto mehr verwenden. Goto's sollten nur kurze Distanzen haben, also über ein paar Zeilen (Short-Jumps = relativ +/- 255 Code-Bytes) ist das vollkommen OK. Aber generell zu sagen Goto's zu verwenden sei schlechte Programmierung, finde ich reichlich überzogen
Gruß Dieter
Hatte mich falsch ausgedrückt und oben korrigiert. Also grundsätzlich werden alle Programmiersprachen beim Compilern in einen Maschinecode (Assembler) übersetzt. Und eine If-, Case-, While- oder For-Schleife kann ohne ein Goto (Goto = Sprung zu einer anderen Stelle im Programmcode) nicht funktionieren. Allerdings geb ich Dir insofern recht, dass Goto-Anweisungen über große Distanzen nicht effizient sind. Also bei 600 Zeilen Code würde auch ich keinen Goto mehr verwenden. Goto's sollten nur kurze Distanzen haben, also über ein paar Zeilen (Short-Jumps = relativ +/- 255 Code-Bytes) ist das vollkommen OK. Aber generell zu sagen Goto's zu verwenden sei schlechte Programmierung, finde ich reichlich überzogen
Gruß Dieter
Ich finde es unsauber Programmiert.
Außerdem war der gesamte Programmcode 600 Zeile lang die GoTos gingen über höchstens 10 Zeilen.
Ich habe aber irgendwie das Gefühl wir reden im Momen etwas an einander vorbei.
Was du meinst sind "GoTo" Anweisungen innerhalb einer anderen Anweisung.
Sprich:
If a = b then
MsgBox "Richtig"
Else
MsgBox "Falsch"
End If
In diesem Fall also ist Else eine Sprungmarke, zu der das Programm springt falls die Abfrage Falsch ist.
Was Gilneas und ich meine ist der befehl GoTo (7. Zeile in darkestdespairs Programm).
Sprich:
GoTo 123
Code
Code
Code
123
Code
Code
Code
In diesem Beispiel aber gibt es einen fest definierten Sprung mit GoTo und genau diese Anweisung wird von vielen als "unsaubere" oder schlechte Programmierung angesehen.
Das bei If-, Case-, While- oder For-Schleife Sprungmarken vorhanden sein müssen ist klar.
Außerdem war der gesamte Programmcode 600 Zeile lang die GoTos gingen über höchstens 10 Zeilen.
Ich habe aber irgendwie das Gefühl wir reden im Momen etwas an einander vorbei.
Was du meinst sind "GoTo" Anweisungen innerhalb einer anderen Anweisung.
Sprich:
If a = b then
MsgBox "Richtig"
Else
MsgBox "Falsch"
End If
In diesem Fall also ist Else eine Sprungmarke, zu der das Programm springt falls die Abfrage Falsch ist.
Was Gilneas und ich meine ist der befehl GoTo (7. Zeile in darkestdespairs Programm).
Sprich:
GoTo 123
Code
Code
Code
123
Code
Code
Code
In diesem Beispiel aber gibt es einen fest definierten Sprung mit GoTo und genau diese Anweisung wird von vielen als "unsaubere" oder schlechte Programmierung angesehen.
Das bei If-, Case-, While- oder For-Schleife Sprungmarken vorhanden sein müssen ist klar.

Hallo nochmal!
Also, das wäre mal ein Auszug einer C-Compilerten For-Schleife in Assembler:
Und das wäre ein eigenes Goto in Assembler:
Es ist kein Unterschied, ob die For-Schleife jetzt ein Goto macht oder ob ich einen Goto mache. Der Sprungbefehl ist der gleiche und somit keineswegs verwerflich.
Gruß Dieter
Also, das wäre mal ein Auszug einer C-Compilerten For-Schleife in Assembler:
@1@86:
;
;for(bitc=1;bitc < 256;bitc << 1, i++) {
;
?debug L 38
mov word ptr [bp-4],1
mov ax,word ptr [bp-14]
mov word ptr [bp-12],ax
jmp short @1@338 = GOTO @1@338
@1@142:
......
@1@338:
......
jmp short @1@86 = GOTO @1@86
; Goto 123
;
jmp short @1@123 = GOTO @1@123
......
......
@1@123:
Gruß Dieter
Ohje, hätt ich bloß den Mund gehalten. 
Sorry @ darkestdespair!
Wir sind Offtopic, die Frage war eine andere, es ging nicht um eine Umfrage zum Thema "Wer kann gotos leiden und wer nicht?"
Bezüglich des Fehlers würde ich mich an deiner Stelle mal schlau machen, ob der Aufruf
So korrekt ist, oder ob du noch Bibliotheken oder anderes einbinden musst oder sonst irgend nen Kram initialisieren solltest. Also sprich, welche Grundvoraussetzungen müssen erfüllt sein, dass das Objekt Ordner = Application.ActiveExplorer.CurrentFolder gesetzt ist.
Sorry @ darkestdespair!
Wir sind Offtopic, die Frage war eine andere, es ging nicht um eine Umfrage zum Thema "Wer kann gotos leiden und wer nicht?"
Bezüglich des Fehlers würde ich mich an deiner Stelle mal schlau machen, ob der Aufruf
Ordner = Application.ActiveExplorer.CurrentFolder
So korrekt ist, oder ob du noch Bibliotheken oder anderes einbinden musst oder sonst irgend nen Kram initialisieren solltest. Also sprich, welche Grundvoraussetzungen müssen erfüllt sein, dass das Objekt Ordner = Application.ActiveExplorer.CurrentFolder gesetzt ist.

Hallo darkestdespair!
Ich sollte mich wohl auch entschuldigen, war ziemlich an der Sache vorbei
.
Leider habe ich kein Outlook und kann daher nicht den ganzen Code nachvollziehen, aber Objecte müssen einer Variablen per Set-Anweisung zugewiesen werden
z.B.:
Gruß Dieter
Ich sollte mich wohl auch entschuldigen, war ziemlich an der Sache vorbei
Leider habe ich kein Outlook und kann daher nicht den ganzen Code nachvollziehen, aber Objecte müssen einer Variablen per Set-Anweisung zugewiesen werden
z.B.:
Set Ordner = Application.ActiveExplorer.CurrentFolder 'Den aktuell geöffneten Ordner verwenden.
Set Selektion = Ordner.Selection 'Die markierten Mails benutzen
For Each SelektierteMail In Selektion
...
Set olApp = CreateObject("Outlook.Application")
Set olObj = olApp.CreateItem(0)
Gruß Dieter
Moin darkestdespair,
ein bisschen handwerkliches Nachbessern ist in der Tat erforderlich, aber ... hmmm... erkennbar ist die Absicht ja schon.
Minimale Nachbesserungen nach der ersten Sichtkontrolle ( ungetestete Skizze!!):
Grüße
Biber
ein bisschen handwerkliches Nachbessern ist in der Tat erforderlich, aber ... hmmm... erkennbar ist die Absicht ja schon.
Minimale Nachbesserungen nach der ersten Sichtkontrolle ( ungetestete Skizze!!):
Sub Markierte_Mails_Verschicken()
' Dim Ordner As MAPIFolder
Dim SelektierteMail As MailItem
Dim mySelectedItems As Selection
Dim mailX As MailItem
Dim Anzahl_kopierte_Mails As Integer
On Error GoTo Fehler
' Set Ordner = Application.ActiveExplorer.CurrentFolder 'Den aktuell geöffneten Ordner verwenden.
' "ordner"... for what??
Set mySelectedItems = Application.ActiveExplorer.Selection
' .Selection KANN nur eine Methode des/eines Explorers sein, nicht eines "Ordners"
' --- s.o Set Selektion = Ordner.Selection 'Die markierten Mails benutzen
Anzahl_kopierte_Mails = 0 'Set kopierte = 0
If mySelectedItems.Count = 0 Then
MsgBox ("Bitte Mails auswählen!")
Else
For Each SelektierteMail In mySelectedItems
Set mailX = SelektierteMail
Mail_senden mailX 'Übergeben der Mails an das Unterprogramm
Anzahl_kopierte_Mails = Anzahl_kopierte_Mails + 1
Next
End If
Exit Sub
Fehler:
MsgBox (Err.Description + " Bitte sicherstellen, dass im gewählten Ordner Mails markiert sind und der Ordner ein Mailordner ist!")
End Sub
Private Sub Mail_senden(aMail As MailItem)
'' Hier glaub ich nicht, dass da nun nochmal eine OL-Appz neu geöffnet werden muss!!
' bitte selbst downsizen!!
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
With olApp.CreateItem(0)
'Empfänger
.Recipients.Add "Mail@Mail.de"
'Lesebestätigung aus
.ReadReceiptRequested = False
'Dateianhang
.Attachments.Add aMail
.Send
End With
Set olApp = Nothing
End Sub
Grüße
Biber
1. Enschuldige ich mich auch, weil wir etwas im Thema abgekommen sind.
2. Bin ich überrascht das ich trotz meiner fehlenden VB Kenntnisse schon mal die Richtigezeile gefunden hab, in der der Fehler sein könnte/ist.
3. Würde mich mal interessieren ob die Tipps geholfen haben?
@darkestdespair Du könntest vllt. mal die Lösung hier noch mal posten, wenn alles funktioniert.
2. Bin ich überrascht das ich trotz meiner fehlenden VB Kenntnisse schon mal die Richtigezeile gefunden hab, in der der Fehler sein könnte/ist.
3. Würde mich mal interessieren ob die Tipps geholfen haben?
@darkestdespair Du könntest vllt. mal die Lösung hier noch mal posten, wenn alles funktioniert.