Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1092to1096
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
Inhaltsverzeichnis

Syntaxfrage zu printout

Syntaxfrage zu printout
Jörg-HH
Guten Abend an alle
ich möchte beim Durchlauf durch div. Blätter ab einem bestimmten Blatt ("Formular") von allen folgenden einen bestimmten Bereich ausdrucken lassen. Bei "ActiveSheet.printarea.PrintOut" werde ich ausgemeckert - wie muß es denn an der Stelle richtig heißen?
Public Sub CmdBt_InfoblDrucken()
Dim printarea As Range
Set wsConfig = ThisWorkbook.Worksheets("config")
Set wsFormular = ThisWorkbook.Worksheets("Formular") '(hab ich bei opt expl schon deklariert)
bHinterFormular = False
For Each ws In ThisWorkbook.Worksheets
If ws.Name  "Formular" _
And bHinterFormular = True Then
ws.Activate
ActiveSheet.PageSetup.printarea = wsConfig.Range("AM12").Value & ":" & wsConfig. _
Range("AM13").Value
ActiveSheet.printarea.PrintOut
End If
If ws.Name = "Formular" Then
bHinterFormular = True
End If
Next ws
End Sub
Grüße - Jörg

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Syntaxfrage zu printout
13.08.2009 22:19:35
Hajo_Zi
Hallo Jörg,
ws.PageSetup.printarea =
ws.printarea.PrintOut
ws.Activate entfällt.

