VBA Papierschacht mit Makro wählen
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 36077
Url: https://administrator.de/contentid/36077
Ausgedruckt am: 22.11.2024 um 21:11 Uhr
4 Kommentare
Neuester Kommentar
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?
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?