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

Druckername per VBA-Script über externe Textdatei auswählen

Frage Entwicklung Basic

Mitglied: imebro

imebro (Level 2) - Jetzt verbinden

28.01.2015, aktualisiert 29.01.2015, 1672 Aufrufe, 31 Kommentare

Hallo,

vor ein paar Tagen hatte ich mit Eurer Hilfe den unten eingesetzten Code genutzt, um automatisch 2 Textzeilen aus einer extern auf dem Server abgelegten Textdatei (daten.txt) auszulesen und diesen in ein Dokument einzusetzen. Hierbei sucht der Code nach den Namen der jeweiligen User und setzt den passenden Text ein.

Nun würde ich dieses Script gerne so erweitern, dass in dieser Textdatei "daten.txt" auch die zu den Mitarbeitern passenden Druckernamen mit ausgelesen werden können. Es müßten also 2 weitere Strings dort eingesetzt werden können (a: Drucker zum drucken des aktuellen Dokumentes // b: Standarddrucker wieder aktivieren).

Das neue Script soll dann im Einzelnen folgendes machen:

1) In der Datei "daten.txt" nach dem angemeldeten User suchen (wie es ja auch bereits unten in dem Code für die Text-Einsätze gemacht wird)

2) Dann soll der dritte String (also der jew. Druckername) gewählt werden und das Dokument dann darauf ausgedruckt werden

3) Am Ende soll wieder der Standarddrucker gewählt werden. Am besten (sichersten) wäre es, wenn dieser vielleicht in der Textdatei "daten.txt" als vierter String eingesetzt werden könnte.

Zur Info:
Mit dem bisher im unten eingesetzten Code verwendeten "strPrintername = "MV_" & strUsername & "_Blanko"" funktioniert es nicht, da die jeweiligen Drucker der Mitarbeiter unterschiedliche Namen haben.

Ich wollte dazu den hier eingesetzten Code verwenden... habe das aber nicht hinbekommen, da ich u.a. nicht sicher war, wo ich was einsetzen muss.
Wahrscheinlich muss in Zeile 4 des Codes der Zusatz "strText3 As String" und "strText4 As String" zusätzlich eingetragen werden.
Weiterhin in der Textdatei "daten.txt" die Angaben der beiden Drucker in dieser Art: --> User-Name;i. A.;Dienstbezeichnung;Druckername1;Standarddrucker
Am Ende vermute ich mal, dass für die Drucker eine Variable eingesetzt werden muss...

Wäre schön, wenn Ihr mir hierbei helfen könntet.

Danke und Gruss,
imebro

Hier der Code aus dem vorherigen Thread:

01.
Sub Druck() 
02.
03.
    Dim img As InlineShape, posImage As Range, posAbteilung As Range, posImAuftrag As Range 
04.
    Dim objShell As Object, fso As Object, regex As Object, matches, strText1 As String, strText2 As String 
05.
     
06.
    'Pfad zur Textdatei mit den Namen und Dienstbezeichnungen der Mitarbeiter der MV: 
07.
    Const FILEPATH = "S:\ARCHIV\Mittelvergabe\Daten_MV\daten.txt" 
08.
     
09.
    'Objekte: 
10.
    Set objShell = CreateObject("Wscript.Shell") 
11.
    Set fso = CreateObject("Scripting.FileSystemObject") 
12.
    Set regex = CreateObject("vbscript.regexp") 
13.
     
14.
    ' Zuweisung der einzelnen Pfade: 
15.
    strUsername = objShell.ExpandEnvironmentStrings("%username%") 
16.
    strUserprofile = objShell.ExpandEnvironmentStrings("%userprofile%") 
17.
     
18.
    'Druckernamen 
19.
    strPrintername = "MV_" & strUsername & "_Blanko" 
20.
     
21.
    'Regex Settings: 
22.
    regex.Global = False: regex.IgnoreCase = True: regex.MultiLine = True 
23.
     
24.
    'Regex Pattern für Zeilen - Hier wird der Inhalt der Textdatei "daten.txt" ausgelesen: 
25.
    regex.Pattern = "^" & strUsername & ";(.*);(.*)" 
26.
     
27.
    'Regex auf Inhalt der Textdatei anwenden (Usernamen suchen): 
28.
    Set matches = regex.Execute(fso.OpenTextFile(FILEPATH, 1).ReadAll()) 
29.
     
30.
    'Wurde ein Treffer gefunden setze die Variablen: 
31.
    If matches.Count > 0 Then 
32.
        strText1 = matches(0).Submatches(0) 
33.
        strText2 = matches(0).Submatches(1) 
34.
    Else    'es wurde kein passender User gefunden, (Werte der Variablen auf Defaultwerte setzen) 
35.
        strText1 = "" 
36.
        strText2 = "" 
37.
    End If 
38.
     
39.
     
40.
    'Beginn einsetzen von "i. A." und der passenden Dienstbezeichnung des Mitarbeiters: 
41.
    Selection.GoTo wdGoToPage, wdGoToFirst 
42.
    With ActiveDocument.Content.Find 
43.
        .Text = "Mit freundlichen Grüßen" 
44.
        .Forward = True 
45.
        .Wrap = wdFindContinue 
46.
        .MatchWildcards = True 
47.
        .Execute 
48.
        If .Found Then 
49.
            'Erstellen der benötigten Anzahl Absätze 
50.
            For i = 1 To 7 
51.
                .Parent.InsertParagraphAfter 
52.
            Next 
53.
            ' setze die Position 5 Absätze hinter das "Mit freundlichen Grüßen" 
54.
            Set posImAuftrag = .Parent.GoTo(wdGoToLine, wdGoToNext, 5) 
55.
            With posImAuftrag 
56.
                .End = .Paragraphs(1).Range.End 
57.
                .Font.Name = Arial 
58.
                .Font.Size = 11 
