Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Excel
  VBA Seiteneinrichtung aktive Blätter drucken

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:   VBA Seiteneinrichtung aktive Blätter drucken (253 mal gelesen)
ArCADe-Spieler
Mitglied
Metallbautechniker


Sehen Sie sich das Profil von ArCADe-Spieler an!   Senden Sie eine Private Message an ArCADe-Spieler  Schreiben Sie einen Gästebucheintrag für ArCADe-Spieler

Beiträge: 172
Registriert: 05.12.2012

Win 10 64bit
Office 365 aber Excel 2013

erstellt am: 11. Mrz. 2020 11:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Gemeinde,

wahrscheinlich stehe ich im Moment - Grippe verursacht - leicht auf dem Schlauch:

Google und Forensuche: "VBA PageSetup/Seiteneinrichtung aktive Blätter drucken" bzw. "Excel Pagesetup IgnorePrintAreas" in mehr und weniger umfangreichen Kombinationen brachte nichts für mich erkennbar zielführendes hervor.

Problem:
In einem VBA-Projekt will ich die Seiteneinrichtung "automatisiert" vornehmen, vor allem, damit der Ausdruck einer von jedem Anwender unterschiedlich erstellten Tabelle sauber auf die Druckseiten aufgeteilt erfolgt und keine Teil-Tabellen oder darin integrierte Abbildungen durch Seitenwechsel zerschnitten werden.

die betreffenden Makro-Code-Schnipsel bis jetzt:

Druckbereichs-Definition (eines von insgesamt ca. 20 Makros im Modul1):

Code:
' Druckbereich definieren

Sub Sub99_Druckbereich_definieren_Klicken()
   
    Dim Ziel, ErsteSeitenzahl, SeitenAnzahlTabelle, ZusatzBlätter As Integer 'Variablen als Ganzzahlen -32768 bis 32767 definieren
    Ziel = Sheets("Beschichtung").Cells(4, 10) 'gespeicherte oder eingetragene aktuelle Einfügezeile von "Beschichtung" holen
    ErsteSeitenzahl = Sheets("Beschichtung").Cells(19, 13) 'Seitenzahl für erstes Blatt der gedruckten Tabelle
    SeitenAnzahlTabelle = Sheets("Beschichtung").Cells(25, 10) 'Anzahl Seiten für bisher erzeugte Tabelle
    ZusatzBlätter = Sheets("Beschichtung").Cells(25, 13) 'Anzahl der zusätzlichen (Stücklisten-)Blätter

    If Ziel > 15 Then 'sicherstellen, dass es schon eine Tabelle zum Drucken gibt
        With Sheets("Beschichtung").PageSetup 'die nächsten Befehle beziehen sich hierauf
            .PrintArea = Sheets("Beschichtung").Range("A15:G" & Ziel - 1).Address 'Druckbereich A15 bis G vor der neuen Einfügezeile definieren
            .CenterHeader = "XXX - Auftrags-Nr.: " & Sheets("Beschichtung").Range("J1") 'mittleren Bereich der Kopfzeile befüllen
            .FirstPageNumber = ErsteSeitenzahl
            .CenterFooter = "&P/" & (ErsteSeitenzahl - 1 + SeitenAnzahlTabelle + ZusatzBlätter) 'mittleren Bereich der Fußzeile befüllen
        End With
    End If

    Range("A" & Ziel + 150).Select 'in die Spalte "A" 150 Zeilen unter der aktuellen Einfügezeile springen, um den scrollbaren Bereich zu "refreshen"
    Range("A" & Ziel).Select 'in die Spalte "A" der aktuellen Einfügezeile springen, damit sie und das untere Ende der Tabelle sichtbar wird

    Range("J7").Select 'in Zelle J7 springen, für sofortige Eingabe der "neuen" Sorten-Anzahl

End Sub


Seiteneinrichtung (im Worksheet "Tabelle1 (Beschichtung)"):

Code:
Sub Worksheet_Change(ByVal Target As Excel.Range)

    If Target.Address = "$J$1" Then
        With Sheets("Beschichtung").PageSetup
            .BlackAndWhite = True
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
            .DifferentFirstPageHeaderFooter = False
            .OddAndEvenPagesHeaderFooter = False
            .Draft = False
            .PrintComments = xlPrintNoComments
            .PrintNotes = False
            .PrintGridlines = False
            .PrintHeadings = False
            .PrintTitleColumns = False
            .PrintTitleRows = False
            .Zoom = 100
            .FitToPagesTall = False
            .FitToPagesWide = False
            .FirstPageNumber = ErsteSeitenzahl
            .CenterHorizontally = False
            .CenterVertically = False
            .LeftMargin = Application.CentimetersToPoints(3.5)
            .RightMargin = Application.CentimetersToPoints(1.5)
            .TopMargin = Application.CentimetersToPoints(1.55)
            .BottomMargin = Application.CentimetersToPoints(1.55)
            .HeaderMargin = Application.CentimetersToPoints(0)
            .FooterMargin = Application.CentimetersToPoints(1)
            .LeftHeader = ""
            .CenterHeader = "XXX - Auftrags-Nr.: " & Sheets("Beschichtung").Range("J1").Text
            .RightHeader = ""
            .LeftFooter = ""
            .RightFooter = ""
        End With
    End If


Der eigentliche Ausdruck wird dann über Strg+P oder einen Linksklick auf die entsprechende Schaltfläche ausgelöst.

Funktionierte soweit auch richtig gut, aaaaber:

um einem der Nutzer ein neu erstelltes Tabellen-Segment inklusive der normalerweise nicht mit gedruckten Eingabefelder rechts außerhalb des im ersten Makro definierten Druckbereichs in Spalte H zu zeigen, hatte ich den entsprechenden Tabellenbereich von Spalte A bis H markiert und in der Druckvorschau nach drücken von Strg+P unter "Einstellungen" händisch von "Aktive Blätter drucken" auf "Auswahl drucken" umgestellt und gedruckt.

Nach einigen Änderungen in diesem Bereich wollte ich einen neuen Probeausdruck der Gesamt-Tabelle machen, habe auch "brav" auf mein Makro-Knöpfchen "Druckbereich definieren" geklickt, aber in der Druckvorschau wurde mir nur die danach aktivierte Zelle J7 angezeigt (zum Glück keine leere, sonst wäre ich wohl nicht so schnell drauf gekommen).

Ich habe dann in der Druckvorschau - wiederum händisch - wieder von "Auswahl drucken" auf "Akrive Blätter drucken" umgestellt ... und wollte diese "Funktion" auch gleich zumindest in das Seiteneinrichtungsmakro integrieren.

Google - wie oben bereits geschrieben - unergiebig, mit dem Makro-Rekorder "fand" ich dann:

Code:
Sub Makro2Drucktest()
'
' Makro2Drucktest Makro
' Drucktest
'

'
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
        IgnorePrintAreas:=False
End Sub


wo sich mir gleich "IgnorePrintAreas:=False" als der wohl wichtige Bereich aufdrängte ;)

Dummer Weise ist dies aber erst beim "wirklich" Drucken herausgekommen, "Makro1Drucktest" nur innerhalb der Seiteneinrichtung ergab bei gleicher Handhabung außer dem Klick auf "Drucken" ein Makro ohne diesen spezifischen Textteil.

Meine Frage:
welche Zeile à la ".IgnorePrintAreas = False" (funktioniert leider NICHT) muss ich in mein Seiteneinrichtungsmakro einfügen, damit eben nicht die Auswahl, sondern der definierte Druckbereich gedruckt wird, ohne dass ich verwunderten Nutzern dabei helfen muss :D

Und noch eine zweite Frage - etwas offtopic - warum funktioniert der ".CenterHeader = "..."...-Bereich einmal mit und einmal ohne ".Text" am Ende ... und funktionieren tun sie beide 

hm, und wo ich mir die Makros gerade noch einmal anschaue, noch eine dritte Frage: woher kennt das Seiteneinrichtungsmakro den Inhalt von "ErsteSeitenzahl"? Bei der Druckbereichdefinition gibt's dafür den DIM-Bereich am Anfang, in dem Worksheet-Makro gibt's den aber (bisher) nicht ... und trotzdem gab's nie eine Fehlermeldung ... nun gut, an jedem der 4 Makros für die Tabellen-Zusammenstellung (jeweils mit DIM-Bereich vorne dran) hängen die folgenden Zeilen ... ist vielleicht daher noch nie akut geworden 

