Informationen und Beispiele zum Thema MsgBox | |
---|---|
![]() |
MsgBox-Seite mit Beispielarbeitsmappe aufrufen |
Betrifft: Tabellenblätter drucken mit Inhaltsverzeichnis
von: Heinz
Geschrieben am: 22.01.2010 17:36:20
Hallo!
Meine Arbeitsmappen haben ca. 100 Tabellenblätter. Mittels eines Addin werden im vordersten Tabellenblatt "Inhaltsverzeichnis" von A3 bis A102 (ggf ff) die Tabellennamen aufgelistet.
Franz (fcs) hat mir ein hervorragend funkionierendes Makro (mein erstes hier) zum Löschen von Zeilen des Inhaltsverzeichnises und der zugehörigen Tabellenblätter geschrieben (Zeile oder Zelle in der Zeile markieren - Makrobutton - msg-box - ja- Zeile(n) und Bla(e)tt(er) gelöscht - Super.
Nach Entfernen der Zeilenlöschfunktion und ersetzen von delete durch printout (eigene Versuche) funktioniert das Makro erstaunlicherweise genauso gut zum Drucken der so ausgewählten Blätter.
In manchen Fällen würde ich mir gerne die Druckauswahl speichern (z. B. zum wiederholten Drucken)
Mein Fragen/Bitten wären deshalb Folgende:
a) Was muss ich bitte in dem unten folgenden Makro ändern, damit die Tabellenblätter gedruckt werden, die ich hinter den jeweiligen Blattnamen in Spalte A in Spalte B mit einem x kennzeichne?
b) Wie kann ich bitte dazu einen bestimmten Drucker (FreePDF-Multidoc) anstelle des Standarddruckers vorgeben?
Sub BlaetterDrucken_mit_Inhaltsverzeichnis_H2() 'Die folgende Prozedur kannst Du z.B. per Buttonklick starten, 'nachdem Du die zu druckenden Zeilen markiert hast. 'Die Markierungen kannst Du auch in Spalte B machen. 'Du kannst Blöcke selektieren oder auch mehrere einzelne Zeilen '(bei gedrückter Strg-Taste). Dim rngSelektion As Range, Zeile As Range, lNr As Long, _ strBlatt As String, arrZeilen() As Long, arrBlatt() As String lNr = 0 If MsgBox("Blätter in markierten Zeilen Drucken?", vbQuestion + vbYesNo, _ "Blätter Drucken") = vbYes Then 'Daten der zu druckenden Blätter einlesen Set rngSelektion = Selection For Each Zeile In rngSelektion.Rows If Zeile.Row >= 3 And _ fncCheckSheet(ActiveWorkbook, Worksheets(1).Cells(Zeile.Row, 1).Text) = True Then lNr = lNr + 1 ReDim Preserve arrZeilen(1 To lNr) ReDim Preserve arrBlatt(1 To lNr) arrZeilen(lNr) = Zeile.Row arrBlatt(lNr) = Worksheets(1).Cells(Zeile.Row, 1) Else 'Blatt mit Name in Spalte A ist nicht vorhanden Worksheets(1).Cells(Zeile.Row, 2) = "Blatt nicht vorhanden" End If Next If lNr > 0 Then Application.ScreenUpdating = False 'Blätter drucken Application.DisplayAlerts = False ActiveWorkbook.Sheets(arrBlatt).PrintOut Application.DisplayAlerts = True Application.ScreenUpdating = True End If End If End Sub
Function fncCheckSheet(wb As Workbook, varBlatt) As Boolean 'Prüft ob Blatt in Arbeitsmappe vorhanden Dim objSheet As Object For Each objSheet In wb.Sheets If objSheet.Index = varBlatt Or LCase(objSheet.Name) = LCase(varBlatt) Then fncCheckSheet = True Exit For End If Next End Function
Betrifft: AW: Tabellenblätter drucken mit Inhaltsverzeichnis
von: fcs
Geschrieben am: 24.01.2010 04:12:32
Hallo Heinz,
es ist nicht so erstaunlich, dass die Prozedur für's Löschen und Drucken mit marginalen Anpassungen funktioniert. So wie man einzelne Tabellenblätter löschen und drucken kann
Sheets("Tabelle1") .Printout
Sheets("Tabelle1") .Delete
so kann man eben auch mehrere in einem Array angegeben Blätter auf einen Rutsch drucken oder auch löschen.
Ich hab deine Prozedur mal angepasst, so dass Blätter in mit "x" markierten Zeilen gedruckt werden.
Die genaue Bezeichnung von deinem Drucker muss du noch anpassen.
Die kleine Function bleibt unverändert. Die brauchst du auch nur einmal in deinem VBA-Projekt der Datei in einem allgemeinen Modul anzulegen.
Gruß
Franz
Sub BlaetterDrucken_mit_Inhaltsverzeichnis_H2_neu() 'Die folgende Prozedur kannst Du z.B. per Buttonklick starten, 'die Blätter der in Spalte B mit "x" markierten Blätter werden gedruckt. Dim wks As Worksheet, Zeile As Long, lNr As Long, _ strDrucker As String, arrZeilen() As Long, arrBlatt() As String lNr = 0 If MsgBox("Blätter in mit ""x"" markierten Zeilen Drucken?", vbQuestion + vbYesNo, _ "Blätter Drucken") = vbYes Then 'Daten der zu druckenden Blätter einlesen Set wks = Worksheets(1) ' = Worksheets("Inhalt") With wks For Zeile = 3 To .Cells(.Rows.Count, 2).End(xlUp).Row If LCase(.Cells(Zeile, 2)) = "x" And _ fncCheckSheet(ActiveWorkbook, Worksheets(1).Cells(Zeile, 1).Text) = True Then lNr = lNr + 1 ReDim Preserve arrZeilen(1 To lNr) ReDim Preserve arrBlatt(1 To lNr) arrZeilen(lNr) = Zeile arrBlatt(lNr) = Worksheets(1).Cells(Zeile, 1) Else 'Blatt mit Name in Spalte A ist nicht vorhanden Worksheets(1).Cells(Zeile, 2) = "Blatt nicht vorhanden" End If Next End With If lNr > 0 Then Application.ScreenUpdating = False 'Blätter drucken strDrucker = Application.ActivePrinter 'aktiven Drucker merken 'anderen Drucker wählen aktivieren - Name ggf. mit Makrorekorder aufzeichnen Application.ActivePrinter = "FreePDF auf Ne08:" Application.DisplayAlerts = False ' ActiveWorkbook.Sheets(arrBlatt).PrintPreview ActiveWorkbook.Sheets(arrBlatt).PrintOut Application.DisplayAlerts = True Application.ActivePrinter = strDrucker 'gemerkten Drucker wieder aktivieren Application.ScreenUpdating = True End If End If End Sub
Betrifft: AW: Tabellenblätter drucken mit Inhaltsverzeichnis
von: Heinz
Geschrieben am: 24.01.2010 10:04:11
Hallo Franz
Auch diese Variante funktioniert einwandfrei. Damit kann ich jetzt wunschgemäß und schnell meine Tabellenblätter drucken und/oder löschen wie ich nur will. Ich darf garnicht daran denken, daß ich diese Prozeduren seit Jahren täglich mehrmals händisch in Einzelschritten durchgeführt habe.
Ich habe mich vor Jahren zwar mal in einem VHS-Kurs mit der Makro-Programmierung angelegt, habe dann dann aber doch vor dieser Makromier-Sprache kapituliert - wohlwissend, daß - von Dir eindrucksvoll bewiesen - faszinierte Möglichkeiten bestehen.
Ich bedanke mich wirklich ganz herzlich für die zwei von Dir geschaffenen Lösungsvarianten.
Mit freundlichen Grüßen
Heinz