59.
                .Text = strText1   'einsetzen des 2. Textteils aus der Datei "daten.txt" 
60.
            End With 
61.
            ' Setze die Position einen Absatz weiter als die "posImAuftrag" Zeile 
62.
            Set posAbteilung = posImAuftrag.GoTo(wdGoToLine, wdGoToNext, 1) 
63.
            With posAbteilung 
64.
                .End = .Paragraphs(1).Range.End 
65.
                .Font.Name = Arial 
66.
                .Font.Size = 9 
67.
                .Text = strText2   'einsetzen des 3. Textteils aus der Datei "daten.txt" 
68.
            End With 
69.
        End If 
70.
    End With 
71.
     
72.
    Set objShell = Nothing 
73.
    Set fso = Nothing 
74.
    Set regex = Nothing 
75.
  
76.
End Sub
31 Antworten
Mitglied: colinardo
28.01.2015, aktualisiert um 12:02 Uhr
Hello again imebro,
ich würde den Standarddrucker nicht in der Textdatei hinterlegen (falls du das wider erwarten doch willst kannst du dir jetzt abschauen wie der Regex-Pattern dazu angepasst werden muss), sondern direkt aus Word ermitteln. Die zusätzliche Spalte für den persönlichen Drucker für das Dokument habe ich dir hier ergänzt.
Kommentare findest du im Code.
Deine Druckroutine musst du noch ergänzen (s.Kommentare im Code)
01.
Sub Druck() 
02.
    Dim img As InlineShape, posImage As Range, posAbteilung As Range, posImAuftrag As Range 
03.
    Dim objShell As Object, fso As Object, regex As Object, matches, strText1 As String, strText2 As String, strPrinter As String, strPrinterDefault As String 
04.
     
05.
    'Pfad zur Textdatei mit den Namen und Dienstbezeichnungen der Mitarbeiter der MV: 
06.
    Const FILEPATH = "S:\ARCHIV\Mittelvergabe\Daten_MV\daten.txt" 
07.
     
08.
    'Objekte: 
09.
    Set objShell = CreateObject("Wscript.Shell") 
10.
    Set fso = CreateObject("Scripting.FileSystemObject") 
11.
    Set regex = CreateObject("vbscript.regexp") 
12.
     
13.
    ' Zuweisung der einzelnen Pfade: 
14.
    strUsername = objShell.ExpandEnvironmentStrings("%username%") 
15.
    strUserprofile = objShell.ExpandEnvironmentStrings("%userprofile%") 
16.
     
17.
    'aktuellen Drucker ermitteln 
18.
    strPrinterDefault = ActivePrinter 
19.
     
20.
    'Regex Settings: 
21.
    regex.Global = False: regex.IgnoreCase = True: regex.MultiLine = True 
22.
     
23.
    'Regex Pattern für Zeilen - Hier wird der Inhalt der Textdatei "daten.txt" ausgelesen: 
24.
    regex.Pattern = "^" & strUsername & ";(.*);(.*);(.*)" 
25.
     
26.
    'Regex auf Inhalt der Textdatei anwenden (Usernamen suchen): 
27.
    Set matches = regex.Execute(fso.OpenTextFile(FILEPATH, 1).ReadAll()) 
28.
     
29.
    'Wurde ein Treffer gefunden setze die Variablen: 
30.
    If matches.Count > 0 Then 
31.
    	' i.A. 
32.
        strText1 = matches(0).Submatches(0) 
33.
        ' Dienstbezeichnung 
34.
        strText2 = matches(0).Submatches(1) 
35.
        ' Zieldrucker 
36.
        strPrinter = matches(0).Submatches(2) 
37.
    Else    'es wurde kein passender User gefunden, (Werte der Variablen auf Defaultwerte setzen) 
38.
        strText1 = "" 
39.
        strText2 = "" 
40.
        strPrinter = strPrinterDefault 
41.
    End If 
42.
     
43.
     
44.
    'Beginn einsetzen von "i. A." und der passenden Dienstbezeichnung des Mitarbeiters: 
45.
    Selection.GoTo wdGoToPage, wdGoToFirst 
46.
    With ActiveDocument.Content.Find 
47.
        .Text = "Mit freundlichen Grüßen" 
48.
        .Forward = True 
49.
        .Wrap = wdFindContinue 
50.
        .MatchWildcards = True 
51.
        .Execute 
52.
        If .Found Then 
53.
            'Erstellen der benötigten Anzahl Absätze 
54.
            For i = 1 To 7 
55.
                .Parent.InsertParagraphAfter 
56.
            Next 
57.
            ' setze die Position 5 Absätze hinter das "Mit freundlichen Grüßen" 
58.
            Set posImAuftrag = .Parent.GoTo(wdGoToLine, wdGoToNext, 5) 
59.
            With posImAuftrag 
60.
                .End = .Paragraphs(1).Range.End 
61.
                .Font.Name = Arial 
62.
                .Font.Size = 11 
63.
                .Text = strText1   'einsetzen des 2. Textteils aus der Datei "daten.txt" 
64.
            End With 
65.
            ' Setze die Position einen Absatz weiter als die "posImAuftrag" Zeile 
66.
            Set posAbteilung = posImAuftrag.GoTo(wdGoToLine, wdGoToNext, 1) 
67.
            With posAbteilung 
68.
                .End = .Paragraphs(1).Range.End 
69.
                .Font.Name = Arial 
70.
                .Font.Size = 9 
71.
                .Text = strText2   'einsetzen des 3. Textteils aus der Datei "daten.txt" 
72.
            End With 
73.
        End If 
74.
    End With 
75.
     
76.
    'Ziel-Drucker für das Dokument setzen 
77.
    ActivePrinter = strPrinter 
78.
     
79.
    ' =============================== 
80.
    ' Hier deine Druckroutine aufrufen 
81.
    ' ..... 
82.
    ' =============================== 
83.
     
84.
    'Alten Standarddrucker wieder setzen 
85.
    ActivePrinter = strPrinterDefault 
86.
     
87.
    Set objShell = Nothing 
88.
    Set fso = Nothing 
89.
    Set regex = Nothing 
90.
End Sub
Es sei dir nochmal das Regular Expressions Tutorial empfohlen damit du Regular Expression auch verstehst

Grüße Uwe

p.s. so langsam ist mal eine Spende für die Beteiligten angesagt !
Bitte warten ..
Mitglied: imebro
28.01.2015, aktualisiert um 13:32 Uhr
Danke Dir Uwe...

sicher hast Du Recht mit der Spende. Werde meinen AG mal darauf ansprechen... schließlich ist das ja für seine Mitarbeiter

Bezüglich des Codes:

Das Auswählen der Texte "i. A." und "Dienstbezeichnung" mache ich ja über den bereits vorhandenen Code.
Dieses Script hier soll quasi davon getrennt sein und NUR den Druckbefehl geben und dazu den jeweiligen User-Drucker aus der Textdatei "daten.txt" nehmen.

Ich nehme an, dass ich dazu lediglich die nicht benötigten Zeilen Deines heutigen Codes heraus löschen müßte.

Zur Druckroutine:

Diese sieht zur Zeit so aus:

01.
    ActivePrinter = "\\dasfile\Müller_Brief" 
02.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
03.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
04.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
05.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0 
06.
    ActivePrinter = "\\dasfile\Müller_Blanko" 
07.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
08.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
09.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
10.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Das Dokument wird zuerst auf Briefpapier und danach noch auf Blankopapier gedruckt... Der Blanko-Drucker soll dann wieder der Standarddrucker sein.
Soll ich also diesen Inhalt ab Zeile 81 aufnehmen - ohne die jeweiligen Angaben bei "ActivePrinter"?

Die Datei "Daten.txt" habe ich nun einfach ergänzt um ";Drucker_des_Users" direkt hinter der Dienstbezeichnung.

--> Beispiel: "Max Müller;i. A. Max Müller;Mittelvergabe;Müller_Brief"

Ich füge hier mal den Code so ein, wie ich es mir jetzt denke:

01.
Sub Druck() 
02.
    Dim img As InlineShape, posImage As Range, posAbteilung As Range, posImAuftrag As Range 
03.
    Dim objShell As Object, fso As Object, regex As Object, matches, strText1 As String, strText2 As String,  
04.
 
05.
strPrinter As String, strPrinterDefault As String 
06.
     
07.
    'Pfad zur Textdatei mit den Namen und Dienstbezeichnungen der Mitarbeiter der MV: 
08.
    Const FILEPATH = "S:\ARCHIV\Mittelvergabe\Daten_MV\daten.txt" 
09.
     
10.
    'Objekte: 
11.
    Set objShell = CreateObject("Wscript.Shell") 
12.
    Set fso = CreateObject("Scripting.FileSystemObject") 
13.
    Set regex = CreateObject("vbscript.regexp") 
14.
     
15.
    ' Zuweisung der einzelnen Pfade: 
16.
    strUsername = objShell.ExpandEnvironmentStrings("%username%") 
17.
    strUserprofile = objShell.ExpandEnvironmentStrings("%userprofile%") 
18.
     
19.
    'aktuellen Drucker ermitteln 
20.
    strPrinterDefault = ActivePrinter 
21.
     
22.
    'Regex Settings: 
23.
    regex.Global = False: regex.IgnoreCase = True: regex.MultiLine = True 
24.
     
25.
    'Regex Pattern für Zeilen - Hier wird der Inhalt der Textdatei "daten.txt" ausgelesen: 
26.
    regex.Pattern = "^" & strUsername & ";(.*);(.*);(.*)" 
27.
     
28.
    'Regex auf Inhalt der Textdatei anwenden (Usernamen suchen): 
29.
    Set matches = regex.Execute(fso.OpenTextFile(FILEPATH, 1).ReadAll()) 
30.
     
31.
    'Wurde ein Treffer gefunden setze die Variablen: 
32.
    If matches.Count > 0 Then 
33.
    	' i.A. 
34.
        strText1 = matches(0).Submatches(0) 
35.
        ' Dienstbezeichnung 
36.
        strText2 = matches(0).Submatches(1) 
37.
        ' Zieldrucker 
38.
        strPrinter = matches(0).Submatches(2) 
39.
    Else    'es wurde kein passender User gefunden, (Werte der Variablen auf Defaultwerte setzen) 
40.
        strText1 = "" 
41.
        strText2 = "" 
42.
        strPrinter = strPrinterDefault 
43.
    End If 
44.
     
45.
       
46.
    'Ziel-Drucker für das Dokument setzen 
47.
    ActivePrinter = strPrinter 
48.
     
49.
    ' ===================================================================== 
50.
    ' Druckroutine aufrufen: 
51.
    '    
52.
	Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
53.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
54.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
55.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0 
56.
    ' ===================================================================== 
57.
     
58.
    'Alten Standarddrucker wieder setzen 
59.
    ActivePrinter = strPrinterDefault 
60.
     
61.
    Set objShell = Nothing 
62.
    Set fso = Nothing 
63.
    Set regex = Nothing 
64.
End Sub
Danke und Gruss,
imebro
Bitte warten ..
Mitglied: colinardo
28.01.2015, aktualisiert um 13:31 Uhr
Soll ich also diesen Inhalt ab Zeile 81 aufnehmen?
jup, so war's gedacht ...
Bitte warten ..
Mitglied: imebro
28.01.2015, aktualisiert um 13:42 Uhr
Ok...

ich hatte diesen Bereich gerade noch abgeändert, da das Dokument zuerst auf Briefpapier (Drucker "Müller_Brief") und danach noch auf Blankopapier (Drucker "Müller_Blanko") gedruckt werden soll.

Muss ich dann nur die beiden Zeilen mit "ActivePrinter" löschen oder dort eingeben:

"ActivePrinter = strPrinter" für den ersten
und "ActivePrinter = strPrinterDefault" für den zweiten Druckvorgang

Also quasi so:

01.
    ActivePrinter = "strPrinter" 
02.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
03.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
04.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
05.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0 
06.
    ActivePrinter = "strPrinterDefault" 
07.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
08.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
09.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
10.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Dann die Zeilen 47 und 59 aus meinem weiter oben eingefügten Code löschen...

LG
imebro
Bitte warten ..
Mitglied: colinardo
LÖSUNG 28.01.2015, aktualisiert 29.01.2015
Warum schaust du nicht einfach mal nach was das ActivePrinter bedeutet, dann verstehst du es auch und musst nicht jede Kleinigkeit nachfragen.
ActivePrinter = "Druckername"
setzt den aktiven Drucker und
ActivePrinter = strPrinterDefault
setzt ihn auf den Wert zurück den er zu beginn hatte. Nicht schwer oder ?

wie man Variablen verwendet solltest du doch inzwischen wissen, denn dein Konstrukt
"strPrinter" ist so keine Variable sondern ein String...
wenn dann verwendet man die Variable natürlich so !!
ActivePrinter = strPrinter
Bitte warten ..
Mitglied: imebro
28.01.2015, aktualisiert um 15:34 Uhr
Ja, da hast Du natürlich Recht

Hatte auch nur vergessen, die "" zu entfernen.
In meinem Test-Script hatte ich die schon raus.

Habe es jetzt nochmal etwas anders gelöst, damit nicht noch die Teile aus dem vorherigen Script (also mit dem "i.A." und "Dienstbezeichnung") mit drin stehen.

Habe jetzt einfach eine neue Textdatei erstellt (druck.txt).
In der steht nur der Username und der dazu passende Drucker

--> Max-Müller;Max-Müller_Brief

Dann habe ich die Teile aus dem Script entfernt, die dort nicht mehr benötigt werden.
Dadurch wird auch der Code kürzer und übersichtlicher

Hier jetzt der Code dieses Scriptes:

01.
Sub Druck() 
02.
03.
    Dim img As InlineShape, posImage As Range, posAbteilung As Range, posImAuftrag As Range 
04.
    Dim objShell As Object, fso As Object, regex As Object, matches, strPrinter As String, strPrinterDefault As  
05.
 
06.
String 
07.
     
08.
    'Pfad zur Textdatei mit den Namen und Dienstbezeichnungen der Mitarbeiter der MV: 
09.
    Const FILEPATH = "S:\ARCHIV\Mittelvergabe\Daten_MV\druck.txt" 
10.
     
11.
    'Objekte: 
12.
    Set objShell = CreateObject("Wscript.Shell") 
13.
    Set fso = CreateObject("Scripting.FileSystemObject") 
14.
    Set regex = CreateObject("vbscript.regexp") 
15.
     
16.
    ' Zuweisung der einzelnen Pfade: 
17.
    strUsername = objShell.ExpandEnvironmentStrings("%username%") 
18.
    strUserprofile = objShell.ExpandEnvironmentStrings("%userprofile%") 
19.
     
20.
    'aktuellen Drucker ermitteln 
21.
    strPrinterDefault = ActivePrinter 
22.
     
23.
    'Regex Settings: 
24.
    regex.Global = False: regex.IgnoreCase = True: regex.MultiLine = True 
25.
     
26.
    'Regex Pattern für Zeilen - Hier wird der Inhalt der Textdatei "druck.txt" ausgelesen: 
27.
    regex.Pattern = "^" & strUsername & ";(.*)" 
28.
     
29.
    'Regex auf Inhalt der Textdatei anwenden (Usernamen suchen): 
30.
    Set matches = regex.Execute(fso.OpenTextFile(FILEPATH, 1).ReadAll()) 
31.
     
32.
    'Wurde ein Treffer gefunden setze die Variablen: 
33.
    If matches.Count > 0 Then 
34.
    	'Zieldrucker 
35.
        strPrinter = matches(0).Submatches(0) 
36.
    Else    'es wurde kein passender User gefunden, (Werte der Variablen auf Defaultwerte setzen) 
37.
        strPrinter = strPrinterDefault 
38.
    End If     
39.
 
40.
     
41.
    ' ===================================================================== 
42.
    ' Druckroutine aufrufen: 
43.
    '    
44.
    ActivePrinter = strPrinter 
45.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
46.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
47.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
48.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0 
49.
    ActivePrinter = strPrinterDefault 
50.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
51.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
52.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
53.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0 
54.
    ' ===================================================================== 
55.
     
56.
     
57.
    Set objShell = Nothing 
58.
    Set fso = Nothing 
59.
    Set regex = Nothing 
60.
End Sub
Wichtig sind die Einträge in Zeile 4 und 34-37.
Hoffe dass diese so richtig sind

LG
imebro

UPDATE:

Habe eben mal dieses Script getestet.
Es gab gleich einen Laufzeitfehler zurück und beim Debuggen wurde folgende Zeile markiert:

ActivePrinter = strPrinter

Also direkt die 1. Zeile in der Druckroutine.
Woran könnte das liegen?

LG
imebro

UPDATE 2:

Wäre es ggf. möglich, dass ich den Eintrag des Zieldruckers in der Textdatei "druck.txt" anders machen muss?

Dort steht er ja so:
Max-Müller;Max-Müller_Brief

Der Drucker befindet sich aber im Netzwerk.
Der korrekte Pfad ist: "\\DASFILE\Max-Müller_Brief"

Wenn ich ihn in der "druck.txt" genau so angebe, funktioniert es jedenfalls auch nicht...

LG
imebro
Bitte warten ..
Mitglied: 114757
28.01.2015, aktualisiert um 15:44 Uhr
Woran könnte das liegen?
Falscher Druckername wurde angegeben ...
http://support.microsoft.com/kb/209722
https://msdn.microsoft.com/de-de/library/office/ff821995%28v=office.15%2 ...

Bei Netzwerkdruckern muss das anders lauten
Application.ActivePrinter = "HP LaserJet IIISi on \\printers\laser"

je nach System auch auf Deutsch ... kannst du die ja anzeigen lassen indem du den Drucker als Standard setzt und dann via Msgbox den Namen ausgeben lässt.

Gruß jodel
Bitte warten ..
Mitglied: imebro
28.01.2015, aktualisiert um 15:47 Uhr
Danke Dir...

Aber in meinem bisherigen Script, in dem der Drucker mit seinem tatsächlichen Namen angegeben wird, funktioniert es ja mit

"\\DASFILE\Max-Müller_Brief"

Hier mal der Code des funktionierenden Druck-Makros:

01.
Sub Druck() 
02.
03.
    ActivePrinter = "\\dasfile\Max-Müller_Brief" 
04.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
05.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
06.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
07.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0 
08.
    ActivePrinter = "\\dasfile\Max-Müller_Blanko" 
09.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
10.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
11.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
12.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0 
13.
End Sub
Hierbei war vor dem Druck der Blanko-Drucker der Standarddrucker.
Dieser soll am Ende auch wieder Standarddrucker sein... und mit diesem Code ist das auch so.

Dabei ist nur das Problem, dass der Druckername jeweils im Script angegeben werden muss.
Die neue Variante sollte das ja verhindern, indem der jeweilige Drucker automatisch über eine Textdatei "druck.txt" dem jeweiligen User zugeordnet wird.

Ich hatte vermutet, dass das Problem in der Textdatei "druck.txt" liegt, aus der der jeweilige User und der jeweilige Drucker des Users herausgesucht werden.
Dort ist der Eintrag im Moment so angegeben:

Max-Müller;Max-Müller_Brief
Lutz-Schneider;Lutz-Schneider_Brief
...

LG
imebro
Bitte warten ..
Mitglied: 114757
LÖSUNG 28.01.2015, aktualisiert 29.01.2015
dann sind die Umlaute dran Schuld, weil es aus einer Textdatei ausgelesen wird.
Wenn du die Zeile so anpasst müssten diese richtig interpretiert werden, da ansonsten nur als ASCII ausgelesen wird:
Set matches = regex.Execute(fso.OpenTextFile(FILEPATH, 1,false,2).ReadAll())
Bitte warten ..
Mitglied: imebro
28.01.2015, aktualisiert um 15:56 Uhr
...beim Test mit Deiner Code-Zeile wird genau diese beim debuggen markiert mit folgender Fehlermeldung:

"Ungültiger Prozeduraufruf oder ungültiges Argument"

LG
imebro
Bitte warten ..
Mitglied: 114757
28.01.2015 um 15:59 Uhr
Zitat von imebro:

...beim Test mit Deiner Code-Zeile wird genau diese beim debuggen markiert mit folgender Fehlermeldung:

"Ungültiger Prozeduraufruf oder ungültiges Argument"

Die Parameter stimmen alle, siehe:
https://msdn.microsoft.com/en-us/library/aa265347(v=vs.60).aspx
Bitte warten ..
Mitglied: 114757
28.01.2015, aktualisiert um 16:05 Uhr
eventuell sind ja Leerzeichen am Ende deines Druckernamens, oder Zeilenumbrüche. Dann musst du diese entweder mit trim() entfernen oder eben aus der Textdatei oder den Pattern auch mal so schreiben:
01.
regex.Pattern = "^" & strUsername & ";(.*)$" 
Bitte warten ..
Mitglied: imebro
28.01.2015, aktualisiert um 16:10 Uhr
hmmm... verstehe ich jetzt gar nicht mehr.

Das Beispiel mit Max-Müller ist auch nur ein Beispiel.
In Wirklichkeit ist in dem Namen, mit dem ich teste, gar kein Umlaut drin...

Merkwürdig ist, dass mein jetziges Script (also das, wo die Druckernamen mit Pfad drin stehen) ja perfekt funktioniert.
Nur klappt es nicht, wenn ich es über das auslesen über die Textdatei mache.

Daher kann der Fehler nur in diesem Code sein, wo Username und Drucker ausgelesen werden oder in meiner Textdatei "druck.txt".
Aber alle Dateien stehen ja jetzt hier in diesem Thread drin und ich kann auch keinen Fehler finden oder noch irgendwo einen vermuten.

Hmmm... seltsam

LG
imebro
Bitte warten ..
Mitglied: imebro
28.01.2015, aktualisiert um 16:11 Uhr
Das mit dem $-Zeichen zusätzlich hat auch nichts gebracht.

Immer wieder erscheint die Fehlermeldung und beim Debuggen wird die Zeile

"ActivePrinter = strPrinter"

gelb markiert.

LG
imebro
Bitte warten ..
Mitglied: 114757
28.01.2015, aktualisiert um 16:18 Uhr
Was steht im gelben Tooltip wenn du mit der Maus über strPrinter fährst, während die Zeile gelb markiert ist ?
Schon mal was von Debugging gehört
Bitte warten ..
Mitglied: imebro
28.01.2015, aktualisiert um 16:28 Uhr
Yes

Da steht "strPrinter = "Max-Müller_Brief"

Also im Grunde das, was auch der Wahrheit entspricht.
Vielleicht sollte ich in der Textdatei "druck.txt" mal die Klammern mit eintragen... vielleicht klappts dann?

LG
imebro

UPDATE:

Hat nicht geklappt... aber beim Tooltip werden dann jetzt je 2 Klammern angezeigt.
Also dürfte ohne Klammern richtig gewesen sein.

Also dann noch immer keine Lösung.

Aber... morgen dann mehr - muss jetzt noch in eine Besprechung.

Danke bis dahin.

LG
imebro
Bitte warten ..
Mitglied: Eintagsfliege
28.01.2015, aktualisiert um 17:57 Uhr
Hallo imebro!

hmmm... verstehe ich jetzt gar nicht mehr.
Das Beispiel mit Max-Müller ist auch nur ein Beispiel.
In Wirklichkeit ist in dem Namen, mit dem ich teste, gar kein Umlaut drin...

Hier mal der Code des funktionierenden Druck-Makros:
01.
ActivePrinter = "\\dasfile\Max-Müller_Brief" 

Dort ist der Eintrag im Moment so angegeben:
Max-Müller;Max-Müller_Brief
Lutz-Schneider;Lutz-Schneider_Brief
Vielleicht klappts dann ja so:
01.
ActivePrinter = "\\dasfile\" & strPrinter

Grüße Dieter
Bitte warten ..
Mitglied: imebro
29.01.2015 um 08:44 Uhr
Hallo Dieter,

yes... das war´s

Habe jetzt den Code-Teil, der für den eigentlichen Druckvorgang zuständig ist, so abgeändert:

01.
' Druckroutine aufrufen: 
02.
03.
    ActivePrinter = "\\dasfile\" & strPrinter 
04.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
05.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
06.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
07.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0 
08.
    ActivePrinter = strPrinterDefault 
09.
    Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _ 
10.
        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
11.
        Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
12.
        PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
Zunächst ist unser Blanko-Drucker der Standarddrucker. Das wird ja weiter oben im Code schon festgestellt.
Dann wird in der Druckroutine zunächst auf dem Brief-Drucker ausgedruckt (strPrinter). Dieser wird ja aus der Textdatei "druck.txt" ausgelesen.
Anschließend wird dann wiederum auf dem Standarddrucker (strPrinterDefault) ausgedruckt... also wieder auf dem Blanko-Drucker.
Und dieser soll am Ende auch wieder bzw. immer noch der Standarddrucker bleiben.

Im Grunde läuft es so korrekt!

Was ich nur noch nicht so ganz verstehe, ist, wieso ich den ersten Ausdruck auf dem Brief-Drucker über den Code --> "\\dasfile\" & strPrinter <--- angeben muss und nachher den Standarddrucker nur über "strPrinterDefault"...
Ich hatte ja gestern schon einen Test gemacht, bei dem ich in der Textdatei "druck.txt" den Zusatz "\\dasfile\" mit eingesetzt hatte. Bei diesem Versuch hatte ich dann im Code auch nur "ActivePrinter = strPrinter" angegeben. Das hatte aber auch nicht funkitoniert. Finde ich irgendwie seltsam...

So wie es jetzt funktioniert, wäre es für mich logisch, wenn in der Textdatei "druck.txt" die Zeilen so aussehen würden:

01.
Max-Müller;"\\dasfile\Max-Müller_Brief" 
02.
Lutz-Schneider;"\\dasfile\Lutz-Schneider_Brief"
...und nicht so, wie es jetzt ist:

01.
Max-Müller;Max-Müller_Brief 
02.
Lutz-Schneider;Lutz-Schneider_Brief
Aber ist im Grunde ja auch wurscht Es funktioniert ja so... würde es halt nur gerne auch verstehen

Danke und Gruss,
imebro
Bitte warten ..
Mitglied: colinardo
LÖSUNG 29.01.2015, aktualisiert um 13:51 Uhr
Lutz-Schneider;"\\dasfile\Lutz-Schneider_Brief"
Lass die Anführungszeichen weg .... dann geht das auch damit , denn diese würden in diesem Fall sonst als Teil des Namens interpretiert, weil der Regex-Pattern eben so angelegt ist.

Grüße Uwe
Bitte warten ..
Mitglied: imebro
29.01.2015 um 09:15 Uhr
...ach mensch.... diese verdammten Anführungszeichen...
Manchmal kann alles sooo einfach sein

Danke Dir Uwe!

Hat funktioniert und jetzt ist das Ganze auch logisch für mich.
Habe den Code in der Druckroutine des Makros jetzt wieder so abgeändert, wie anfangs:

01.
ActivePrinter = strPrinter
und in der Datei "druck.txt" jetzt so:

01.
Max-Müller;\\dasfile\Max-Müller_Brief  
02.
Lutz-Schneider;\\dasfile\Lutz-Schneider_Brief
So klappt´s.

Danke nochmals und @ Uwe:
...werde meinen Chef auf ne Spende ansprechen

LG
imebro
Bitte warten ..
Mitglied: imebro
30.01.2015 um 08:46 Uhr
Habe den Beitrag gestern zwar als GELÖST markiert, aber es ist kaum zu fassen...

Nun habe ich den Code kopiert und auf dem ersten anderen Rechner getestet - und - was passiert?
Wieder wird die Zeile "ActivePrinter = strPrinter" im VBA-Editor mit Laufzeitfehler angemeckert

Das kann ich nun überhaupt nicht begreifen, da es ja bei mir nun so funktioniert.
Auch in der Textdatei "druck.txt" sind alle Einträge genauso, wie bei mir.

Ich kann absolut keinen Fehler finden...

Falls noch jemand von Euch ne Idee hat, dann gerne... aber ich habe jetzt eher keine Lust mehr und habe im Moment die "alte" Druckroutine wieder an diesem Rechner eingesetzt, wo ich den genauen Druckernamen angeben muss und der diesen nicht aus der Textdatei "druck.txt" ausliest.

LG
imebro
Bitte warten ..
Mitglied: colinardo
30.01.2015, aktualisiert um 14:52 Uhr
Wie gesagt das liegt zu 99% daran das deine Druckernamen nicht exakt stimmen, da reicht schon ein hinein gerutschtes Leerzeichen am Ende aus. Das lässt sich aber mit einem Trim(strPrinter) umgehen, welches führende oder nachfolgende Leerzeichen entfernt.

Eine andere Methode den Standarddrucker zu setzen ist es via WMI zu machen.

