Autor
|
Thema: VBA Seiteneinrichtung aktive Blätter drucken (1835 / mal gelesen)
|
ArCADe-Spieler Mitglied Metallbautechniker
Beiträge: 251 Registriert: 05.12.2012 Win 10 64bit Office 365 aber Excel 2013
|
erstellt am: 11. Mrz. 2020 11:38 <-- editieren / zitieren --> Unities abgeben:
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 definierenSub 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
Beiträge: 251 Registriert: 05.12.2012 Win 10 64bit Office 365 aber Excel 2013
|
erstellt am: 11. Mrz. 2020 17:10 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 251 Registriert: 05.12.2012 Win 10 64bit Office 365 aber Excel 2013
|
erstellt am: 12. Mrz. 2020 10:41 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 2624 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 16. Sep. 2020 17:48 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
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
Beiträge: 251 Registriert: 05.12.2012 Win 10 64bit Office 365 aber Excel 2013
|
erstellt am: 08. Okt. 2020 09:33 <-- editieren / zitieren --> Unities abgeben:
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 |
ArCADe-Spieler Mitglied Metallbautechniker
Beiträge: 251 Registriert: 05.12.2012 Win 10 64bit Office 365 aber Excel 2013
|
erstellt am: 01. Dez. 2021 11:06 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, auch wenn schon eine Weile her, muss/will ich noch eine zweite Antwort auf Deinen Post senden: ich hatte Deine Aussage Zitat: Original erstellt von KlaK: Damit definierst Du nur Zusatzblätter als Integer, alle anderen Variablen sind vom Typ Variant (siehe Hilfe zur DIM - Anweisung)
damals "unkontrolliert" geglaubt und meine Programmierung entsprechend umgeschrieben (wobei ich dann "nebenbei" über die Variablentyp-Kurzzeichen gestolpert bin, also trotzdem was gelernt). Allerdings habe ich mir nun für ein anderes Projekt die DIM-Funktion wieder einmal näher anschauen müssen und bin sowohl in der Online-Hilfe zu Excel (Online-Hilfe aus Excel heraus) als auch mit dem Suchbegriff "Excel VBA DIM" auf Startpage.com unter dem ersten Link (Dim-Anweisung - Visual Basic | Microsoft Docs) eines Besseren belehrt worden: man kann in VBA (inzwischen? wieder?) innerhalb einer DIM-Anweisung mehrere Variablen als Komma-getrennte Liste aufzählen ... DIM abc, def AS INTEGER oder sogar DIM abc, def AS INTEGER, ghi AS SINGLE, jkl, mno AS DOUBLE 'in einer Anweisung! Wie meine Klammer-Bemerkung andeutet, weiß ich allerdings nicht, ob dies zum Zeitpunkt Deines Posts auch so war, oder erst nachträglich umgesetzt wurde. Grüße Gernot
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
Beiträge: 2624 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 01. Dez. 2021 13:14 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
Hallo Gernot, Hier schaut es tatsächlich so aus als gäbe es Unterschiede zwischen VBA und VB. VBA:
Code: ' Multiple declarations on a single line. AnotherVar is of type Variant ' because its type is omitted. Dim AnotherVar, Choice As Boolean, BirthDate As Date
VB Code: Dim a, b, c As Single, x, y As Double, i As Integer ' a, b, and c are all Single; x and y are both Double
Gerade noch mal im Excel 365 VBA überprüft (siehe Screenshot)
Code: Dim a, b, c As Integer
a und b sind Variant und erhalten durch die Zuweisung der Zahl den Typ Integer c ist generell Integer Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ArCADe-Spieler Mitglied Metallbautechniker
Beiträge: 251 Registriert: 05.12.2012 Win 10 64bit Office 365 aber Excel 2013
|
erstellt am: 20. Dez. 2021 10:54 <-- editieren / zitieren --> Unities abgeben:
Moin Klaus, hach verdammt: irgendwie hatte ich mich zwar schon über mal "VB/Visual Basic" und mal "VBA" ein Wenig gewundert, war aber bisher tatsächlich der Meinung, dass dabei von der selben Sache die Rede wäre bzw. es dasselbe wäre ... und ich glaubte - trotz meiner (nicht so wirklich erkannten) völlig unterschiedlichen Hilfen zu den beiden Versionen des DIM-Befehls - in Excel mit der VB-Version der DIM-Funktion unterwegs zu sein, da ich den Link Dim-Anweisung - Visual Basic | Microsoft Docs (wie oben beschrieben) mittels der Suche nach "Excel VBA DIM" gefunden hatte ... böse Fehlleitung ... und mangelhafte Leseleistung meinerseits Also "all meine DIM-Anweisungen" noch einmal umschreiben ... grmbl. Grüße für ein Frohes Fest und einen Guten Rutsch/erfolgreichen Start ins Neue Jahr Gernot ... oder doch nicht noch einmal umschreiben, da ich diese ja mittels der damals neu entdeckten Variablentyp-Kurzzeichen gestrickt hatte und somit bereits jede Variable eindeutig bestimmt ist ... à la: Dim Text$, Anzahl1&, Anzahl2&, Fläche# ... hatte ich aber schon wieder vergessen [Diese Nachricht wurde von ArCADe-Spieler am 20. Dez. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|