fred08155
Goto Top

VBScript: Script zur Erzeugung einer Email mit Variablen füttern

Ich möchte ein Script modifizieren, das ich aus mehreren verschiedenen Entwürfen aus dem Internet zusammengestellt habe.
Dem Script wird auch noch ein Argument per Kommandozeilenbefehl übergeben (Attachment, das von einem anderen Programm erstellt wird). Das funktioniert aber soweit.

Ich will dieses Script in ein anderes einbauen und habe den Code zu diesem Zweck mal als Function definiert.
Ob das der richtige Weg ist weiß ich nicht.
Ich möchte von Sub Funktionen aus Variablen in dieses Script hineinbringen (sMailto,sSubject,sBodyText), um je nach Auswahl im Menü verschiedene Empfänger mit verschiedenen Betreff-Zeilen einzufügen..
Leider bekomme ich das als VBScript Anfänger noch nicht so hin.
Bin gerade dabei mich etwas darin einzulesen und experimentiere mit Code-Schnipseln aus dem Internet.

Bisher werden meine Variablen entweder direkt als Text in Outlook angezeigt (also nicht die Variable die ich gern drin haben würde, sonder eben z.B. als Empfänger der Text "sMailto") oder ich bekomme eine Fehlermeldung "Objekt erforderlich [string:nobody@home.net".
Ich bin mir nicht sicher, was der Fehler ist. Ich hab schon versucht die strings in Objekte zu verwandeln oder als Objekte mit set zu definieren (wo genau liegt eigendlich der Unterschied zwischen variable, String, Objekt etc?) bisher aber ohne Erfolg.

Der Code zum erzeugen der Email über Outlook sieht so aus.
Wie rufe ich den jetzt richtig auf und übergebe die Parameter, Variablen, Strings, Objekte, oder um was es sich dabei auch immer handeln mag?

[code]Function email(sMailto,sSubject,sBodyText)
Dim oApp, oMail, bOLStarted

On Error Resume Next
Set oApp = GetObject("","Outlook.Application")
If oApp Is Nothing Then
Set oApp = CreateObject("Outlook.Application", vbNormalFocus)
bOLStarted = Not oApp Is Nothing
End If
Err.Clear

If Not oApp Is Nothing Then

On Error Resume Next
Set oMail = oApp.CreateItem(0)
Err.Clear

If Not oMail Is Nothing Then

oMail.To = "sMailto"
oMail.Subject = "sSubject"
oMail.Body = "sBodyText"

oMail.Attachments.add WScript.Arguments(0)
' oMail.... = ...
oMail.Display
Set oMail = Nothing

Else

MsgBox "Fehler beim Erstellen der Mail"

End If

If bOLStarted Then oApp.Quit

Set oApp = Nothing

Else

Msgbox "Fehler beim Ermitteln/Erstellen einer Outlook Instanz"

End If [/code]


Der Code mit dem ich obiges versuche aufzurufen sieht momentan so aus:

[code]Sub email_nobody()
Dim sMailto, sSubject, sBodyText
'sMailto = "nobody@home.net"
'sSubject = "Hallo alte Wurschthaut"
'sBodyText = "Hallo Nobody, "&vbcr&_
'""&vbcr&_
'"ich werd nochmal blöde mit dem Script hier:"
set sMailto = GetObject("nobody@home.net")
set sSubject = GetObject("Hallo alte Wurschthaut")
set sBodyText = GetObject("Hallo Nobody, "&vbcr&_
""&vbcr&_
"ich werd nochmal blöde mit dem Script hier:")
call email (sMailto,sSubject,sBodyText)
End Sub[/code]


Ein älterer Versuch steht noch in auskommentierter Form drin.
Es ist vermutlich nur eine Kleinigkeit was hier noch fehlt, aber als blutiger Anfänger komme ich einfach nicht drauf.

Content-Key: 238732

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

Printed on: April 16, 2024 at 08:04 o'clock

Member: colinardo
Solution colinardo May 21, 2014 updated at 10:09:50 (UTC)
Goto Top
Hallo fred,
Beispiel:
strEmpfaenger = "nobody@home.net"  
strSubject = "Das ist ein Subject"  
strBody = "Das ist ein Body" & vbNewLine & "und ich eine zweite Zeile"  