Methode zum Auslesen des aktuellen Standarddruckers via WMI:
01.
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
02.
Set colPrinters =  objWMIService.ExecQuery("Select * from Win32_Printer Where Default = True") 
03.
For Each objPrinter in colInstalledPrinters 
04.
    strPrinterDefault = objPrinter.Name 
05.
Next
Methode um den Standarddrucker zurückzusetzen (oder einen anderen Drucker als Default zu deklarieren)
01.
strPrinterDefault = Replace(strPrinterDefault,"\","\\") 
02.
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
03.
'Alten Standarddrucker wieder setzen 
04.
Set colPrinters =  objWMIService.ExecQuery("Select * from Win32_Printer Where Name = '" & strPrinterDefault & "'") 
05.
For Each objPrinter in colPrinters 
06.
    objPrinter.SetDefaultPrinter() 
07.
Next
Das nutzt dir aber alles nichts wenn deine Namen nicht absolut korrekt sind.

Und überhaupt, was seit Ihr für eine Firma die einen Programmierneuling an solch eine Sache heran lassen ??

Ich empfehle dir dringend dich mal eingehend einzulesen und vor allem das Debugging im VBA-Editor (Breakpoints, etc) zu beherrschen. Programmieren besteht nun mal aus vielen Variablen,da zeigt es es sich meist erst in der Praxis wo es zu Problemen kommt. Office 2000 auf einem Terminalserver ist ja auch schon ein wenig irre .

VBA/VBS/WSH/Office Developer Referenzen

Ohne mehr Infos zu den aktuellen Werten der Variablen auf der betreffenden Station und Umgebung wird das hier wieder zu einer ellenlangen Diskussion, und dir hier VBA von Grund auf beizubringen ist eigentlich nicht unsere Aufgabe, sorry...

Grüße Uwe
Bitte warten ..
Mitglied: imebro
30.01.2015 um 12:19 Uhr
Hallo Uwe,

ja, da hast Du Recht.
Es fing eigentlich mit einem kleinen Makro an... und dann kamen die Kollegen und wollten es immer komplexer haben.
Dadurch hat sich das so ergeben

Bezüglich dem "Trim(strPrinter)":

Da hatte ich doch schon den folgenden Tipp erhalten, mit dem $-Zeichen zusätzlich:

01.
regex.Pattern = "^" & strUsername & ";(.*)$" 
Meintest Du mit "Leerzeichen am Ende..." in meiner Textdatei "druck.txt"?
Die habe ich überprüft - und da sind keine Leerzeichen drin.
Die Namen stimmen zu 100% überein.

Aber... könnte es auch mit Groß-/Kleinschreibung zusammenhängen?
Bei manchen Kollegen wird nämlich der Server "\\dasfile" geschrieben und bei anderen "\\DASFILE".

Wo müßte ich das "Trim(strPrinter)" denn im Code einsetzen?

Danke und Gruss,
imebro
Bitte warten ..
Mitglied: colinardo
30.01.2015, aktualisiert um 12:32 Uhr
Zitat von imebro:
Da hatte ich doch schon den folgenden Tipp erhalten, mit dem $-Zeichen zusätzlich:
Das hast du aber falsch Interpretiert, das Dollarzeichen bezeichnet das Ende einer Zeile und soll verhindern das Zeilenumbrüche mit in die Variable wandern, das tun sie aber trotzdem nicht.
Meintest Du mit "Leerzeichen am Ende..." in meiner Textdatei "druck.txt"?
Ich meine jegliche Leerezeichen die vor und hinter den Semikolons stehen, denn diese sind ja die Trenner der Spalten.
Ich könnte das Regex-Pattern jetzt natürlich auch noch so erweitern das das alles egal wäre. Aber wenn du weißt worauf es ankommt ist das ja nicht nötig.
Die habe ich überprüft - und da sind keine Leerzeichen drin.
Die Namen stimmen zu 100% überein.
Aber... könnte es auch mit Groß-/Kleinschreibung zusammenhängen?
In einem Test tut es das hier nicht.
Wo müßte ich das "Trim(strPrinter)" denn im Code einsetzen?
das kannst du schon ganz zu Beginn hier machen:
strPrinter = Trim(matches(0).Submatches(0))
Grüße Uwe
Bitte warten ..
Mitglied: imebro
30.01.2015, aktualisiert um 14:21 Uhr
...ich glaube, ich lasse es jetzt.

Habe wieder die alte Druckroutine eingesetzt, wo die Drucker mit ihren tatsächlichen Namen direkt angesprochen werden.

Mit dem Zusatz "Trim" gab es den gleichen Laufzeitfehler im VBA-Editor, wie vorher auch.
Übrigens ist es immer der Laufzeitfehler 5216, der aber in der Script-Hilfedatei nicht aufgeführt ist.

Microsoft sagt folgendes zu dem Fehler:
Hinweis: Wenn Sie dieses Makro ausführen, und geben Sie einen Drucker, der nicht installiert ist, wird die folgende Fehlermeldung angezeigt:
Laufzeitfehler '5216': Druckerfehler ist aufgetreten.

Eine Office-Seite sagt dazu:
5216 = Den letzten Teile eines mit Semikolon getrennten Strings ermitteln

--> Allerdings ist der Drucker ja korrekt und es funktioniert damit ja auch über die normale Druckroutine!

Habe dann zusätzlich in der Textdatei "druck.txt" mal noch testweise das "DASFILE" in groß geschrieben... aber der Fehler bleibt.

Wurmt mich einfach...
Aber ich will Dich / Euch jetzt damit auch nicht länger weiter quälen

Danke und Gruss,
imebro
Bitte warten ..
Mitglied: imebro
30.01.2015 um 14:32 Uhr
Glaube ich hab´s

Habe im VBA-Editor beim debuggen mal den Mauszeiger auf "ActivePrinter" gesetzt.
Dabei viel mir auf, dass dann dort folgendes stand:

01.
\\dasfile\Maier_Blanko on NE14
Nun habe ich dieses ominöse "NE14" einfach mal in der Textdatei "druck.txt" noch hinter den Druckernamen eingegeben... und zwar so:

01.
Lisa-Meier;\\dasfile\Maier_Blanko on NE14
Und anschließend lief der Druckvorgang durch.

Seltsam finde ich nur, dass es bei mir auch ohne das "NE14" (oder einen ähnlichen Ausdruck) funktioniert...

LG
imebro
Bitte warten ..
Mitglied: 114757
30.01.2015, aktualisiert um 14:40 Uhr
Nun habe ich dieses ominöse "NE14" einfach mal in der Textdatei "druck.txt" noch hinter den Druckernamen eingegeben... und zwar so:
hab ich doch schon ganz zu Beginn geschrieben ... aber wer nicht hören will muss fühlen :-P

Seltsam finde ich nur, dass es bei mir auch ohne das "NE14" (oder einen ähnlichen Ausdruck) funktioniert...
Du sagst ja auch kein Wort wie sich dein System vom anderen unterscheidet (Server/Client/ etc. pp)
Bitte warten ..
Mitglied: imebro
30.01.2015 um 14:41 Uhr
Die Systeme sind absolut gleich.
Sind alle auf einem Terminalserver.

Bei mir steht dort z.B. "NE15" dahinter.
Aber bei mir funktioniert es, obwohl ich diesen Zusatz NICHT in der Textdatei "druck.txt" aufgenommen habe

Ist doch seltsam...

LG
imebro
Bitte warten ..
Mitglied: 114757
LÖSUNG 30.01.2015, aktualisiert 03.02.2015
Benutze die WMI-Variante von @colinardo die ist in dieser Hinsicht Systemübergreifend sowieso die bessere Variante. Bei ActivePrinter gibt es je nachdem wie der Drucker eingerichtet wurde eben ab und zu mal Probleme.
Gruß jodel32
Bitte warten ..
Mitglied: Eintagsfliege
31.01.2015, aktualisiert um 15:39 Uhr
Hallo zusammen!

Beim Umstellen des Standarddruckers per WMI ändert sich leider nix an der ActivePrinter-Einstellung in Word...

Hier mal ein Code, mit dem es funktionieren sollte:
01.
Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" ( _ 
02.
    ByVal lpAppName As String, _ 
03.
    ByVal lpKeyName As String, _ 
04.
    ByVal lpDefault As String, _ 
05.
    ByVal lpReturnedString As String, _ 
06.
    ByVal nSize As Long) As Long 
