Word-Makro: ActivePrinter im Netzwerk

Hallo,

ich möchte gerne einen Drucker per Word-Makro ansprechen. Das klappt auch, jedoch entweder vom pc, an dem der Drucker lokal angeschlossen ist mit ActivePrinter=„Druckername“ oder aus dem Netzwerk mit ActivePrinter="\Freigabename\Druckername".
Ich muss aber mit dem gleichen Makro von allen Rechnern arbeiten, bin allmählich etwas ratlos.

Hat jemand eine Idee, wie ich das Problem lösen kann?

Danke
Marcus

Hi,

ich habe ein bißchen herumexperimentiert und gefunden:

  • mit Application.System.MSInfo kannst Du die Systeminfo aufrufen

  • der sendest Du mit Sendkeys() den Befehl, die Informationen in eine Textdatei zu speichern

  • dort findest Du mit PrivateProfileSetting() o.s.ä. unter dem Abschnitt [Printing] ab der zweiten Zeile (in der ersten steht die Tabellenüberschrift) die Daten der installierten Drucker.

Ich frage mich eher, was Du mit der Ansprache des Druckers aus Word heraus erreichen willst. Salopp ausgedrückt ist Drucken Sache des Betriebssystems, deshalb hat Microsoft auch nichts vorgesehen, Drucker aus Word heraus umzustellen. Den Namen des aktiven Druckers erhält man, und die Word-Druckbefehle sprechen ihn meist ohne Rückfrage an.

HTH.

M.

Hallo, vielen Dank für die Antwort. Ich weiß noch nicht ganz, ob mir die Antwort etwas nützt, muss da erst ein wenig darüber nachdenken.
Kurz zur Erklärung, was ich bezwecke:
Ich nutze eine Warenwirtschaftssystem, was auf einem Rechner als Server und Frontend läuft, auf den anderen Rechnern nur als Frontend. Dieses Warenwirtschaftssystem nutzt Word für die Dokumentenausgabe.
Der Ausdruck von Lieferschein/Rechnung soll auf dem Drucker am Server erfolgen, da dieser über mehrere Papierfächer verfügt.
Über das Makro, was automatisch beim Erzeugen der Rechnung u. ä. mit lädt, möchte ich steuern, dass z. B. ein Original aus Fach 1 und zwei Kopien aus Fach 2 gedruckt werden.
Da immer das gleiche Macro auf allen Rechnern geladen wird, komme ich mit den unterschiedlichen Pfadangaben nicht zurecht.
Ich hoffe, ich habe es halbwegs verständlich ausgedrückt.

Viele Grüße
Marcus

Hallo Marcus,

Kurz zur Erklärung, was ich bezwecke:
Der Ausdruck von Lieferschein/Rechnung soll auf dem Drucker am Server erfolgen, da dieser über mehrere Papierfächer verfügt. Über das Makro, was automatisch beim Erzeugen der Rechnung u.ä. mit lädt, möchte ich steuern, dass z. B. ein Original aus Fach 1 und zwei Kopien aus Fach 2 gedruckt werden.

Ich finde, Du hast Dich verständlich ausgedrückt. Ich würde in dem Makro so vorgehen:

  • in dem Makro den ActivePrinter auslesen und in einer Variablen abspeichern

  • den ActivePrinter umstellen auf den Drucker am Server
    (für den einzigen Sonderfall [die Instanz, die auf dem Server läuft] kannst Du auch das dortige Makro anpassen)
    und das Ding mit den entsprechenden Parametern drucken

  • den ActivePrinter aus der Variablen auslesen und zurückstellen.

HTH.

Markus
_____________
Und Sterne…

Hallo Markus,