' ### Mit Attachment versenden ...####  
' myAttachments = Array("D:\File1.docx","D:\File2.xlsx")  
' email strEmpfaenger,strSubject,strBody,myAttachments  

' ### Versende eine Mail ohne Attachment ###  
email strEmpfaenger,strSubject,strBody,Array()

Function email(sMailto,sSubject,sBodyText,arrAttachments())
	On Error Resume Next
	Set objOutlook = GetObject("","Outlook.Application")  
	If objOutlook Is Nothing Then
		Set objOutlook = CreateObject("Outlook.Application")  
	End If
	Set objMail = objOutlook.CreateItem(0)
	If Not objMail Is Nothing Then
		With objMail
			.To = sMailto
			.Subject = sSubject
			.Body = sBodyText
			If UBound(arrAttachments) <> -1 Then
				For i = 0 To UBound(arrAttachments)
					.Attachments.Add arrAttachments(i)
				Next
			End If
			.Display
			'.Send  
		End With
	End If
	Set objOutlook = Nothing
End Function

Zum Lernen, anstatt nur Trial&Error zu betreiben, empfehle ich dir folgende Lektüren:
back-to-topVBA/VBS/WSH/Office Developer Referenzen

Grüße Uwe

p.s. bitte schieben den Beitrag in Entwicklung/VB for Applications
Member: fred08155
fred08155 May 21, 2014 at 09:09:52 (UTC)
Goto Top
Äh, kannst du mir mal erklären, wo hier der grosse Unterschied zu dem ist, was ich gepostet habe?
Ich hab es auf die Art doch schon probiert und hatte nur den blanken Text in den Feldern drin stehen statt den definierten Variablen.
Werds später mal 1:1 rauskopieren und testen (gehört das alles wirklich so oder muss ich da noch ein paar Namen anpassen?).

Deine Links schau ich mir gerne noch zusätzlich zu dem an, was ich bisher da habe (Devguru Quick reference und ne CHM Datei von MS).
Member: colinardo
Solution colinardo May 21, 2014 updated at 10:09:37 (UTC)
Goto Top
Äh, kannst du mir mal erklären, wo hier der grosse Unterschied zu dem ist, was ich gepostet habe?
sicher dat ...
oMail.To = "sMailto"
oMail.Subject = "sSubject"
oMail.Body = "sBodyText"
du machst hier aus den eigentlichen Variablen wieder Strings ... wegen den Anführungszeichen, wenn du diese weglässt sind es Variablen dessen Inhalt der Eigenschaft zugewiesen werden, ansonsten nur reine Strings die der Eigenschaft zugewiesen werden.
http://www.html-world.de/program/vbs_2.php
Member: fred08155
fred08155 May 21, 2014 at 09:47:52 (UTC)
Goto Top
Aua. Den Fehler hatte ich doch schonmal in nem anderen Teil des Scripts gemacht. Da gab es aber keine solchen Fehlermeldungen, es hat sich einfach nur nicht das getan was ich wollte.

Kannst du mir vielleicht noch schnell verraten wie ich mit deiner Variante wieder den Focus auf das Outlook Fenster bekomme?

Hab jetzt das Ding komplett auf deinen Code umgestellt und krieg jetzt das "vbNormalFocus" nicht mehr rein. Wenn ich das so drinstehen habe wie es vorher war (bei CreateObject("Outlook.Application")) geht Outlook gleich gar nicht mehr auf.
Und wenn ich jetzt das Dingen von meiner Subroutine her aufrufe geht mir das Outlook Fenster immer im Hintergrund auf.
Member: colinardo
colinardo May 21, 2014 updated at 10:01:11 (UTC)
Goto Top
das war nur ein Beispiel ohne Anspruch auf Vollständigkeit, aber das vbNormalFocus hat normalerweise bei CreateObject keine Wirkung sondern nur wenn Outlook über ein shell-Objekt aufgerufen wird.
Habe es oben noch abgeändert.
Member: fred08155
fred08155 May 21, 2014 at 10:01:40 (UTC)
Goto Top
Super. Wird gleich ausprobiert.
Dann noch als abschliessende Frage: ist es machbar (Beispielcode), dass der Cursor am Ende in einer Leerzeile unter dem Body Text rumblinkt?
Member: colinardo
colinardo May 21, 2014 updated at 10:14:23 (UTC)
Goto Top
Zitat von @fred08155:
Super. Wird gleich ausprobiert.
Dann noch als abschliessende Frage: ist es machbar (Beispielcode), dass der Cursor am Ende in einer Leerzeile unter dem Body Text
rumblinkt?
Mit Bordmitteln von Outlook selber, nicht.
Member: fred08155
fred08155 May 21, 2014 at 10:18:59 (UTC)
Goto Top
Dann liegt das also an der GetObject Zeile, dass Outlook den Focus kriegt?