07.
 
08.
Public Sub DeineSub() 
09.
    Call Printer("Müller_Blanko") 
10.
    Call Printer("Müller_Brief") 
11.
End Sub 
12.
 
13.
Private Sub Printer(ByVal strName As String) 
14.
    Dim colPrinters As Object 
15.
    Dim strBuff As String, strPrinter As String, strDefaultPrinter As String 
16.
     
17.
    strDefaultPrinter = ActivePrinter 
18.
             
19.
    With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
20.
        Set colPrinters = .ExecQuery("Select * From Win32_Printer Where Name Like '%" & strName & "%'") 
21.
         
22.
        If colPrinters.Count Then 
23.
            strBuff = Space(1024) 
24.
            strPrinter = colPrinters.ItemIndex(0).Name 
25.
             
26.
            GetProfileString "PrinterPorts", strPrinter, "", strBuff, Len(strBuff) 
27.
     
28.
            If InStr(strBuff, ",") Then 
29.
               'strPrinter = strPrinter & " auf " & Split(strBuff, ",")(1)  'Deutsch 
30.
                strPrinter = strPrinter & " on " & Split(strBuff, ",")(1)   'Englisch 
31.
            End If 
32.
             
33.
            On Error Resume Next 
34.
            ActivePrinter = strPrinter 
35.
             
36.
            If Err.Number = 0 Then 
37.
                Application.PrintOut Filename:="", Range:=wdPrintAllDocument, Item:= _ 
38.
                wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _ 
39.
                Collate:=True, Background:=True, PrintToFile:=False, PrintZoomColumn:=0, _ 
40.
                PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0 
41.
                ActivePrinter = strDefaultPrinter 
42.
            Else 
43.
                MsgBox "Drucker nicht gefunden: " & strName, vbExclamation, "Drucken . . ." 
44.
            End If 
45.
            On Error GoTo 0 
46.
        Else 
47.
            MsgBox "Drucker nicht gefunden: " & strName, vbExclamation, "Drucken . . ." 
48.
        End If 
49.
    End With 
50.
End Sub
Wobei die Vollständigkeit des Druckernamens unvollständig sein darf, da der Druckername anhand des angegebenen Teilnamens ermittelt wird z.B.
reicht "MX850" als Angabe für "Canon MX850 series Printer auf Ne02:"

Grüße Dieter
Bitte warten ..
Mitglied: imebro
03.02.2015 um 13:25 Uhr
Danke Dieter für Deinen Kommentar.

Ich werde es jetzt so lassen, wie es ist (also wie es VOR der Lösung mit der Textdatei "druck.txt" war).
Wird mir doch alles viel zu kompliziert und es funktioniert ja so bestens.

Zwar sind dann an jedem Arbeitsplatz jeweils individuelle Druckernamen im VBA-Script angegeben, aber da es sich nur um ein paar Mitarbeiter-/innen handelt, ist das vom Aufwand her ja nicht so dramatisch.

Nochmals danke für die Hilfe und LG,
imebro
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
Powershell Script aus VBA heraus ausführen (2)

Frage von mcnico1978 zum Thema VB for Applications ...

Batch & Shell
gelöst VBS Script in eine Textdatei ausgeben (VBS mit Batch zusammenführen) (5)

Frage von Luuke257 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...