VBA Papierschacht mit Makro wählen

Mitglied: Hatl

Hatl (Level 1) - Jetzt verbinden

01.08.2006, aktualisiert 03.08.2006, 9410 Aufrufe, 4 Kommentare

Hallo!

Ich möchte eine Wordvorlage (*.dot) erstellen welche später von einem Programm mit Daten gefüllt wird. In dieser Wordvorlage muss definiert werden, dass die erste Seite immer aus der 2 Lade gedruckt wird und der Rest immer aus der ersten Lade.
Über Datei -> Seite einrichten -> Format funktioniert es nicht da es auf unterschiedlichen Druckern (zwar alles Kyocera aber unterschiedliche Modelle) und somit mit unterschiedlichen Ladenbezeichnungen funktionieren muss.
Also wird mir nichts anderes überbleiben als ein Makro zu schreiben, welches die Ladenbezeichnung und die interne Ladennummer ermittelt.
Hab im Netzt gesucht und folgendes relativ kompliziertes Makro gefunden:

Public Const DC_BINNAMES = 12
Public Const DC_BINS = 6
Declare Function DeviceCapabilities Lib "winspool.drv" Alias _
"DeviceCapabilitiesA" (ByVal lpDeviceName As String, _
ByVal lpPort As String, ByVal iIndex As Long, _
ByVal lpOutput As Long, ByVal lpDevMode As Long) As Long
Public Type Zufuhr
Nummer As Integer
Name As String * 24
End Type
Public Function HolePapierfaecher(drucker As Printer, _
faecher() As Zufuhr) as Long
Dim devicename As String, portname As String
Dim rc As Long, i As Long
Dim bins() As Integer
Dim binnames As String
If drucker Is Nothing Then
devicename = ""
portname = ""
Else
devicename = drucker.devicename
portname = drucker.port
End If
If devicename = "" Or portname = "" Then
MsgBox "Ausgewaehlter Drucker nicht gefunden!", _
vbCritical + vbOKOnly, App.ProductName
HolePapierfaecher = 0
Exit Function
End If
rc = DeviceCapabilities(devicename, portname, DC_BINS, 0, 0)
If rc = 0 Then
MsgBox "Ausgewaehlter Drucker nicht gefunden!", _
vbCritical + vbOKOnly, App.ProductName
HolePapierfaecher = 0
Exit Function
End If
ReDim bins(1 To rc)
rc = DeviceCapabilities(devicename, portname, DC_BINS, VarPtr(bins(1)), 0)
binnames = String(24 * rc, Chr(0))
rc = DeviceCapabilities(devicename, portname, DC_BINNAMES,
StrPtr(binnames), 0)
binnames = StrConv(binnames, vbUnicode)
ReDim faecher(1 To rc)
HolePapierfaecher = rc
For i = 1 To rc
faecher(i).Nummer = bins(i)
faecher(i).Name = Mid(binnames, ((i - 1) * 24) + 1, 24)
If InStr(1, faecher(i).Name, Chr(0)) > 0 Then
faecher(i).Name = Left(faecher(i).Name, _
InStr(1, faecher(i).Name, Chr(0)) - 1)
End If
Next
End Function

Meinen Frage jetzt dazu, wo im VB-Editor gehört das hin? Ich hab es in ein Modul geschrieben, aber jetzt muss ich die Funktion im "ThisDocument" aufrufen, wie macht man das? Bzw. hat jemand eine Idee wie man das einfacher machen könnte?
Ich steh da auf "der Leitung"

Vielen Dank!!

mfg
Mitglied: AndreasHoster
01.08.2006 um 16:54 Uhr
Prinzipiell kommt es ins Document_Open Ereignis rein, damit beim Öffnen des Dokuments die Daten gesetzt werden (im VBA Editor auf ThisDocument, dann beim Code-Editor Teil einfach
Private Sub Document_Open()
REM Hier Funktion aus Modul aufrufen
End Sub
eingeben

Ich sehe nur ein Problem, Du setzt beim Öffnen dann die Werte ein. Wenn jetzt jemand über Datei -> Drucken einen anderen Drucker auswählt, stehen falsche Werte drin. Oder hat jeder User nur einen Drucker zugeordnet?
Bitte warten ..
Mitglied: Hatl
01.08.2006 um 17:06 Uhr
Hallo!

Erstmal Danke für die Antwort!

Also die Funktion selbst kommt also in ein Modul.
Der Aufruf kommt ins Document open.
Ist das soweit richtig?

Aber wie schaut der Aufruf aus? Was muss ich effektiv hinschreiben damit die Funktion aufgerufen wird. Vorallem wie werden die Paramter angegeben?

Die Funktion ist so definiert:
Public Function HolePapierfaecher(drucker As Printer, faecher() As Zufuhr) as Long

Den Aktuellen Drucker könnte ich ermitteln und als Paramter übergeben aber "faecher" soll in der Funktion ja ermittelt werden.


Stimmt es passt dann nur für den Drucker der beim öffnen eingestellt war, aber das genügt den das Dokument soll eh immer am Standarddrucker ausgedruckt werden, bei den anderen gibts keine Laden.

Danke!

mfg
Bitte warten ..
Mitglied: Hatl
02.08.2006 um 11:10 Uhr
Hab es hin bekommen, der Aufruf schaut natürlich so aus:

Dim var() As Zufuhr
Dim drucker As String
Dim out As Variant
drucker = ActivePrinter

out = HolePapierfaecher(drucker, var())

Da stand ich wohl wirklich auf der Leitung.

Vielen Dank!
Bitte warten ..
Mitglied: Hatl
03.08.2006 um 15:17 Uhr
Hallo nochmal!

Nachdem die Auswahl der Papierschächte nun wunderbar funktioniert, wäre es ja doch einen gute Verbesserung wenn die Schächte auch stimmen wenn ein User den Drucker ändert.
Es könnte ja eigentlich doch vorkommen das ein user mal auf einen anderen Drucker als seinen Standard drucken möchte.

Also müste ich irgendwie mitbekommen wenn der User den Drucker ändert und dann das Makro nochmal ausführen, geht das?

Momentan hab ich den Funktionsaufruf (HolePapierfaecher) im Document_New() hier werden dann auch die ermittelten Daten aus der Funktion verarbeitet und die entsprechenden Werte für die Papierschächte gesetzt. Das ganze Dokument ist einen *.dot.
Somit wird das Makro immer dann ausgeführt wenn ein neues auf dieser Vorlage basierendes Dokument erzeugt wird.
Aber wie kann ich das Makro bzw. die Sub Document_New() ausführen wenn der User einen anderen Drucker einstellt?

Vielen Dank!

mfg
Bitte warten ..
Heiß diskutierte Inhalte
Exchange Server
Exchange Zero Day Hack - Wie entfernen?
gelöst mtaiitVor 1 TagFrageExchange Server84 Kommentare

Hallo, bei mir hat es einige Kundenserver getroffen Weiß einer wie ich diese WebShells wieder loswerde? Das löschen der betroffenen .aspx Dateien wird wohl ...

Exchange Server
Exchange-Hack (2021-03) war Angriff erfolgreich? Was dann?
FrM222Vor 19 StundenFrageExchange Server19 Kommentare

Hallo Zusammen, ich bin ganz neu hier im Forum, daher entschuldige ich mich schon mal im Voraus, falls ich beim Einstellen etwas falsch gemacht ...

Exchange Server
Wie grundsätzlich verfahren mit Exchange Zero-Day-Exploit?
StefanKittelVor 1 TagFrageExchange Server14 Kommentare

Hallo, ich habe auf einem Server mit den Tool von Microsoft Zugriffsversuche am 26. und 27.02.21 gefunden. Das führt mich zu der Vermutung, dass ...

Ausbildung
Projektantrag abgelehnt (IHK)
StrowayerVor 20 StundenFrageAusbildung10 Kommentare

Guten Tag, mein Projektantrag für die IHK wurde leider abgelehnt mit der Begründung: "Bitte überarbeiten Sie Ihren Zeitplan. Die Projektdokumentation sollte nicht 25% der ...

Python
Könnt ihr bugs finden ?
adriaanVor 1 TagAllgemeinPython11 Kommentare

Guten Tag liebe Forenmitglieder, Ich schreibe heute diesen Beitrag, weil ich einen Python Zähler entwickelt habe. Diesen würde ich gerne härten und entsprechend gerne ...

Off Topic
So funktioniert das Internet! - Danke, Maus
em-pieVor 1 TagInformationOff Topic2 Kommentare

Anlässlich des Geburtstages unserer orangenen Freundin: So funktioniert das Internet: Alles Gute, liebe Maus :-)

Netzwerke
Cisco IOS: grep?
gelöst PeterGygerVor 1 TagFrageNetzwerke11 Kommentare

Hallo Falls jemand die Antwort aus dem Ärmel schütteln kann , danke ich im Voraus. In einem Vortrag wurde die Cisco IOS (Catalyst / ...

Exchange Server
Windows Server 2019 und Exchange 2016
gelöst Jessica98Vor 20 StundenFrageExchange Server12 Kommentare

Hallo zusammen, wir haben folgendes Problem. Die neue Exchange 2016 CU ist nur mit Windows Server 2016 kompatibel. Problem, wir haben den Exchange auf ...