Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
740to744
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
740to744
740to744
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Papierformat autom. durch VBA auswählen lassen?

Papierformat autom. durch VBA auswählen lassen?
07.03.2006 16:37:18
Oliver
Hallo Leute,
ich habe da mal eine Frage zur Papierformatauswahl via VBA. Ich wollte mit nachfolgendem VBA Code das richtige Papierformat automatisch setzen lassen.

With Workbooks("Rechnung.xls").Sheets("Briefumschlag")
.PageSetup.PaperSize = 148
.PrintPreview False
End With

Welche Zahl hinter dem Befehl “.PageSetup.PaperSize“ einzusetzen ist, habe ich durch den Makrorekorder herausgefunden. Nun habe ich aber das Problem, dass auf einem anderen PC diese Nummer einem anderen Papierformat entspricht. Ich dachte mir, eventuell funktioniert es ja, wenn ich den Klartext, also den Text, der mir nach der Auswahl in dem Papierformatauswahlfeld angezeigt wird, anstelle der Zahl angebe. Ich habe also anstelle der Zahl 148 den Text "Brief A5 Excel(114x161mm)" angegeben, denn der wird mir nach der Auswahl angezeigt. Leider funktioniert das so nicht, es kommt zu einem Laufzeitfehler. Daher nun meine Frage, wie kann ich dieses benutzerdefinierte Format auf jedem Rechner, auf dem die Datei ausgeführt werden soll, automatisch auswählen lassen? Hat da jemand eine Idee oder funktioniert das nicht?
Ich hoffe, jemand kann mir da weiterhelfen?
Vorab besten Dank für die Hilfe,
Oliver S.

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Papierformat autom. durch VBA auswählen lassen
07.03.2006 16:57:13
Reinhard
Hi Oliver,
im Editor mit Maus auf papresize, dann F1...

Sub tt()
With Workbooks("Rechnung.xls").Sheets("Briefumschlag")
.PageSetup.PaperSize = xlPaperEnvelopeC6 'Briefumschlag C6 (114 x 162 mm)
.PrintPreview False
End With
End Sub

Gruß
Reinhard
ps: Ich freue mich über eine Rückmeldung ob diese Antwort hilfreich war oder nicht..
Das war's leider noch nicht.
07.03.2006 17:04:29
Oliver
Hallo Reinhard,
danke Dir zunächst mal für Deine Antwort. Aber leider hilft mir das so nicht richtig weiter. In den Eigenschaften hatte ich das von Dir aufgeführte Format auch entdeckt. Nur leider ist das ebenfalls nicht auf allen Rechnern enthalten und kann somit nicht angewählt werden. Was definitiv sicher ist, dass das benutzerdefinierte Format "Brief A5 Excel(114x161mm)", welches auf jedem Rechner eingestellt ist, vorhanden ist und auch angewählt werden kann. Nur leider nicht auf jedem Rechner mit der gleichen Zahl. Gibt es eine Möglichkeit herauszufinden, welche Zahl das benutzerdefinierte Format belegt? Das würde mir auch schon weiterhelfen.
Ich hoffe, es gibt da irgendeine Möglichkeit. Danke Dir noch mal für Deine Antwort,
Oliver S.
Anzeige
AW: APi Profi gesucht für DeviceCapabilities
07.03.2006 19:50:28
Oliver
Hi Reinhard,
danke Dir für Deine erneute Antwort. Leider ist mir das etwas zu hoch. Ich werde mir dann wohl etwas anderes überlegen müssen.
Ich werde die Antwort dennoch noch mal als offen hinstellen. Eventuell hat ja noch jemand anderes eine Idee, die mich doch noch weiterbringt.
Nochmal besten Dank für Deine Hilfe, find ich prima.
Gruß,
Oliver S.
Anzeige
AW: APi Profi gesucht für DeviceCapabilities
07.03.2006 22:48:16
MichaV
Hallo Ihr Kämpfer,
hab das mal für Euch angepasst. Sollte so eigentlich laufen, ich kanns aber nicht großartig testen, weil mir nur ein Rechner zur Verfügung steht. Problem ist, daß Oliver den Namen des Druckers (und den Anschluss?) kennen muss. Aber für die Auflistung aller verfügbaren Drucker gibts auch wieder schöne Lösungen, die kann ich Euch ja bei Bedarf wieder anpassen ;o)
Ansonsten: Reinhard, Du kannst wieder übernehmen.
So ruft Ihr die Papiernummer ab:


