darkestdespair
Goto Top

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.

Content-Key: 130181

Url: https://administrator.de/contentid/130181

Printed on: April 25, 2024 at 03:04 o'clock

Member: Gilneas
Gilneas Nov 25, 2009 at 08:43:37 (UTC)
Goto Top
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 face-wink


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 face-wink
Mitglied: 76109
76109 Nov 25, 2009 at 09:00:33 (UTC)
Goto Top
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 face-wink
Das ist wohl der größte Schwachsinn, den ich je gehört habeface-wink

Gruß Dieter
Member: TheEternalPhenom
TheEternalPhenom Nov 25, 2009 at 09:35:32 (UTC)
Goto Top
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.
Mitglied: 76109
76109 Nov 25, 2009 at 09:57:36 (UTC)
Goto Top
Hallo duffman521!

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?

Gruß Dieter.
Member: TheEternalPhenom
TheEternalPhenom Nov 25, 2009 at 10:08:02 (UTC)
Goto Top
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.


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.
Mitglied: 76109
76109 Nov 25, 2009 at 11:05:59 (UTC)
Goto Top
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 überzogenface-wink

Gruß Dieter
Member: TheEternalPhenom
TheEternalPhenom Nov 25, 2009 at 11:32:05 (UTC)
Goto Top
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.
Mitglied: 76109
76109 Nov 25, 2009 at 12:19:41 (UTC)
Goto Top
Hallo nochmal!

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
Und das wäre ein eigenes Goto in Assembler:
   ; Goto 123
   ; 
        jmp	short @1@123		= GOTO @1@123        
        ......
        ......
@1@123:
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
Member: Gilneas
Gilneas Nov 25, 2009 at 14:10:33 (UTC)
Goto Top
Ohje, hätt ich bloß den Mund gehalten. face-big-smile

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.
Member: darkestdespair
darkestdespair Nov 25, 2009 at 14:35:42 (UTC)
Goto Top
Danke, ich wollte schon fast fragen, wo ich hier gelandet bin...
Eigentlich sollte, nachdem, was ich rausgefunden habe, das alles ganz normal sein in VB von Outlook.
Nur trotzdem geht das nicht...
Gruß
Mitglied: 76109
76109 Nov 25, 2009 at 14:55:14 (UTC)
Goto Top
Hallo darkestdespair!

Ich sollte mich wohl auch entschuldigen, war ziemlich an der Sache vorbeiface-smile.

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
Member: Biber
Biber Nov 25, 2009 at 21:18:08 (UTC)
Goto Top
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!!):
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
Member: TheEternalPhenom
TheEternalPhenom Nov 27, 2009 at 06:38:56 (UTC)
Goto Top
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.
Member: darkestdespair
darkestdespair Nov 27, 2009 at 14:10:58 (UTC)
Goto Top
Sry erstmal, bin grade erst zum testen gekommen.
Also funktionieren tuts, aber ich kriege 2 Abfragen, einmal vor dem eigentlichen schicken und zwar:
http://img121.imageshack.us/i/spam1y.jpg/
Und für jede E-Mail muss ich dann auch noch eine gesonderte Bestätigung abgeben:
http://img265.imageshack.us/i/spam2w.jpg/
Kann man das umgehen?
Ich denke nämlich, dass sich dann einige User schwer aufregen werden.
Vor allem weil man vor jeder Mail noch ne Zeit warten muss, bevor man die nächste Bestätigen kann.
Member: Gilneas
Gilneas Nov 27, 2009 at 17:30:51 (UTC)
Goto Top
Ich würde jetzt mal probieren in den Sicherheitseinstellungen von Outlook rumzustellen.
Die sind leider auch mit denen für den IE verknüpft, aber vll. findet sich da was. Fang doch mal grob an, in dem du die Sicherheitsstufen ganz runterschaltest, um herauszufinden, ob es überhaupt Einfluss hat.
Member: TheEternalPhenom
TheEternalPhenom Nov 28, 2009 at 12:49:51 (UTC)
Goto Top
Naja man merkt das Windows gelernt hat. Einer der ersten Virern, wars glaube ich, hat sich selbst per VBA Script über Outlook verschickt. Wenn man dein Programm in Verbindung mit diesem Problem sieht ist es nur gut das Outlook nachfragt.