Code:
    With Sheets("Beschichtung")
        .Cells(1, 22) = .Cells(1, 22) + 1 'Schaltflächenbetätigung speichern
        .Cells(2, 22) = Ziel 'neue Einfügezeile speichern
        .Cells(4, 10) = Ziel 'neue Einfügezeile speichern
        SeitenAnzahlTabelle = Sheets("Beschichtung").Cells(25, 10) 'Anzahl Seiten für bisher erzeugte Tabelle
        .Cells(13, 7) = 0 'Gesamtstückzahl zurücksetzen
        .Cells(13, 8) = 0 'Gesamtfläche zurücksetzen
        With .PageSetup
            .PrintArea = Sheets("Beschichtung").Range("A15:G" & Ziel - 1).Address 'Druckbereich A15 bis G vor der neuen Einfügezeile definieren
            .CenterHeader = "XXX - Auftrags-Nr.: " & Sheets("Beschichtung").Range("J1") 'mittleren Bereich der Kopfzeile befüllen
            .FirstPageNumber = ErsteSeitenzahl
            .CenterFooter = "&P/" & (ErsteSeitenzahl - 1 + SeitenAnzahlTabelle + ZusatzBlätter) 'mittleren Bereich der Fußzeile befüllen
        End With
    End With

Danke für Eure Hilfe
Gernot