die Ansprache der Drucker klappt ja einwandfrei. Da die Worddatei aber zentral als Vorlage auf dem Server liegt, kann ich nicht ohne weiteres das Makro bei einem Rechner anpassen.
Helfen würde mir zum Beispiel, wenn ich den Namen des Druckers für Clients und Server gleich machen könnte, als nicht „HP1300“ und „\PCFreigabename\HP1300“, oder wenn ich auf dem Server den Drucker auch mit „\PCFreigabename\HP1300“ ansprechen könnte, obwohl er lokal angeschlossen ist. Das funktioniert aber bislang nicht.

Viele Grüße
Marcus

Hi Marcus,

tut mir leid, ich verstehe kein Wort Deiner letzten Antwort.

Deime vorigen Antworten hatte ich so verstanden:

  • Wir haben ein Programm, das überall läuft. Zum Drucken nutzt es Word.
  • Die meisten Dokumente dürfen dort gedruckt werden, wo sie erstellt werden.
  • Aber eine bestimmte Sorte Dokumnente sollen auf dem Drucker, der am Server hängt, ausgedruckt werden.

Wenn meine Problemauffassung stimmt, ist meine Lösung vom vorigen Post auch korrekt. Ansonsten bitte noch mal posten.

Markus

Hallo Markus,

vielleicht posten wir wirklich aneinander vorbei, ich versuche es noch einmal zusammen zu fassen:

  • Es gibt eine Software, die auf dem Server und auf den Clients läuft,
    Datenbank und viele Bestandteile des Programms liegen nur auf dem Server
  • Dies umfasst auch die Vorlagen für die Wordausgabe der gewünschten Dokumente, inkl. der eingebauten Makros
  • Es gibt also für alle Nutzer nur eine zentrale Stelle, die Dokumentenausgabe zu steuern
  • Das Wordmakro nutzt zur Auswahl des Druckers den Befehl AktivePrinter, der entweder den Namen des Druckers oder den Netzwerknamen des Druckers als Argument versteht
  • Die Ausgabe soll von allen Arbeitsplätzen auf demselben Drucker erfolgen, lokal angeschlossen am Server und im Netzwerk freigegeben
  • Das Problem ist: In dem für alle (!) zuständigen Makro kann ich den Drucker mit „\Servername\Druckername“ ansteuern, dann läuft er auf allen Clients, aber nicht auf dem Server, oder mit „Druckername“, dann läuft er auf dem Server, aber nicht auf den Clients.

Ich hoffe, die Problemlage ist nun klarer und Du kannst mir vielleicht sogar helfen.

Viele Grüße
Marcus

Hallo,

was ist dann das Problem, dann muss das Macro/VBA Code halt in der Druckerliste (Application.Printers) nachschauen welcher der beiden Druckernamen vorhanden ist und diesen ansprechen. Das funtioniert mit einer einfachen Schleife und einer If-Anweisung.

Tschau
Peter

Hi,

bei Word2000 gibt’s kein Application.Printers (weil das vermutlich Sache des Betriebssystems sein soll). Daher nur eine Idee - alles ungetestet:

Im vorliegenden Fall würde ich die Reihenfolge ausnutzen, in der Makros ausgeführt werden. Makros werden zuerst in der lokalen benuzerdef. Vorlage, dann in der Normal.dot, dann in globalen Dokumentvorlagen ausgeführt.

Ich würde auf dem Server ein Makro erstellen, das den gleichen Namen hat wie das Makro in der globalen Vorlage. Es unterscheidet sich halt nur im Namen des Druckers.

Oder man geht über Application.UserName: wenn der angemeldete User der des Servers ist, läuft das Makro ja auf dem Server.

HTH.

Markus

Hallo,

Ok .Printers gibst wohl erst ab VBA 2002.
Dann ist es aber auch kein Problem, dann holt man sich halt die Druckerliste mittels der API.


Public Function GetAvailPrinters()
Dim r As Long
Dim Buffer As String

’ Get the list of available printers from WIN.INI
Buffer = Space(8192)
r = GetProfileString(„PrinterPorts“, vbNullString, „“, _
Buffer, Len(Buffer))

ParseListIntoArray (Buffer)

End Function

Tschau
Peter