An der Stelle hat vbNormalFocus wohl nix bewirkt (in der alten Variante aber auch keinen Fehler bewirkt), wobei ursprünglich die Subroutine ein weiteres Script aufgerufen hat (WSHShell.Run "wscript weiteres-script.vbs", vbNormalFocus) und hier hat vbNormalFocus definitiv was gebracht.

Damit es aber nicht nachher tausend Scripte sind wollte ich eben hiermit die Funktion in das Hauptscript integrieren.
Und zum anderen hatte ich es nicht geschafft die Wscript.Arguments von einem Script an das nächste zu vererben. Vielleicht warn auch nur mal wieder ein paar Anführungszeichen zu viel drin. ^^
Aber das hat sich hiermit ja erstmal alles erledigt.
Member: colinardo
colinardo May 21, 2014 updated at 10:33:01 (UTC)
Goto Top
Zitat von @fred08155:

Dann liegt das also an der GetObject Zeile, dass Outlook den Focus kriegt?
Wenn Outlook bereits offen ist wird dies referenziert und bekommt bei der Display-Methode des Mailitems den Focus
Wenn man bei bereits geöffnetem Outlook ein neues Outlook Objekt erzeugt kann es sein das es nicht immer gleich den Fokus bekommt, das ist dann Zufall.
An der Stelle hat vbNormalFocus wohl nix bewirkt (in der alten Variante aber auch keinen Fehler bewirkt)
So ein Parameter Ist auch für die CreateObject() Methode nicht vorgesehen !
die Subroutine ein weiteres Script aufgerufen hat (WSHShell.Run "wscript weiteres-script.vbs", vbNormalFocus) und hier hat vbNormalFocus definitiv was gebracht.
Sicher, diese Funktion hat ja auch diesen Parameter !
Damit es aber nicht nachher tausend Scripte sind wollte ich eben hiermit die Funktion in das Hauptscript integrieren.
Und zum anderen hatte ich es nicht geschafft die Wscript.Arguments von einem Script an das nächste zu vererben. Vielleicht warn auch nur mal wieder ein paar Anführungszeichen zu viel drin. ^^
Set objShell = CreateObject("Wscript.Shell")  
varArgument1 = "test1"  
varArgument2 = "Parameter 2 mit Leerzeichen"  
objShell.Run "wscript ""C:\anderes_script.vbs"" """ &  varArgument1 & """ """ &  varArgument2 & """"  
Willst du Anführungszeichen in einer Befehlszeile verwenden musst du sie innerhalb eines Strings verdoppeln. Hiermit können dann die Parameter auch Leerzeichen enthalten.

Grüße Uwe
Member: fred08155
fred08155 May 21, 2014 at 10:43:52 (UTC)
Goto Top
Das mit dem zufälligen Focus ist etwas doof, aber ich glaub ich lass das Script erstmal so.
Hatte auch schonmal deswegen ein Wscript.Sleep + AppActivate eingefügt um den Focus gezielt auf das neue Outlook Fenster zu richten (weil gerade wenn Outlook noch nicht lief und das Script gestartet wurde das Fenster dann meist im Hintergrund aufging).
Hab ich aber erstmal wieder verworfen.
Gibt es eine sichere Methode das abzufragen und dann ggf den Focus auf das neue Mailfenster zu richten?
Geht sowas mit ner If Abfrage?
Will das Script aber auch nicht unnötig kompliziert machen.
Member: colinardo
colinardo May 21, 2014 updated at 12:00:29 (UTC)
Goto Top
Ich meinte das mit dem Zufall in der vorherigen Variante als es noch nicht angepasst war, im jetzigen Zustand sollte das Fenster zu 99% den Fokus bekommen.
Hiermit lässt sich die Zuverlässigkeit noch steigern, und der Focus auf den Outlook-Prozess legen. Das Script holt sich die PID des Outlook-Prozesses und übergibt diese an die Funktion AppActivate des Shell-Objekts.
Set objShell = CreateObject("Wscript.Shell")  
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'outlook.exe'")  
For Each objProcess in colProcessList
	objShell.AppActivate  objProcess.Handle
Next
AppActivate kann zwar auch nach Fenster-Titeln aktivieren, aber die PID ist da doch zuverlässiger.

In Kombination mit obigem Script sieht das dann so aus:
Set objShell = CreateObject("Wscript.Shell")  

strEmpfaenger = "nobody@home.net"  
strSubject = "Das ist ein Subject"  
strBody = "Das ist ein Body" & vbNewLine & "und ich eine zweite Zeile"  

email strEmpfaenger,strSubject,strBody,Array()

Function email(sMailto,sSubject,sBodyText,arrAttachments())
	On Error Resume Next
	Set objOutlook = GetObject("","Outlook.Application")  
	If objOutlook Is Nothing Then
		Set objOutlook = CreateObject("Outlook.Application")  
	End If
	Set objMail = objOutlook.CreateItem(0)
	If Not objMail Is Nothing Then
		With objMail
			.To = sMailto
			.Subject = sSubject
			.Body = sBodyText
			If UBound(arrAttachments) <> -1 Then
				For i = 0 To UBound(arrAttachments)
					.Attachments.Add arrAttachments(i)
				Next
			End If
			.Display
			'set focus to Outlook process  
			Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
			Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'outlook.exe'")  
			For Each objProcess in colProcessList
				objShell.AppActivate objProcess.Handle
			Next
		End With
	End If
	Set objOutlook = Nothing
End Function
Grüße Uwe
Member: fred08155
fred08155 May 21, 2014 at 12:33:25 (UTC)
Goto Top
Werd das morgen mal einbauen und gründlich testen. face-smile
Funktioniert das nur, wenn Outlook schon offen ist oder auch wenn Outlook erst vom Script gestartet wird (Programmstart dauert hier am Rechner mal mindestens gute 3 Sekunden)?
Member: colinardo
colinardo May 21, 2014 at 12:36:03 (UTC)
Goto Top
Die Prozedur wird ja erst aufgerufen wenn Outlook fertig gestartet ist, da es ja erst hinter der .Display-Methode aufgerufen wird ...
Mitglied: 115420
115420 May 21, 2014 at 12:48:43 (UTC)
Goto Top
Hallo zusammen!

Super. Wird gleich ausprobiert.
Dann noch als abschliessende Frage: ist es machbar (Beispielcode), dass der Cursor am Ende in einer Leerzeile unter dem Body Text blinkt?
Mit Bordmitteln von Outlook selber, nicht.

Um den Cursor im Word-Editor in eine neue Zeile zu setzen, geht in etwa so:
With objMail
   .To = sMailto
   .Subject = sSubject
   .Body = sBodyText
    
    With .GetInspector.WordEditor
        .Paragraphs.Add
        .Windows(1).Selection.EndKey 6  'wdStory  
    End With
    
    If UBound(arrAttachments) <> -1 Then
        For i = 0 To UBound(arrAttachments)
            .Attachments.Add arrAttachments(i)
        Next
    End If
   .Display
..........

Grüße spatzenhirn
Member: fred08155
fred08155 May 22, 2014 at 05:22:00 (UTC)
Goto Top
Vielen Dank euch beiden. Funktioniert soweit alles super.
Focus hat aber nicht auf Anhieb hingehauen, deshalb hab ich nochmal mit "Wscript.Sleep 2000" vor dem Aufruf der Routine zum Fokus holen nachgebessert.
Seitdem funktioniert alles.
Als allerletztes würde ich noch gerne die automatische Signatur unter dem Text im Mailbody haben. Dann wäre das Script perfekt.
Dazu hab ich zwar ein paar wenige Codeschipsel gefunden aber keiner davon hat bei mir funktioniert.
Dann müsste man vermutlich das Script zum Cursor setzen auch nochmal ändern und den Cursor in ne bestimmte Zeile schicken.

Das hat zum anhängen der Signatur schonmal nicht funktioniert oder ist die falsche VB Version (VB.NET?).
signature = Environ("appdata") & "\Microsoft\Signatures\"
If Dir(signature, vbDirectory) <> vbNullString Then signature = signature & Dir(signature & "*.htm") Else signature = ""
signature = CreateObject("Scripting.FileSystemObject").GetFile(signature).OpenAsTextStream(1, -2)

Zum einfügen dann im vorgegebenen Body Text "& signature" angehängt. Hat aber leider nicht funktioniert. Hab auch schon statt *.htm den Dateinamen der Signaturdatei eingegeben. Aber an der Wildcard wirds wohl nicht liegen.

Für Umgebungsvariablen hatte ich folgendes gefunden und bisher benutzt.
(CreateObject("WScript.Shell").ExpandEnvironmentStrings ("%userprofile%")

Wenn Environ("userprofile") die gleiche Funktion erfüllt wäre das ne schöne Ersparnis bei der Schreibarbeit. face-smile
Mitglied: 115420
115420 May 22, 2014 updated at 07:22:26 (UTC)
Goto Top
Hallo fred08155!

Mit automatischer Signatur In etwa so (ohne .Body = Text):
With objMail
   .To = sMailto
   .Subject = sSubject
    
    With .GetInspector.WordEditor
        .Paragraphs.Add
        .Paragraphs.First.Range.Text = sBodyText & vbNewLine & vbNewLine & vbNewLine
        .Windows(1).Selection.MoveDown 5, 3     'wdLine, Zeilenanzahl  
    End With
    
    If UBound(arrAttachments) <> -1 Then
        For i = 0 To UBound(arrAttachments)
            .Attachments.Add arrAttachments(i)
        Next
    End If
   .Display
..........

Grüße Spatzenhirn

[edit] sText in sBodyText geändert [/edit]
Member: colinardo
colinardo May 22, 2014 updated at 06:51:34 (UTC)
Goto Top
oder die Automatische Signatur in Outlook einschalten um dann deinen Text dem Body voranstellen:
.Body = sBodyText & vbNewline & .Body
Alternativ kannst du auch eine Mail anhand einer *.oft Vorlage erstellen, in der deine Signatur im Body schon eingefügt ist
Set objMail = objOutlook.CreateItemFromTemplate("c:\vorlage.oft")  
Die Möglichkeiten sind hier vielfältig.

Grüße Uwe
Member: fred08155
fred08155 May 22, 2014 at 07:04:55 (UTC)
Goto Top
Die automatische Signatur ist in Outlook schon eingeschaltet. Wenn man aber eine neue Email mit dem bisherigen Script erzeugt steht keine Signatur darunter.

Vorlage basteln ist schlecht, das Script soll unabhängig von einem Netzwerk-Pfad laufen und an jedem Rechner im Netzwerk funktionieren.

Ich probier mal noch die neue Variante mit & .Body und wenn das nicht funktioniert muss ich mal weiter versuchen das oben gepostete Script dazu zu bekommen, dass es richtig funktioniert.
Die If Zeile darin hatte ich schonmal auskommentiert und den Pfad direkt auf die Datei geschrieben, das scheint nicht der Fehler zu sein.
Environ wird auch beanstandet (Unverträglicher Typ oder so war die Fehlermeldung) und durch mein Expand-Ding ersetzt, wieder kein Erfolg.

Wenn ich dazu komme werd ich mal etwas Freizeit opfern und weiter Tutorials schmökern.
Mitglied: 115420
115420 May 22, 2014 at 07:25:41 (UTC)
Goto Top
Hallo Fred08155!

Hatte im letzten Code 'sText' anstatt sBodyText stehen (geändert)...

Grüße spatzenhirn
Member: colinardo
colinardo May 22, 2014 updated at 08:04:00 (UTC)
Goto Top
Vorlage basteln ist schlecht, das Script soll unabhängig von einem Netzwerk-Pfad laufen und an jedem Rechner im Netzwerk funktionieren.
Es reicht auch eine leere Vorlage, denn wenn man diese Variante benutzt wird die eingestellte Autosignatur automatisch mit eingefügt (dieses Verhalten dafür lässt sich auch in der Registry steuern).

Ansonsten wie gesagt gibt es dafür mehrere Ansätze einer wäre dieser um die Signatur über das Commandbars-Objekt einzufügen:
Den Namen den die Signatur hat musst du natürlich entsprechend anpassen.
..
...
....
.Display
With .GetInspector
	.WordEditor.Windows(1).Selection.Endkey 6
	strNameSignature = "NameDeinerSignatur"  
	.CommandBars.Item("Insert").Controls("Signatur").Controls(strNameSignature).Execute  
End With
...
..
.

Viel Erfolg
Grüße Uwe
Member: fred08155
fred08155 May 22, 2014 at 08:31:01 (UTC)
Goto Top
Probier ich später mal.
Was muss ich dabei alles anpassen?
Muss ich eine Variable definieren? Bzw wie oder was mach ich bei "NameDeinerSignatur" rein?
Muss ich wo einen Pfad einfügen?


Inzwischen hat sich ein neues Problem mit einer Erweiterung des Scripts ergeben.
Ich möchte das Attachment optional zur Bearbeitung mit Paint.NET öffnen statt es per Mail zu schicken.
Wenn ich das Programm Paint.NET mit Run starten will findet das Script aber das Programm nicht, obwohl der Pfad stimmt.
Kann es sein, dass der Pfad als URL oder sonstwas interpretiert wird?

Shell.Run "%programfiles%\Paint.NET\PaintDotNet.exe" & Wscript.Arguments(0)
Ergibt Scripfehler "Datei kann nicht gefunden werden". Mit komplett ausformuliertem Pfad dasselbe. Das Attachment spielt hierbei auch keine Rolle.
Wenn ich mit Shell.exec starte kann ich zwar das Programm öffnen aber offensichtlich keine Parameter mehr mit übergeben. Wenn ich es versuche kommt zumindest ein Fehler "Anweisungsende erwartet".
Member: colinardo
colinardo May 22, 2014 updated at 08:48:01 (UTC)
Goto Top
Zitat von @fred08155:

Probier ich später mal.
Was muss ich dabei alles anpassen?
Muss ich eine Variable definieren? Bzw wie oder was mach ich bei "NameDeinerSignatur" rein?
Der Name mit dem die Signatur in Outook benannt ist.
Muss ich wo einen Pfad einfügen?
Für diese Variante ist kein Pfad nötig, das dies Quasi den Befehl der Symbolleiste für das Einfügen der Signatur ausführt.
Wenn ich das Programm Paint.NET mit Run starten will findet das Script aber das Programm nicht, obwohl der Pfad stimmt.
Kann es sein, dass der Pfad als URL oder sonstwas interpretiert wird?
Shell.Run "%programfiles%\Paint.NET\PaintDotNet.exe" & Wscript.Arguments(0)
Du hast in dem Pfad Leerzeichen in der Umgebungsvariablen, deshalb musst du den Pfad in Anführungszeichen setzen wenn du Parameter mitgeben willst (die verdoppelt werden müssen), hatte ich aber oben bereits erwähnt..
Shell.Run """%programfiles%\Paint.NET\PaintDotNet.exe"" " & """" & Wscript.Arguments(0) & """"
Und nicht das Leerzeichen zwischen Programmpfad und Parametern vergessen !