Sub Test()
MsgBox PaperCode("HP LaserJet IIIP", "LPT1", "Brief A5 Excel")
End Sub


und das hier kommt in ein allgemeines Modul. Keine Angst, Oliver, das musst Du nicht tiefer drin einsteigen. Ist aber Interessant, die Sache mal mit "F8" durchzugehen.


Option Explicit
'Original- Code von Elmar Boye
'httpe://groups.google.de/group/microsoft.public.de.vb/browse_thread/thread/24cd2731e6b1cc57/4aca54b7063ab986?lnk=st&q=DeviceCapabilities&rnum=28&hl=de#4aca54b7063ab986
' Geräteeigenschaften ermitteln (BOOL), verschiedene Declares für unterschiedliche Rückgaben
Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" ( _
  ByVal strDeviceName As StringByVal strPort As String, _
  ByVal lngIndex As LongByVal strOutput As String, _
  lngDevMode As LongAs Long
Private Declare Function DeviceCapabilitiesLong Lib "winspool.drv" Alias "DeviceCapabilitiesA" ( _
  ByVal strDeviceName As StringByVal strPort As String, _
  ByVal lngIndex As Long, lngOutput As Long, _
  lngDevMode As LongAs Long
Private Declare Function DeviceCapabilitiesAny Lib "winspool.drv" Alias "DeviceCapabilitiesA" ( _
  ByVal strDeviceName As StringByVal strPort As String, _
  ByVal lngIndex As Long, lngOutput As Any, _
  lngDevMode As LongAs Long
' Parameter für DeviceCapabilties.lngIndex
Const DC_FIELDS As Integer = 1
Const DC_PAPERS As Integer = 2
Const DC_PAPERSIZE As Integer = 3
Const DC_MINEXTENT As Integer = 4
Const DC_MAXEXTENT As Integer = 5
Const DC_BINS As Integer = 6
Const DC_DUPLEX As Integer = 7
Const DC_SIZE As Integer = 8
Const DC_EXTRA As Integer = 9
Const DC_VERSION As Integer = 10
Const DC_DRIVER As Integer = 11
Const DC_BINNAMES As Integer = 12
Const DC_ENUMRESOLUTIONS As Integer = 13
Const DC_FILEDEPENDENCIES As Integer = 14
Const DC_TRUETYPE As Integer = 15
Const DC_PAPERNAMES As Integer = 16
Const DC_ORIENTATION As Integer = 17
Const DC_COPIES As Integer = 18
' Pseudo Konstanten für Rückgaben
Const DC_BINNAME_LENGTH As Long = 24            ' Länge eines Schachtnamens
Const DC_PAPERNAME_LENGTH As Long = 64          ' Länge eines Papiernamens
Function PaperCode(strDevice As String, strPort As String, strPaperName As StringAs Integer
'Code von Michav
Dim arrPaperNames() As String
Dim arrPapers() As Integer
Dim NumOfPapers As Integer
Dim x%
NumOfPapers = GetPrinterPapers(strDevice, strPort, arrPaperNames, arrPapers)
If NumOfPapers = -1 Then MsgBox "Drucker nicht gefunden": Exit Function
If NumOfPapers = -2 Then MsgBox "Informationen über Papiertypen nicht verfügbar": Exit Function  '?
For x = 0 To NumOfPapers - 1
    If UCase(arrPaperNames(x)) = UCase(strPaperName) Then
        PaperCode = arrPapers(x): Exit Function
    End If
Next x
MsgBox "Drucker hat dieses Papierformat nicht"
End Function
Function GetPrinterPapers(strDevice As String, strPort As String, arrPaperNames() As String, arrPapers() As IntegerOptional strPaperList As VariantAs Integer
'Original- Code von Elmar Boye
'angepasst von MichaV
' Liefert die verfügbaren Papierschächte eines Druckers
' Parameter:    PrinterNo    - Druckernummer aus Printers
'               arrPaperNames - Namen der Papierschächte
'               arrPapers     - Nummern der Papierschächte
'               strPaperList  - Liste für Comboboxen (ist optional) als Wertliste der Form: Name, Wert
' Rückgabe:     Anzahl der Papierformate, oder 0, wenn nicht zu ermitteln
   ' Dim strDevice As String, strPort As String
    Dim strPaperNames As String
    Dim lSize As Long, iIndex As Integer
    GetPrinterPapers = 0
    'If Not ValidPrinter(PrinterNo, True) Then Exit Function
    ' Liefert über eine interne Druckernummer Gerätenamen und Port zurück
    'strDevice = Printers(PrinterNo).PrinterDevice
    'strPort = Printers(PrinterNo).PrinterPort
    lSize = DeviceCapabilitiesLong(strDevice, strPort, DC_PAPERNAMES, ByVal 0&, ByVal 0&)
    If lSize <= 0 Then GetPrinterPapers = -1: Exit Function
    strPaperNames = String(lSize * DC_PAPERNAME_LENGTH + 2, 0)              ' lSize * 24 Characters
    lSize = DeviceCapabilitiesLong(strDevice, strPort, DC_PAPERS, ByVal 0&, ByVal 0&)
    If lSize <= 0 Then GetPrinterPapers = -2: Exit Function
    lSize = DeviceCapabilities(strDevice, strPort, DC_PAPERNAMES, strPaperNames, ByVal 0&)
    ReDim arrPaperNames(lSize - 1)
    For iIndex = 0 To lSize - 1
        'arrPaperNames(iIndex) = AsciiZToString(Mid$(strPaperNames, iIndex * DC_PAPERNAME_LENGTH + 1, DC_PAPERNAME_LENGTH))
        arrPaperNames(iIndex) = Replace(Mid$(strPaperNames, iIndex * DC_PAPERNAME_LENGTH + 1, DC_PAPERNAME_LENGTH), Chr(0), "")
    Next iIndex
    ReDim arrPapers(lSize - 1)                               ' lSize * WORD
    lSize = DeviceCapabilitiesAny(strDevice, strPort, DC_PAPERS, arrPapers(0), ByVal 0&)
    GetPrinterPapers = lSize
'    ' Für Wertliste Comboboxen
'    If Not IsMissing(strPaperList) Then
'        strPaperList = ""
'        For iIndex = 0 To lSize - 1
'            strPaperList = strPaperList & Lit(arrPaperNames(iIndex)) & ";" & arrPapers(iIndex) & ";"
'        Next iIndex
'    End If
End Function


Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
wieder mal ein Nachtrag
07.03.2006 22:52:59
MichaV
Hallo,
das MsgBox: Exit Function in einer Funktion ist natürlich schwachsinnig. Soll nur ein paar Möglichkeiten aufzeigen, die Ihr habt. Das MsgBox sollte da natürlich raus und die Feher irendwie anders im aufrufenden Makro abgefangen werden. Wie die Fehler von Funktion zu Funktion mitgeschleift werden können, seht Ihr ja am Beispiel. Aber da kennt sich Reinhard auch mit aus.
Und ich bin kein Profi ;o)
Gruß- Micha
Respekt, die Lösung ist super!!!
08.03.2006 06:53:07
Oliver
Moin Micha,
danke Dir für Deine Antwort. Sie funktioniert super und hat mich enorm weitergebracht. Nochmal besten Dank an Dich und an auch an Reinhard für Euere Hilfestellung.
Gruß,
Oliver S.
Anzeige
Danke für die Rückmeldung mT
08.03.2006 21:07:03
MichaV
Hallo
wow, bin freudig überrascht. Hätte nicht gedacht, daß es Dir so schon reicht. Fein. Das war doch mal richtiges Teamwork ;o)
Gruß- Micha

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige