Excel nur Arbeitsblätter drucken mit "Zahl" in bestimmter Zelle

ika2k

Lieutenant
Registriert
Juni 2010
Beiträge
691
Hallo zusammen,

ich bin eigentlich ganz fit in Excel aber hier stoße ich an meine Grenzen, ich habe eine Arbeitsmappe mit ~2500 Blättern (Datenbank kommt leider nicht in Frage) und in einer bestimmten Zelle, nennen wir sie mal "B3" steht eine Zahl >0 oder "n.M.". Jetzt möchte ich alle Arbeitsblätter drucken in denen an dieser Stelle besagte Zahl steht.

Jedes Arbeitsblatt händisch zu markieren wäre natürlich utopisch und alles drucken und dann auszusortieren ist auch nicht im Sinne des Erfinders. Leider sind meine Macrofähigkeiten auf "Macro aufzeichnen", kleinere Anpassungen oder Umsetzung von Google Ergebnissen beschränkt :(

Von Hand zusammengeklickt sähe das so aus:

Code:
Sub relevantes_drucken()
' relevantes_drucken Makro
'
    Sheets(Array("0001", "0002", "0003")).Select
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
        IgnorePrintAreas:=False
End Sub

Dabei fehlt natürlich statt Zeile 4 die Funktion "Auswahl aller Arbeitsblätter" bei denen "B3 = Zahl" oder alternativ "B3 <> "n.M."" und da hört mein Verständnis leider auf, da ich mich in der Syntax nur sehr begrenzt auskenne. Es würde bereits reichen besagte Arbetisblätter zu markieren, die Print funktion kann ich dann natürlich händisch durchführen.

Hat da jemand eine Idee oder wonach ich explizit suchen muss? Wenn ich danach suche, ist meist das Problem, dass die Leute keine Blätter mit STRG markieren können.

Dank und Gruß
ika
 
Code:
Sub relevantes_drucken()
Dim Counter as Long, DasArray() as Long, aCounter as Long
Const Feld as String = "B3", FalschWert as String = "n.M."

ReDim DasArray(Sheets.Count)
aCounter = 1

For Counter = 1 to Sheets.Count
If Sheets(Counter).Range(Feld).Value <> FalschWert Then
DasArray(aCounter) = Counter
aCounter = aCounter + 1
End If
Next

'[...] Ab hier dann einfach die Blätter selecten oder direkt drucken...'
End Sub
 
Danke, leider tut das Makro bei mir nichts, läuft ohne Beanstandung durch aber markiert keine Blätter und wenn ich dann auch wenn ich "Auswahl drucken" mache scheint im Hintergrund nichts passiert zu sein.

Leider begreife ich auch nicht genau was das tool macht, wo ist denn der Part, welcher die Blätter unter auslassen des "FalschWert" markieren sollte?
 
leider tut das Makro bei mir nichts
Liegt auch daran, dass Rome1981 den Auswahlteil weggelassen hat. Ist auch ein kleines bisschen tricky, zum Auswählen der Blätter darf kein Array verwendet werden, in dem noch leere Einträge sind.
Alternativ kann man natürlich auch direkt in der Schleife das Drucken anstoßen, aber dann käme halt jeder Druckauftrag extra.

Mit ein paar Anpassungen zu Romes Code sollte es aber klappen:
Code:
Sub relevantes_drucken()
Dim Counter As Long, DasArray() As Long, aCounter As Long
Const Feld As String = "B3", FalschWert As String = "n.M."

aCounter = 0
 
For Counter = 1 To Sheets.Count
  If Sheets(Counter).Range(Feld).Value <> FalschWert Then
    aCounter = aCounter + 1
    ReDim Preserve DasArray(1 To aCounter)  'das Array darf nachher nicht mehr Einträge haben, als tatsächlich gebraucht werden, daher in der Schleife reallokieren
    DasArray(aCounter) = Counter
  End If
Next
 
Sheets(DasArray).Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

End Sub
 
Das ist irgendwie lustig.
Ich kapiere wie die Blattnamen zusammengesammelt werden, aber dass ein Sheets-Select auf ein Array reagiert sehe ich in keiner Syntax bzw. der Hilfe. Versuche, so ein Array einzeln mit z.B. Komma getrennt hinzuschreiben Sheets(1,3,5,6).select, klappen nicht. Was läuft denn da unter der Motorhaube ab?

Google lieferte diesen Thread bei den Kollegen. Das Argument weiter unten, dass es ein einzelner Print-Job sein mag, ist durchaus gewichtig. Andererseits ist die Logik jedes getroffene Blatt sofort zu drucken auch nicht zu verachten.

CN8
 
cumulonimbus8 schrieb:
Das ist irgendwie lustig...Versuche, so ein Array einzeln mit z.B. Komma getrennt hinzuschreiben Sheets(1,3,5,6).select, klappen nicht. Was läuft denn da unter der Motorhaube ab?

Unter der Motorhaube fehlt bei dir der Zündfunke :evillol:. Also, die typische Syntax lautet ja:
Code:
Sheets(1).select

Also, das Argument (Blattindex) steht so wie so in einem Klammerpaar. Wie soll VBA begreifen, dass da ein Array statt eines (erwarteten Einzelarguments) folgt? Ich denke mal, dass ich Excel das sagen muss:
Code:
Sheets(Array(1, 3, 4, 7)).Select

und dann klappt es auch mit dem nachbarn ;).
 
Du hast meine Frage ganz präzise nicht beantwortet :D

Die obere Syntax ist die die die Hilfe präsentiert. Warum aber kann 1. da überhaupt ein Array drinstehen (dürfen) und nach 2. welcher Syntaxlogik wird dessen Inhalt (in Form einer Liste; Aufzählung) verarbeitet? Eine CSV-Liste jedenfalls scheint das Klammerpaar nicht zu verdauen.

CN8
 
@simpsonsfan
Perfekt, so funktioniert es perfekt!

wenn ich jetzt eine zweite Bedingung einfügen möchte, z.B. wenn in B3 "-" seht soll es auch nicht gewertet werden, habe ich das so versucht, dass ich eine weitere Variable (Zeile 3) festgelegt habe, und eine oder Verknüpfung im Schleifenkopf (Zeile 8) hinzugefügt habe, irgendwas passt aber dann (an meinem Code) nicht :(

Code:
Sub relevantes_drucken()
Dim Counter As Long, DasArray() As Long, aCounter As Long
Const Feld As String = "B3", FalschWert As String = "n.M.", FalschWert2 As String = "-"
 
aCounter = 0
 
For Counter = 1 To Sheets.Count
  If Sheets(Counter).Range(Feld).Value <> FalschWert Or Sheets(Counter).Range(Feld).Value <> FalschWert2 Then
    aCounter = aCounter + 1
    ReDim Preserve DasArray(1 To aCounter)  'das Array darf nachher nicht mehr Einträge haben, als tatsächlich gebraucht werden, daher in der Schleife reallokieren
    DasArray(aCounter) = Counter
  End If
Next
 
Sheets(DasArray).Select
'ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
 
End Sub

kann das so klappen oder muss ich die Bedingungen dann vielleicht auch in ein Array packen?

Habe gerade nochmal experimentiert (auch wenen ich es nicht verstehe) wenn ich als Operator nicht "Or" sondern "And" benutze klappt es, aber ich ging immer davon aus, dass mit "And" beide Bedinungen erfüllt sein müssten oder habe ich da einen Denkfehler?
 
Zuletzt bearbeitet:
Hallo ,

denke deine Vergleiche noch mal durch. Deine Bedingung wird immer true sein, da alles entweder "nicht A" oder "nicht B" ist, sonst müsste der Wert ja "A und B gleichzeitig" sein, was nicht geht.
UND stimmt heir schon als Bedingung, immer wenn es "nicht A" und auch "nicht B" ist, soll der IF-Satz ausgeführt werden.
Natürlich könntest du das Ganze auch rumdrehen und immer dann, wenn eine Bedingung erfüllt ist (im Gegensatz zu wenn eine Bedingung nicht erfüllt ist) drucken.
 
Ach klar, typischer Fall von Denkfehler ;)

Danke vielmals!
 
Zurück
Oben