Für alles andere was VBS angeht bitte einen neuen Thread aufmachen. Merci.

Grüße Uwe
Member: fred08155
fred08155 May 22, 2014 at 09:22:50 (UTC)
Goto Top
Super. Danke nochmal. Das mit dem verdoppeln der Anführungszeichen hab ich wohl auch noch nicht ganz kapiert. Vor allem wann wieviele dran müssen.
Mit Anführungszeichen hatte ich da nämlich auch schon jongliert aber wohl nie die richtige Menge erwischt. ^^
Member: colinardo
colinardo May 22, 2014 updated at 10:17:01 (UTC)
Goto Top
Das mit dem verdoppeln der Anführungszeichen hab ich wohl auch noch nicht ganz kapiert.
Im Grunde ist das ganz einfach. Wenn du ein einzelnes Anführungszeichen in einem String mit ausgeben willst musst du dies verdoppeln da es ansonsten in VBS als das Ende der Zeichenfolge interpretiert wird, da das " ja der Begrenzer für den String ist.
Also ein
var = """"
ergibt ein einzelnes Anführungszeichen das in der Variablen steht. Du kannst das alternativ aber auch so schreiben:
var = chr(34)
Die 34 ist der dezimale ASCII-Code für das ". Du könntest also obige Zeile umständlicher auch so schreiben (aber wir Programmier sind ja meistens faul face-wink deshalb bevorzuge ich meistens die Verdopplung der "):
Shell.Run chr(34) & "%programfiles%\Paint.NET\PaintDotNet.exe" & chr(34) & " " & chr(34) &  Wscript.Arguments(0) & chr(34)
Der Parameter wurde auch mit Anführungszeichen umschlossen damit in der Variablen auch Zeichenfolgen mit Leerzeichen vorkommen können.

Aber an dieser Sache hängt meist jeder VBS-Anfänger wenn er das erste mal damit in Kontakt kommt, ich war da damals keine Ausnahme.
Bei der Ausführung eines Programmes, musst dir immer vorstellen als wärst du in einem CMD-Fenster. Dort würde dir der Interpreter auch eine Fehlermeldung auswerfen wenn du ein Programm mit Leerzeichen im Pfad ohne Anführungszeichen starten wolltest.
Denke jetzt sollte es klick machen face-smile

Grüße Uwe
Member: fred08155
fred08155 May 22, 2014 at 10:23:35 (UTC)
Goto Top
Mit diesem neuen Script hab ich noch einige Probleme. Wenn Outlook noch nicht läuft und ich das Script starte erscheint oben die Signatur und darunter dann der Text.
Ausserdem funktioniert das holen vom Fokus auf das Outlook Fenster überhaupt nicht mehr. Selbst wenn ich ne lange Pause mit Wscript.Sleep vor dem Fokus Script einfüge.

.Display
With .GetInspector

.WordEditor.Windows(1).Selection.Endkey 6

strNameSignature = "SIG"

.CommandBars.Item("Insert").Controls("Signatur").Controls(strNameSignature).Execute

End With
'Set WshShell = WScript.CreateObject("WScript.Shell")
'WshShell.SendKeys "{PGUP}"
'WshShell.SendKeys "{DOWN}"
'WshShell.SendKeys "{DOWN}"

'set focus to Outlook process
WScript.Sleep 2000
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'outlook.exe'")
For Each objProcess in colProcessList
objShell.AppActivate objProcess.Handle

Next

Hab auch nochmal versucht den Cursor anders zu steuern aber der Teil ist ja aktuell auskommentiert.
Der Cursor soll nachher in der dritten Zeile direkt unter dem Text stehen und nicht in der Zeile über der Signatur. face-wink
Member: fred08155
fred08155 May 23, 2014 updated at 04:23:14 (UTC)
Goto Top
Fokus ist wieder in Ordnung, hab den Fehler selbst gefunden.
Beim Copy & Paste ist irgendwie ne Zeile verloren gegangen. Wobei ich bei Microsoft nachgelesen habe, wie man diesen winmgmts Prozess aufruft und dadurch erkannt habe was fehlt. face-smile
Die fehlerhafte Anordnung von Signatur und Body sind aber weiterhin ein Problem.

[EDIT]
Okelidokeli. Problem behoben. Einfach nochmal PageDown vor SelectionEndkey und fertig ist die Laube. Text-Anordnung so wie ich sie haben will, auch wenn Outlook erst durch das Script gestartet wird.
Mein Cursor-Positionier-Script hab ich auch reaktiviert.
Geht jetzt alles tadellos. Jetzt kann der Betatest losgehen. face-smile

.Display

				set WScriptShell = CreateObject("WScript.Shell")  
				'set focus to Outlook process  
				WScriptShell.Sleep 3000
				Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")  
				Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'outlook.exe'")  
				For Each objProcess in colProcessList
				WscriptShell.AppActivate objProcess.Handle 
					Next

					With .GetInspector 
					Set WshShell = WScript.CreateObject("WScript.Shell")  
						WshShell.SendKeys "{PGDN}"  

					.WordEditor.Windows(1).Selection.Endkey 6
				
					strNameSignature = "SIGI"  
					WscriptShell.Sleep 1000 

					.CommandBars.Item("Insert").Controls("Signatur").Controls(strNameSignature).Execute   

					End With
						Set WshShell = WScript.CreateObject("WScript.Shell")  
						WshShell.SendKeys "{PGUP}"  
						WshShell.SendKeys "{DOWN}"  
						WshShell.SendKeys "{DOWN}"