[Diese Nachricht wurde von ArCADe-Spieler am 11. Mrz. 2020 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ArCADe-Spieler
Mitglied
Metallbautechniker


Sehen Sie sich das Profil von ArCADe-Spieler an!   Senden Sie eine Private Message an ArCADe-Spieler  Schreiben Sie einen Gästebucheintrag für ArCADe-Spieler

Beiträge: 172
Registriert: 05.12.2012

Win 10 64bit
Office 365 aber Excel 2013

erstellt am: 11. Mrz. 2020 17:10    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

hm, ich habe das Seiteneinrichtungsmakro jetzt nach einiger Recherche zwar ein Wenig erweitert:

Code:
Sub Worksheet_Change(ByVal Target As Excel.Range)

    If Target.Address = "$J$1" Then
   
        Dim Ziel, ErsteSeitenzahl As Integer 'Variablen als Ganzzahlen -32768 bis 32767 definieren
        Ziel = ActiveSheet.Cells(4, 10) 'gespeicherte oder eingetragene aktuelle Einfüge-Zeile von "Beschichtung" holen
        ErsteSeitenzahl = ActiveSheet.Cells(19, 13) 'eingetragene erste Seitenzahl von "Beschichtung" holen


        With Sheets("Beschichtung").PageSetup
...
            .PrintArea = "$A$15:$G$" & Ziel - 1
...
            .FirstPageNumber = ErsteSeitenzahl
...
        End With
    End If


aber das behebt das oben beschriebene Problem nicht, dieses hat sich inzwischen sogar noch "vergrößert":

der von mir vorhin "entdeckte" String "IgnorePrintAreas:=False" beseitigt nämlich "nur" das Häkchen bei "Druckbereich ignorieren" in der Druckvorschau unter "Einstellungen", schaltet jedoch nicht von "Auswahl drucken" auf "Aktive Blätter drucken" um, was dieses Häkchen überhaupt erst wirksam (oder eben nicht) werden ließe ... ratlos 

[Diese Nachricht wurde von ArCADe-Spieler am 11. Mrz. 2020 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ArCADe-Spieler
Mitglied
Metallbautechniker


Sehen Sie sich das Profil von ArCADe-Spieler an!   Senden Sie eine Private Message an ArCADe-Spieler  Schreiben Sie einen Gästebucheintrag für ArCADe-Spieler

Beiträge: 172
Registriert: 05.12.2012

Win 10 64bit
Office 365 aber Excel 2013

erstellt am: 12. Mrz. 2020 10:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

ich find's zwar echt geil, dass dieser Thread bei dem Suchbegriff <Excel VBA "Aktive Blätter drucken"> bereits nach einem Tag bei Startpage bzw. Google auftaucht, aber helfen tut's nicht

Nachdem ich mich jetzt nochmal Schritt für Schritt durch jeden Eintrag auf https://docs.microsoft.com/en-us/office/vba/api/excel.pagesetup gearbeitet habe (in der englischen Version um Welten umfangreicher und informativer als in der deutschen), fürchte ich, dass es im Rahmen der Seiteneinrichtung kein passendes Kommando / (Teil-)Befehl gibt ... zu PrintOut finden sich mit "ActiveWindow.SelectedSheets.PrintOut" und "IgnorePrintAreas:=False" zwar genau die beiden gesuchten Funktionen, aber für PageSetup konnte ich nichts dergleichen entdecken.

Da es mir aber eben darum geht, genau diese Voreinstellungen für den durch jeden Benutzer nach eigenem Gutdünken auszulösenden Druck zu hinterlegen, wobei es da jeweils völlig unterschiedlich ist, ob die Tabelle auf Papier (mit ca. 10 verschiedenen Druckern an 3 Standorten) oder als pdf-Datei gedruckt wird, hülfe auch die mir kurz durchs Hirn gezuckte Variante den Druck mittels Makro-hinterlegtem Knöpfchen zu starten nicht weiter.

Wie bereits geschrieben: ratlos

Grüße
Gernot

[Diese Nachricht wurde von ArCADe-Spieler am 12. Mrz. 2020 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



Sehen Sie sich das Profil von KlaK an!   Senden Sie eine Private Message an KlaK  Schreiben Sie einen Gästebucheintrag für KlaK

Beiträge: 2271
Registriert: 02.05.2006

Office 2010; Office365
Visual Basic

erstellt am: 16. Sep. 2020 17:48    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für ArCADe-Spieler 10 Unities + Antwort hilfreich

Hallo Gernot,
Sehe gerade dass der Thread noch nicht gelöst ist.
Hast Du schon eine Lösung gefunden oder sollen wir das noch einmal angehen? Dann müsste ich mich noch einmal intensiver mit Deinem Code und der Aufgabenstellung beschäftigen (ist doch sehr umfangreich).

Was mir beim Durchlesen aber schon mal aufgefallen ist:

Code:

Dim Ziel, ErsteSeitenzahl, SeitenAnzahlTabelle, ZusatzBlätter As Integer 'Variablen als Ganzzahlen -32768 bis 32767 definieren


Damit definierst Du nur Zusatzblätter als Integer, alle anderen Variablen sind vom Typ Variant (siehe Hilfe zur DIM - Anweisung)

Grüße
Klaus  

[Diese Nachricht wurde von KlaK am 08. Okt. 2020 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ArCADe-Spieler
Mitglied
Metallbautechniker


Sehen Sie sich das Profil von ArCADe-Spieler an!   Senden Sie eine Private Message an ArCADe-Spieler  Schreiben Sie einen Gästebucheintrag für ArCADe-Spieler

Beiträge: 172
Registriert: 05.12.2012

Win 10 64bit
Office 365 aber Excel 2013

erstellt am: 08. Okt. 2020 09:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Klaus,

ich hatte schon gar nicht mehr mit einer Reaktion auf meine umständliche Anfrage gerechnet 

Als Erstes: danke für den Hinweis auf das (merkwürdige) Verhalten des DIM-Befehls in VBA ... aus mehreren anderen Basic-"Dialekten", mit denen ich im Lauf der Zeit Kontakt hatte, war ich die Komma-getrennte Auflistung zur gleichzeitigen Dimensionierung aller aufgelisteten Variablen "gewöhnt" und bin daher gar nicht auf den Gedanken gekommen, es könne bei VBA anders sein  ... gemäß Antwort #8 auf dieser Seite und der MS-Hilfeseite dazu (die leider zu den Standardliteraltypen Integer und Long mit falschen Beispielwerten versehen ist  ) habe ich dann die entsprechenden Bereiche "umgestrickt" à la:

Code:
Dim Variante&, Wertezeilen& 'Variablen als Long-Ganzzahlen -2.147.483.648 bis 2.147.483.647 definieren

Da ich kompakten (aber ausführlich kommentierten) Code "mag", habe ich mich gegen die Zeilen-weise Einzeldimensionierung jeder Variable und für die Verwendung der Typzeichen entschieden.

Aus den anderen Basic-Varianten kannte ich zwar die Kürzel-Version von XYZ$ für die Dimensionierung von Strings, für andere Variablen-Typen hatte ich es nie gebraucht. Und es hatte ja auch mit der unvollständigen Dimensionierung funktioniert, aber irgendwann kommt eben immer mal Murphy vorbei und dann ist es gut, alle möglichen Fehlerquellen beseitigt zu haben ... daher auch der Wechsel von Integer auf Long.

Und: Nein, das beschriebene Problem ist bisher nicht gelöst ... ABER: da im "Normalbetrieb" dieser Excel-Tabelle der von mir im ersten Post beschriebene Fall (händische Änderung von "Aktive Blätter drucken" auf "Auswahl drucken") tatsächlich nie vorkommt, wäre die Lösung zwar sicher interessant, für mich und mein Projekt aber den Aufwand eher nicht wert ... mehr so unter dem Aspekt: "ist doch total easy, hab' ich doch schon mal gehabt und eine Lösung in der Schublade" 

Solltest Du natürlich den Ehrgeiz haben, Dich dennoch intensiver damit auseinanderzusetzen: fühle Dich herzlich eingeladen 

Grüße
Gernot

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2020 CAD.de | Impressum | Datenschutz