Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung VB for Applications

Mitglied: fred08155

fred08155 (Level 1) - Jetzt verbinden

21.05.2014, aktualisiert 11:10 Uhr, 4329 Aufrufe, 26 Kommentare, 1 Danke

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.
Mitglied: colinardo
LÖSUNG 21.05.2014, aktualisiert um 12:09 Uhr
Hallo fred,
Beispiel:
01.
strEmpfaenger = "nobody@home.net" 
02.
strSubject = "Das ist ein Subject" 
03.
strBody = "Das ist ein Body" & vbNewLine & "und ich eine zweite Zeile" 
04.
 
05.
' ### Mit Attachment versenden ...#### 
06.
' myAttachments = Array("D:\File1.docx","D:\File2.xlsx") 
07.
' email strEmpfaenger,strSubject,strBody,myAttachments 
08.
 
09.
' ### Versende eine Mail ohne Attachment ### 
10.
email strEmpfaenger,strSubject,strBody,Array() 
11.
 
12.
Function email(sMailto,sSubject,sBodyText,arrAttachments()) 
13.
	On Error Resume Next 
14.
	Set objOutlook = GetObject("","Outlook.Application") 
15.
	If objOutlook Is Nothing Then 
16.
		Set objOutlook = CreateObject("Outlook.Application") 
17.
	End If 
18.
	Set objMail = objOutlook.CreateItem(0) 
19.
	If Not objMail Is Nothing Then 
20.
		With objMail 
21.
			.To = sMailto 
22.
			.Subject = sSubject 
23.
			.Body = sBodyText 
24.
			If UBound(arrAttachments) <> -1 Then 
25.
				For i = 0 To UBound(arrAttachments) 
26.
					.Attachments.Add arrAttachments(i) 
27.
				Next 
28.
			End If 
29.
			.Display 
30.
			'.Send 
31.
		End With 
32.
	End If 
33.
	Set objOutlook = Nothing 
34.
End Function
Zum Lernen, anstatt nur Trial&Error zu betreiben, empfehle ich dir folgende Lektüren:
VBA/VBS/WSH/Office Developer Referenzen

Grüße Uwe

p.s. bitte schieben den Beitrag in Entwicklung/VB for Applications
Bitte warten ..
Mitglied: fred08155
21.05.2014 um 11:09 Uhr
Ä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).
Bitte warten ..
Mitglied: colinardo
LÖSUNG 21.05.2014, aktualisiert um 12:09 Uhr
Ä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
Bitte warten ..
Mitglied: fred08155
21.05.2014 um 11:47 Uhr
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.
Bitte warten ..
Mitglied: colinardo
21.05.2014, aktualisiert um 12:01 Uhr
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.
Bitte warten ..
Mitglied: fred08155
21.05.2014 um 12:01 Uhr
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?
Bitte warten ..
Mitglied: colinardo
21.05.2014, aktualisiert um 12:14 Uhr
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.
Bitte warten ..
Mitglied: fred08155
21.05.2014 um 12:18 Uhr
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.
Bitte warten ..
Mitglied: colinardo
21.05.2014, aktualisiert um 12:33 Uhr
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. ^^
01.
Set objShell = CreateObject("Wscript.Shell") 
02.
varArgument1 = "test1" 
03.
varArgument2 = "Parameter 2 mit Leerzeichen" 
04.
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
Bitte warten ..
Mitglied: fred08155
21.05.2014 um 12:43 Uhr
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.
Bitte warten ..
Mitglied: colinardo
21.05.2014, aktualisiert um 14:00 Uhr
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.
01.
Set objShell = CreateObject("Wscript.Shell") 
02.
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
03.
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'outlook.exe'") 
04.
For Each objProcess in colProcessList 
05.
	objShell.AppActivate  objProcess.Handle 
06.
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:
01.
Set objShell = CreateObject("Wscript.Shell") 
02.
 
03.
strEmpfaenger = "nobody@home.net" 
04.
strSubject = "Das ist ein Subject" 
05.
strBody = "Das ist ein Body" & vbNewLine & "und ich eine zweite Zeile" 
06.
 
07.
email strEmpfaenger,strSubject,strBody,Array() 
08.
 
09.
Function email(sMailto,sSubject,sBodyText,arrAttachments()) 
10.
	On Error Resume Next 
11.
	Set objOutlook = GetObject("","Outlook.Application") 
12.
	If objOutlook Is Nothing Then 
13.
		Set objOutlook = CreateObject("Outlook.Application") 
14.
	End If 
15.
	Set objMail = objOutlook.CreateItem(0) 
16.
	If Not objMail Is Nothing Then 
17.
		With objMail 
18.
			.To = sMailto 
19.
			.Subject = sSubject 
20.
			.Body = sBodyText 
21.
			If UBound(arrAttachments) <> -1 Then 
22.
				For i = 0 To UBound(arrAttachments) 
23.
					.Attachments.Add arrAttachments(i) 
24.
				Next 
25.
			End If 
26.
			.Display 
27.
			'set focus to Outlook process 
28.
			Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
29.
			Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'outlook.exe'") 
30.
			For Each objProcess in colProcessList 
31.
				objShell.AppActivate objProcess.Handle 
32.
			Next 
33.
		End With 
34.
	End If 
35.
	Set objOutlook = Nothing 