geht nich... :-((
13.08.2009 22:30:50
Jörg-HH
Hallo Hajo
ws.printarea.PrintOut bringt ne Fehlermeldung
und ws.Activate brauch ich, weil sonst was aus dem Blat gedruckt wird, in dem der button sitzt...
wat nu...? :-((
Grüße - Jörg
AW: geht nich... :-((
14.08.2009 07:22:58
Hajo_Zi
Hallo Jörg,
ws.PrintOut
Excel ist ein vielseitiges Programm und man kann viele Probleme damit lösen. Jede positive Seite hat aber auch negative Aspekte - einer davon ist im Makrorecorder enthalten.
Die Bücher, die es zu Excel VBA gibt, erklären viele Funktionen, aber ich habe bisher nur in einem gelesen, dass der vom Makrorecorder aufgezeichnete Code bereinigt werden sollte.
Der Makrorecorder zeichnet alle Aktionen auf, u. a. auch das Auswählen einer Zelle oder eines eingebetteten Objektes (Bild, Diagramm, Zeichnungsobjekt usw.) dabei wird generell Select und Activate aufgezeichnet. Diese Befehle sind in VBA zu 99,9% nicht notwendig. Sie lassen den Bildschirm flackern und senken die Geschwindigkeit bei der Ausführung des Codes. Man sollte also schon von Beginn an bei der Programmierung darauf achten, solche Befehle zu vermeiden. Meine Erfahrung mit dem Vorsatz: Das mache ich später ist, man schreibt das Programm später meist komplett neu. Also kostest es nicht nur Rechnerzeit sondern auch Deine Zeit und ist Dir Deine Zeit so wenig Wert?
Zum Vergleich mit und ohne Select schau Dir auch mal diese Beispielarbeitsmappe an: mit und ohne select Auf meiner Homepage sind alle meine Beispiele ohne Select. Da kann man sich also einige Lösungsansätze zu diesem Thema ansehen.
Gruß Hajo
Anzeige
AW: geht nich... :-((
14.08.2009 09:19:41
JogyB
Hi.
Zu dem Thema auch noch interessant:
http://de.wikibooks.org/wiki/VBA_in_Excel_-_Grundlagen:_Selection
Stammt weitestgehend von Herber.
Wobei man dem Makrorecorder hier nicht unrecht tun sollte: Er kann nur das aufzeichnen, was der Benutzer tut - und der selektiert und aktiviert nun mal, bevor die Aktion ausgeführt wird. Dass keine automatische Bereinigung durchgeführt wird, ist für mich auch noch verständlich, für den Laien kann (auch nur halbwegs) optimierter Code schnell unübersichtlich werden. Dennoch sollte man sich recht schnell angewöhnen (und beim Level "VBA bescheiden" ist es allerhöchste Zeit), Select und Activate nur dann zu benutzen, wenn es unbedingt notwendig ist - und wie Hajo auch schon schrieb: das ist es sehr sehr selten.
Gruss, Jogy
Anzeige
@ Hajo und Jogy
14.08.2009 10:58:29
Jörg-HH
Guten Morgen, Ihr Zwei
erstmal vielen Dank für die Beispiele! Der Wiki-Artikel zeigt 'ne Menge Nützliches, das ich nicht wußte. Allerdings: daß man sich das Selection meist sparen kann, habe ich in meiner "autodidaktischen Laufbahn" auch schon verinnerlicht.
Im vorliegenden Problem stand da ursprünglich KEIN ws.Activate, und statt Printout stand da Application.Dialogs(xlDialogPrint).Show
Folge: Der Drucker spuckte (bei 1x Klick auf OK im Dialog) 10 leere Seiten aus - nämlich weil ActiveSheet offenbar jenes ist, in dem sich der Button zum Starten des Drucks befindet, und da sind die Zellen leer (warum allerdings zehn Seiten und nicht zwei -so groß wie der Bereich-, ist mir ein Rätsel)
Mit ws.Activate IN der Schleife habe ich doch nur gesagt, daß nicht etwas aus dem aktiven Blatt gedruckt werden soll, sondern aus dem, was beim Schleifendurchlauf vorübergehend zum aktiven gemacht wird. Oder lieg ich da falsch? Jedenfalls bekam ich nach Hinzusetzen von ws.Activate genau die Bereiche gedruckt, die es auch sein sollten, nämlich die in den durchgelaufenen Blättern.
Nun wollte ich, um nicht mehrfach auf den Dialog klicken zu müssen, diesen einfach durch einen Druckbefehl ersetzen, und da hapert's bei mir an der passenden Syntax, um den zu druckenden Bereich korrekt anzusprechen. Im Grunde ist also die Frage: Heißt der Bereich wirklich Printarea, und wenn ja, wie spreche ich ihn an?
Aber da wir gerade dabei sind, hier noch der Rest: Die Blätter heißen Müller, Meier, Schulze sowie frei1, frei2, frei3 usw. Gedruckt werden sollen nur die durch die config beschriebenen Bereiche in jenen Blättern, die anders als frei... heißen.
Meine ForNext-Schleife dazu hab ich offenbar an die falsche Stelle gesetzt - jedenfalls gab's da auch nur Streß. Wo muß die denn stehen? So sieht's bislang aus:
Public Sub CmdBt_InfoblDrucken()
Dim printarea As Range
Set wsConfig = ThisWorkbook.Worksheets("config")
Set wsFormular = ThisWorkbook.Worksheets("Formular")
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
bHinterFormular = False
For Each ws In ThisWorkbook.Worksheets
If ws.Name  "Formular" _
And bHinterFormular = True Then
For i = 1 To 17
If ActiveSheet.Name  ("frei" & i) Then
ws.Activate
ActiveSheet.PageSetup.printarea = wsConfig.Range("AM12").Value & ":" & wsConfig. _
Range("AM13").Value
ws.printarea.PrintOut   '(funktioniert so nicht)
End If
Next i
End If
If ws.Name = "Formular" Then
bHinterFormular = True
End If
Next ws
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Habt ihr 'ne Idee...?
Grüße- Jörg
Anzeige
PS
14.08.2009 11:00:44
Jörg-HH
..übrigens die Deklarationen hab ich oben schon gemacht:
Option Explicit
Dim i As Variant
Dim ws As Worksheet
Dim wsConfig As Worksheet
Dim wsFormular As Worksheet
Dim bHinterFormular As Boolean
PrintArea PrintOut für mehrere Blätter
14.08.2009 10:44:22
Erich
Hi Jörg,
probier mal (ungetestet)

Option Explicit       ' IMMER zu empfehlen
Public Sub CmdBt_InfoblDrucken()
Dim wsConfig As Worksheet, wsFormular As Worksheet, bHinterFormular As Boolean
Dim ws As Worksheet, strPA As String
Set wsConfig = ThisWorkbook.Worksheets("config")
Set wsFormular = ThisWorkbook.Worksheets("Formular") '(bei opt expl schon deklariert)
strPA = wsConfig.Range("AM12").Value & ":" & wsConfig.Range("AM13").Value
For Each ws In ThisWorkbook.Worksheets
If ws.Name = "Formular" Then
bHinterFormular = True
Else
If bHinterFormular Then
ws.PageSetup.PrintArea = strPA
ws.PrintOut
End If
End If
Next ws
End Sub
Die Zeile "Dim printarea As Range" ist überflüssig und schädlich,
PrintArea ist eine in VBA definierte Eigenschaft des PageSetup-Objekts.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: PrintArea PrintOut für mehrere Blätter
14.08.2009 11:13:22
Jörg-HH
Guten Morgen, Erich
dein Vorschlag mit
ws.PageSetup.printarea = strPA
ws.PrintOut
bringt mich weiter! Es werden damit keine leeren Seiten gedruckt, sondern die beangsichitgen Bereiche.
Parallel zu deiner Antwort hatte ich was an Hajo und Jogy geschrieben, wo ich beschrieb, welche Blätter ausgewählt werden sollen. Magste mal 'n Blick drauf werfen?
Danke - Jörg
Bestimmte Blätter ausschließen
14.08.2009 11:44:46
Erich
Hi Jörg,
das würde ich etwa so machen:

Option Explicit       ' IMMER zu empfehlen
Public Sub CmdBt_InfoblDrucken()
Dim wsConfig As Worksheet, wsFormular As Worksheet, bHinterFormular As Boolean
Dim ws As Worksheet, strPA As String
Set wsConfig = ThisWorkbook.Worksheets("config")
Set wsFormular = ThisWorkbook.Worksheets("Formular") '(bei opt expl schon deklariert)
strPA = wsConfig.Range("AM12").Value & ":" & wsConfig.Range("AM13").Value
For Each ws In ThisWorkbook.Worksheets
With ws
If UCase(Left(.Name, 4)) = "FREI" And IsNumeric(Mid(.Name, 4)) Then
' tu nix
ElseIf .Name = "Formular" Then
bHinterFormular = True
Else
If bHinterFormular Then
.PageSetup.PrintArea = strPA
.PrintOut
End If
End If
End With
Next ws
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
druckt alle...
14.08.2009 13:25:39
Jörg-HH
Erich, mit dem Code werden alle frei... Blätter gedruckt
:-((
AW: druckt alle...
14.08.2009 13:33:37
Rudi
Hallo,
... And IsNumeric(Mid(.Name, 5, 99)) Then
Gruß
Rudi
ca marche...! :-))
14.08.2009 14:09:07
Jörg-HH
mit
If Left(.Name, 4) = "frei" And IsNumeric(Mid(.Name, 5, 2)) Then
klappt die Sache!
Danke an euch alle!!
... IsNumeric(Mid(.Name, 5)) - 5 statt 4 - owT
14.08.2009 14:02:23
Erich

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige