Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Papierformat autom. durch VBA auswählen lassen?

Forumthread: 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.
Anzeige

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..
Anzeige
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
Anzeige
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.
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
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Papierformat automatisch durch VBA auswählen


Schritt-für-Schritt-Anleitung

Um das richtige Papierformat wie die 114x162 Briefumschläge automatisch auszuwählen, kannst Du den folgenden VBA-Code verwenden. Dieser Code setzt das Papierformat auf C6 und funktioniert in den meisten Excel-Versionen:

Sub SetPaperFormat()
    With Workbooks("Rechnung.xls").Sheets("Briefumschlag")
        .PageSetup.PaperSize = xlPaperEnvelopeC6 ' Setzt das Papierformat auf C6
        .PrintPreview False
    End With
End Sub

Wenn Du ein benutzerdefiniertes Papierformat wie "Brief A5 Excel (114x161mm)" verwenden möchtest, kannst Du den folgenden Code anpassen:

Sub SetCustomPaperFormat()
    Dim paperCode As Integer
    paperCode = PaperCode("DeinDruckerName", "DruckerPort", "Brief A5 Excel") ' Ersetze mit deinem Druckernamen und Port
    If paperCode <> 0 Then
        With Workbooks("Rechnung.xls").Sheets("Briefumschlag")
            .PageSetup.PaperSize = paperCode
            .PrintPreview False
        End With
    Else
        MsgBox "Das benutzerdefinierte Papierformat ist nicht verfügbar."
    End If
End Sub

Häufige Fehler und Lösungen

  1. Laufzeitfehler beim Setzen des Papierformats

    • Überprüfe, ob das Papierformat auf dem Drucker vorhanden ist. Du kannst die Funktion GetPrinterPapers verwenden, um alle verfügbaren Formate aufzulisten.
  2. Unterschiedliche Papierformatnummern auf verschiedenen PCs

    • Verwende die Funktion PaperCode, um die tatsächliche Nummer des benutzerdefinierten Formats zu ermitteln, anstatt hartkodierte Zahlen zu verwenden.
  3. Druckername und Port nicht bekannt

    • Stelle sicher, dass der Druckername und der Port korrekt angegeben sind. Du kannst die Namen der Drucker in Excel unter Datei > Drucken überprüfen.

Alternative Methoden

Wenn VBA nicht funktioniert oder Du eine einfachere Lösung suchst, kannst Du das Papierformat manuell in den Druckeinstellungen von Excel ändern:

  1. Gehe zu Datei > Drucken.
  2. Wähle den gewünschten Drucker aus.
  3. Klicke auf Druckereigenschaften.
  4. Wähle das gewünschte Papierformat aus der Dropdown-Liste aus.

Praktische Beispiele

  1. Briefumschläge 114x162

    • Um einen Briefumschlag für 114x162 mm zu drucken, verwende diesen VBA-Code:
      .PageSetup.PaperSize = xlPaperEnvelopeC6
  2. Brief beschriften A5

    • Wenn Du einen A5-Brief beschriften willst, setze das Papierformat auf A5:
      .PageSetup.PaperSize = xlPaperA5

Tipps für Profis

  • Nutze die VBA-Fehlerbehandlung, um Fehler im Code zu vermeiden:

    On Error Resume Next
    ' Dein VBA Code hier
    On Error GoTo 0
  • Halte Deinen VBA-Code modular, indem Du Funktionen schreibst, die spezifische Aufgaben erledigen, wie zum Beispiel das Abrufen von Druckereinstellungen.

  • Experimentiere mit den DeviceCapabilities API-Funktionen, um detaillierte Informationen über Drucker und Papierformate zu erhalten.


FAQ: Häufige Fragen

1. Wie finde ich das richtige Papierformat für verschiedene Drucker? Du kannst die GetPrinterPapers-Funktion verwenden, um alle verfügbaren Papierformate für einen bestimmten Drucker abzurufen.

2. Was kann ich tun, wenn mein benutzerdefiniertes Papierformat nicht erkannt wird? Stelle sicher, dass der Drucker korrekt konfiguriert ist und dass das Papierformat auf dem Drucker eingestellt ist. Überprüfe auch die Schreibweise des Papierformats im Code.

3. Wo finde ich die Nummern für die Papierformate in Excel? Die Nummern für die Papierformate sind in der Excel-Dokumentation oder im VBA-Editor unter den Konstanten für .PageSetup.PaperSize zu finden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige