Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema CheckBox
BildScreenshot zu CheckBox CheckBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Mit Makro Virtuelle Drucker (PDF) ansteuern

Betrifft: Mit Makro Virtuelle Drucker (PDF) ansteuern von: TomTom
Geschrieben am: 08.07.2008 13:22:37

Hi,

ich habe eine Arbeitsmappe mit mehreren Blättern. Nun will ich die mappe ausdrucken, aber nicht auf Papier, sondern will über einen virtuellen Drucker (Adobe PDF) gehen. kann ich per Makro diesen Drucker ansteuern ?
Einzigste Einschänkung sollte sein, dass das Tabellenblatt "Quelldaten" NICHT mit gedruckt wird, ansonsten die ganze Mappe.

Kann man so was machen ?
Danke mal für Eure Hilfe
TomTom

  

Betrifft: Habe was gefunden für eine Tabelle... von: TomTom
Geschrieben am: 08.07.2008 13:32:32

Hi,

habe beim googeln mal ein Code gefunden, der zumindest 1 Seite nach PDF convertiert. Nun müsste ich nur noch wissen , wie ich die anderen Blätter, ausser das Tabellenblatt "Quelldaten" auswählen kann.

Sheets("Original").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:="Adobe PDF", Collate:=True


Gruss
TomTom


  

Betrifft: AW: Habe was gefunden für eine Tabelle... von: Yusuf
Geschrieben am: 08.07.2008 14:06:01

Hi,

ich wuerde per Schleife ein Blatt nach dem anderen ausdrucken lassen.
Angenommen dein Blatt "Quelldaten" ist an erster Position in deiner Mappe (also ganz links).

Sub Druck

   dim i as integer

   for i = 2 to sheets.count 'i=2 um vom 2. Blatt anzufangen und dadurch "Quelldaten"  _
auszulassen 
         Sheets(i).PrintOut Copies:=1, ActivePrinter:="Adobe PDF", Collate:=True 
   next i

End Sub



Gruß
Yusuf


  

Betrifft: Sorry , ich habe eins nicht bedacht.... von: TomTom
Geschrieben am: 08.07.2008 14:23:54

Hi,
danke. Als ich Dein Code gestestet habe, habe ich gemerkt, ich müsste ja bei meinem Beispiel für jedes einzelne Blatt ein Dateiname angeben. Der Code erstellt das erste Dockument, fragt dach Speicherort und Name, dann macht er das zweite Dokument , fragt wieder nach Speicherort und Name.......

ich habe ein Excelmappe von ca 100 Tabellen.

Wenn möglich, wollte ich alles auf einmal ausgedruckt haben.

das war wohl nicht der richtige Ansatz von mir.


Hat noch jemand eine Idee ?

Gruss
TomTom


  

Betrifft: AW: Sorry , ich habe eins nicht bedacht.... von: Jürgen
Geschrieben am: 08.07.2008 18:49:54

Hallo Yusuf,

Dein Problem ist gelöst, wenn Du den Ausdruck mit einem einzigen Druckbefehl erzeugst. Wenn es das erste Tabellenblatt ist, das Du nicht drucken möchtest, solltet das mit folgendem Code gehen:

Dim n As Integer

Sheets(2).Select
For n = 3 To Sheets.Count
Sheets(n).Select False
Next
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:="Adobe PDF", Collate:=True

Das Makro wählt das erste zu druckende Tabellenblatt (also Nr. 2) und dann in einer Schleife alle folgenden, wobei der auf "false" gesetzte Parameter dafür sorgt, dass die Auswahl erweitert statt ersetzt wird (sonst hättest Du am Ende nur das letzte Tabellenblatt markiert)

Ich hoffe, das hilft Dir weiter.

Gruß, Jürgen


  

Betrifft: Juhu es geht , noch ne Zusatzfrage von: TomTom
Geschrieben am: 09.07.2008 08:53:08

Hallo Jürgen,

vielen Dank, es funktioniert. Hast mir sehr geholfen. :-))

Noch eine Frage dazu (früher oder später müsste ich sie eh stellen)
Kann man den Code auch so umbauen, dass nicht alle Blätter zum virtuellen Drucker geschickt werden , sondern nur eine Auswahl.
Ich stelle mir das so vor:
Meine Excel-Mappe hat nun mehrere Tabellen: einmal das "Deckblatt", einmal eine "Einleitung", einmal "Übersicht", einmal "Prüfung" und viele, viele mit "Vorgänge XX" (XX sind vortlaufende Zahlen)
Auf meiner Userform habe ich 5 Checkboxen eingerichtet, die genau so heissen wie meine Tabellenblätter.

Mein Ziel ist es gewesen, einmal ein PDF GESAMT zu erzeugen, so wie ich es nun habe (Dank Dir) und einmal ein benuzerdeffiniertes PDF, also, dass ich anhand meiner Checkbox wählen kann, welche Blätter mit in das PDF sollen.

Beispiel: Ich klicke "DECKBLATT" an und klicke VORGÄNGE an, dann soll ein PDF erzeugt werden mit dem Deckblatt und mit allen Tabellenblätter , die mit "Vorgänge" beginnen.

Ist so was machbar ?

Danke auf jeden Fall für deine Hilfe bis hierher.

Gruss
Tom


  

Betrifft: AW: Juhu es geht , noch ne Zusatzfrage von: Jürgen
Geschrieben am: 09.07.2008 09:48:32

Hallo Tom,

erst noch mal Entschuldigung, dass ich mich im Namensdickicht verirrt und meinen Beitrag an Yusuf gerichtet habe.

Was Du möchtest sollte sich eigentlich umsetzen lassen. Die Schwierigkeit besteht lediglich darin, dass man als erstes ein Arbeitsblatt selektieren muß ohne den Paramter "Replace" auf "false" zu setzen, damit die aktuelle Selektion nicht (möglicherweise ungewollt) mit einbezogen wird.

Wenn Du also Arbeitsblätter hast, die auf jeden Fall gedruckt werden sollen, selektierst Du sie als erstes und fügst dann die anderen je nach Auswahl des Anwenders hinzu, z.B. mit

If me.checkbox1.value = true then
Sheets("Deckblatt").select false
end if

Wenn es keine Arbeitsblätter gibt, die in jedem Fall gedruckt werden müssen, wird der Code etwas umfangreicher (es sei denn, jemand hat eine bessere Idee). Als Lösung stelle ich mir vor, dass für jede Checkbox geprüft werden muß, ob die vorhergehenden aktiviert waren (also bereits ein erstes Blatt makriert ist) oder nicht. Der Code könnte so aussehen:

If Me.Checkbox1.value = true then
Sheets("Deckblatt").select
end if

If Me.checkbox2.value = true then
Sheets("Einleitung").select not Me.Checkbox1.value
end if

If Me.checkbox3.value = true then
Sheets("Übersicht").select not (Me.Checkbox1.value or Me.Checkbox2.value)
end if

usw. ...

Zur Erläuterung: wenn die Erste oder die zweite Checkbox oder beide aktiviert waren, ergibt "(Me.Checkbox1.value or Me.Checkbox2.value)" true - dann wurde schon ein Blatt selektiert, dann muß Select mit false aufgerufen werden, was Du mit der Negation durch "Not" erreichst.

Aber Achtung: wenn keine Checkbox markiert ist, würde das aktuelle Arbeitsblatt ausgedruckt, denn das ist ja markiert. Denkbar wäre eine Abfrage wie

If (me.checkbox1.value and me.checkbox2.value and #alle weiteren Checkboxen#) = false then
msgbox "Keine Arbeitsblätter für den Ausdruck markiert!"
else
#Druckbefehl#
end if

Gruß, Jürgen


  

Betrifft: AW: Juhu es geht , noch ne Zusatzfrage von: TomTom
Geschrieben am: 09.07.2008 17:39:29

Hallo Jürgen,

ist ehrlich gesagt ein bisschen verwirrend für mich, bin noch ein blutiger Anfänger :-(
Kann nicht behaupten, dass ich das jetzt alles verstanden habe, sorry
Du hast nicht zufällig ein kleines excel Beispiel parat ?
An einer Excelmappe wird mir das glaube ich klarer.

Gruss
Tom


  

Betrifft: AW: Juhu es geht , noch ne Zusatzfrage von: Jürgen
Geschrieben am: 09.07.2008 18:49:57

Hallo Tom,

nun, eine Beispiellösung für Deinen speziellen Anwendungsfall habe ich gerade nicht zufällig in der Tasche...

Wenn Du die Userform und die Checkboxen schon hast, dann zeigt mein vorheriger Beitrag, wie Dein Code aussehen könnte (abgehesen davon, dass ich überlesen hatte, dass Deine Checkboxen schon so heißen wie die Tabellenblätter - die Namen mußt Du dann anpassen).

Viel mehr als den vorher dargestellten Code würdest Du auch in einer konkreten Excelmappe nicht sehen. Hast Du denn mal versucht, den Code in Deine Lösung einzubauen?

Gruß, Jürgen


  

Betrifft: AW: Juhu es geht , noch ne Zusatzfrage von: TomTom
Geschrieben am: 10.07.2008 08:39:03

Hallo Jürgen,

sorry, ich habe mich falsch ausgedrückt, ich hatte vergessen was zu erwähnen: also im Prinzip funktioniert es, nur meine leztze Checkbox macht mir noch Probleme, die sieht so aus:

If Me.CheckBox6.Value = True Then
Sheets("Vorgang YX").Select Not (Me.CheckBox1.Value Or Me.CheckBox2.Value Or Me.CheckBox3.Value Or Me.CheckBox4.Value Or Me.CheckBox5.Value)
End If

Beachte bitte den Name des Sheets ("Vorgang YX").

Ich habe in meiner Mappe am Schluss ein paar Tabellenblätter, die werden beim Start des Makros angelegt und heisen zB. Vorgang 01, Vorgang 02, ....

Sind also durchnummerriert und können in der Anzahl unterschiedlich variieren. Ich habe jetzt also keinen festen Namen mehr.

Darum die Frage: wie Prüfe ich bei : Sheets("Vorgang YX").Select Not ..... nur die ersten 7 Zeichen ab, also alles was mit "VORGANG" beginnt. (unabhängig, welche zahl dahinter steht.

Danke und Gruss
Tom


  

Betrifft: AW: Juhu es geht , noch ne Zusatzfrage von: Jürgen
Geschrieben am: 10.07.2008 09:49:27

Hallo Tom,

dafür hast Du zwei Möglichkeiten:

wenn Du weißt, welches Dein erstes Blatt "Vorgang xy" ist und bist sicher, dass von diesem bis zum letzten Blatt nur solche vom Typ "Vorgang XY" sind :

Dim n as integer
...
If Me.CheckBox6.Value = True Then
'Das erste markieren und dafür sorgen, dass es ggfs. das einzige ist (falls nur die Vorgänge drucken)
Sheets(5).Select Not (Me.CheckBox1.Value Or Me.CheckBox2.Value Or Me.CheckBox3.Value Or Me.CheckBox5.Value)
'die restlichen hinzufügen
For n = 6 to Sheets.count
Sheets(n).Select false
next
End If



wenn die obigen Bedingungen nicht erfüllt sind, aber alle relevanten Blätter über ihren Namen indentifiziert werden können, geht die folgende Lösung:


Dim Blatt as worksheet
...
'Dafür sorgen, dass irgendein Vorgangsblatt markiert wird, falls nur Vorgänge gedruckt werden sollen
Sheets("Vorgang 01").select Not (Me.CheckBox1.Value Or Me.CheckBox2.Value Or Me.CheckBox3.Value Or Me.CheckBox4.Value Or Me.CheckBox5.Value)

'Alle Blätter nach solchen durchsuchen, deren Namen mit "Vorgang" beginnt, und ebenfalls markieren
For each Blatt in Sheets
If Left(Blatt.Name, 7") = "Vorgang" then
blatt.select false
end if
next


Falls das ganze groß-/kleinschreibungstolerant sein soll:
If UCase(Blatt.Name, 7") = "VORGANG" then


Gruß, Jürgen


  

Betrifft: Klappt alles perfekt..... von: TomTom
Geschrieben am: 10.07.2008 10:38:01

Hallo Jürgen,

vielen, vielen Dank. klappt alles spitze.
Hoffe, ich kann Dich nun in Ruhe lassen :-)


Gruss Tom


  

Betrifft: AW: Habe was gefunden für eine Tabelle... von: Yusuf
Geschrieben am: 08.07.2008 14:32:30

Hi,

ungetestet:

Sub Druck()
 
    dim i as integer

    Application.DisplayAlerts = False 'schaltet Dialoge ab

    for i = 2 to sheets.count 'i=2 um vom 2. Blatt anzufangen und dadurch "Quelldaten"  _
auszulassen 
          Sheets(i).PrintOut Copies:=1, ActivePrinter:="Adobe PDF", Collate:=True 
    next i

    Application.DisplayAlerts = true 'schaltet Dialoge ein

End Sub




  

Betrifft: der Effekt ist immer noch der selbe ..... von: TomTom
Geschrieben am: 08.07.2008 14:39:12

..
hi,

habe den Code getestet, aber der legt weiterhin für jedes einzelne Blatt ein Dokument an und kein Gesamt-Dokument.

Gruss
TomTom


  

Betrifft: Hmm, sry. bin am ende mit meinem Latein von: Yusuf
Geschrieben am: 08.07.2008 14:43:13

So laesst sich glaub ich die komplette Mappe ausdruecken incl. "Quelldaten"

ungetestet.

ActiveWindow.PrintOut Copies:=1, ActivePrinter:="Adobe PDF", Collate:=True
oder
ActiveWindow.Sheets.PrintOut Copies:=1, ActivePrinter:="Adobe PDF", Collate:=True

Gruß
Yusuf


  

Betrifft: Sorry, ich auch. geht leider auch nicht... von: TomTom
Geschrieben am: 08.07.2008 15:42:36

..
ich glaub, ich lass das ganze jetzt und machs wieder manuell, Schade.
Trotzdem danke

TomTom


  

Betrifft: AW: Habe was gefunden für eine Tabelle... von: noffi
Geschrieben am: 08.07.2008 14:49:44

Hi TomTom,

mach es Dir nicht so schwer.

Erstelle Dir eine neue Excelmappe. Kopiere dort die benötigten Tabellen hinein. Dann kannst Du die Hilfsmappe mit dem PDF-Drucker drucken.

Gruß
noffi


  

Betrifft: AW: Habe was gefunden für eine Tabelle... von: TomTom
Geschrieben am: 08.07.2008 15:19:07

Hi noffi,

und wie kopiere ich 100 Tabellenblätter per Code in eine neue Tabelle ?

TomTom


 

Beiträge aus den Excel-Beispielen zum Thema "Mit Makro Virtuelle Drucker (PDF) ansteuern"