36.
End Function
Grüße Uwe
Bitte warten ..
Mitglied: fred08155
21.05.2014 um 14:33 Uhr
Werd das morgen mal einbauen und gründlich testen.
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)?
Bitte warten ..
Mitglied: colinardo
21.05.2014 um 14:36 Uhr
Die Prozedur wird ja erst aufgerufen wenn Outlook fertig gestartet ist, da es ja erst hinter der .Display-Methode aufgerufen wird ...
Bitte warten ..
Mitglied: 115420
21.05.2014 um 14:48 Uhr
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:
01.
With objMail 
02.
   .To = sMailto 
03.
   .Subject = sSubject 
04.
   .Body = sBodyText 
05.
     
06.
    With .GetInspector.WordEditor 
07.
        .Paragraphs.Add 
08.
        .Windows(1).Selection.EndKey 6  'wdStory 
09.
    End With 
10.
     
11.
    If UBound(arrAttachments) <> -1 Then 
12.
        For i = 0 To UBound(arrAttachments) 
13.
            .Attachments.Add arrAttachments(i) 
14.
        Next 
15.
    End If 
16.
   .Display 
17.
..........
Grüße spatzenhirn
Bitte warten ..
Mitglied: fred08155
22.05.2014 um 07:22 Uhr
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.
Bitte warten ..
Mitglied: 115420
22.05.2014, aktualisiert um 09:22 Uhr
Hallo fred08155!

Mit automatischer Signatur In etwa so (ohne .Body = Text):
01.
With objMail 
02.
   .To = sMailto 
03.
   .Subject = sSubject 
04.
     
05.
    With .GetInspector.WordEditor 
06.
        .Paragraphs.Add 
07.
        .Paragraphs.First.Range.Text = sBodyText & vbNewLine & vbNewLine & vbNewLine 
08.
        .Windows(1).Selection.MoveDown 5, 3     'wdLine, Zeilenanzahl 
09.
    End With 
10.
     
11.
    If UBound(arrAttachments) <> -1 Then 
12.
        For i = 0 To UBound(arrAttachments) 
13.
            .Attachments.Add arrAttachments(i) 
14.
        Next 
15.
    End If 
16.
   .Display 
17.
..........
Grüße Spatzenhirn

[edit] sText in sBodyText geändert [/edit]
Bitte warten ..
Mitglied: colinardo
22.05.2014, aktualisiert um 08:51 Uhr
oder die Automatische Signatur in Outlook einschalten um dann deinen Text dem Body voranstellen:
01.
.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
01.
Set objMail = objOutlook.CreateItemFromTemplate("c:\vorlage.oft")
Die Möglichkeiten sind hier vielfältig.

Grüße Uwe
Bitte warten ..
Mitglied: fred08155
22.05.2014 um 09:04 Uhr
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.
Bitte warten ..
Mitglied: 115420
22.05.2014 um 09:25 Uhr
Hallo Fred08155!

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

Grüße spatzenhirn
Bitte warten ..
Mitglied: colinardo
22.05.2014, aktualisiert um 10:04 Uhr
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.
01.
.. 
02.
... 
03.
.... 
04.
.Display 
05.
With .GetInspector 
06.
	.WordEditor.Windows(1).Selection.Endkey 6 
07.
	strNameSignature = "NameDeinerSignatur" 
08.
	.CommandBars.Item("Insert").Controls("Signatur").Controls(strNameSignature).Execute 
09.
End With 
10.
... 
11.
.. 
12.
.
Viel Erfolg
Grüße Uwe
Bitte warten ..
Mitglied: fred08155
22.05.2014 um 10:31 Uhr
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".
Bitte warten ..
Mitglied: colinardo
22.05.2014, aktualisiert um 10:48 Uhr
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
Bitte warten ..
Mitglied: fred08155
22.05.2014 um 11:22 Uhr
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. ^^
Bitte warten ..
Mitglied: colinardo
22.05.2014, aktualisiert um 12:17 Uhr
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 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

Grüße Uwe
Bitte warten ..
Mitglied: fred08155
22.05.2014 um 12:23 Uhr
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.
Bitte warten ..
Mitglied: fred08155
23.05.2014, aktualisiert um 06:23 Uhr
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.
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.

01.
.Display 
02.
 
03.
				set WScriptShell = CreateObject("WScript.Shell") 
04.
				'set focus to Outlook process 
05.
				WScriptShell.Sleep 3000 
06.
				Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
07.
				Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'outlook.exe'") 
08.
				For Each objProcess in colProcessList 
09.
				WscriptShell.AppActivate objProcess.Handle  
10.
					Next 
11.
 
12.
					With .GetInspector  
13.
					Set WshShell = WScript.CreateObject("WScript.Shell") 
14.
						WshShell.SendKeys "{PGDN}" 
15.
 
16.
					.WordEditor.Windows(1).Selection.Endkey 6 
17.
				 
18.
					strNameSignature = "SIGI" 
19.
					WscriptShell.Sleep 1000  
20.
 
21.
					.CommandBars.Item("Insert").Controls("Signatur").Controls(strNameSignature).Execute  
22.
 
23.
					End With 
24.
						Set WshShell = WScript.CreateObject("WScript.Shell") 
25.
						WshShell.SendKeys "{PGUP}" 
26.
						WshShell.SendKeys "{DOWN}" 
27.
						WshShell.SendKeys "{DOWN}"
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows Server
gelöst Wie füge ich diesem Script die Email Adresse hinzu (16)

Frage von rainergugus zum Thema Windows Server ...

Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

Batch & Shell
gelöst Variablen in bash-script ändern (3)

Frage von cptkrabbe zum Thema Batch & Shell ...

VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...