Clever-Excel-Forum

Normale Version: VBA PDF per Button-Klick
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo @all,

hier nun die zweite Herausforderung:

folgender Code speichert die ExcelTab. im PDF-Format:
Code:
Private Sub CommandButton1_Click()
ChDir "C:\Users\*****\Desktop\test" 'anpassen 'oder thisworkbook.path
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        Range("D22").Value & Format(Date, "_DD_MM_YYYY") & ".pdf", Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        False
End Sub
Das klappt auch soweit ganz gut, ABER wenn nun nicht alle Zellen in meiner Tabelle gefüllt wurden, wird trotzdem das komplette Dokument gespeichert.
Bsp: Das Dokument umfasst 4 Seiten. Seite 1 und 2 umfassen grundlegende Daten die immer ausgefüllt werden müssen. Seite 3 und 4 sind für Fotos gedacht. Das ist sehr unterschiedlich. Wenn auf Seite 1-3 was eingetragen wurde, soll 4 NICHT mit abgespeichert werden. Wie geht das? Hinweis: In der Userform beziehen sich div Buttons auf alle 4 Seiten des Dokuments...
Ich hoffe Ihr versteht was ich meine. Wenn nicht, setze ich mich am WE ran und bastel eine Bsp-Datei...


Besten Dank.... Blush
Hallo, 19

es gibt für "ExportAsFixedFormat" noch weitere Parameter. Für dich interessant - "From" und "To". Also von Seite bis Seite. Prüfe, ob auf Seite 3 und 4 etwas eingetragen ist/wird und ändere die Parameter entsprechend. 21

Wenn du das nicht alleine hinbekommst, lade ein aussagekräftiges Beispiel hoch - dann schauen wir weiter. Dodgy
Hallo Case,

da werde ich Dir dann mal wohl eine Bsp-Datei zu Verfügung stellen müssen... Das kriege ich so nicht hin... 20  Ich hoffe ich schaff das zu morgen. Vielen Dank 19
Guten Morgen Case,
ich hatte es leider nicht geschafft am WE die Bsp.Tabelle fertig zu machen. Nun aber isse im Anhang.
Bin gespannt wie der Code aussieht. Hab echt kein Plan... Huh Die "Bilder Hochladen Button" habe ich jetzt nicht alle gelöscht. Nur die Codes in der Userform habe ich bis auf 9 Bilder (je 1x hoch und quer) reduziert. Schlussendlich werden es dann aber 20 Bilder sein die man hochladen kann.
Kleiner Zusatz: ich hatte ja den Löschen-Button-Code geändert. So wie Du es ja geschrieben hattest, löscht der ALLE Bilder im Dokument. Gibt es eine Möglichkeit, dass aber das Smily-Bild bleibt?
Vielen Dank schon mal .... 19
Hallo, 19

also, wenn du das Logo behalten möchtest, gibt es zwei Wege: 21

Entweder du löscht die Bilder über eine Schleife und gibst die Bedingung vor, dass nur alle Bilder Zeile größer 6 gelöscht werden:

Code:
Dim picBild As Picture
For Each picBild In ActiveSheet.Pictures
    If picBild.TopLeftCell.Row > 6 Then picBild.Delete
Next picBild

Oder du gruppierst das Logo mit z.B. dem Button. Dann kannst du weiterhin mit dem Einzeiler arbeiten und es wird trotzdem nicht gelöscht, denn eine Gruppe ist für Excel etwas anderes, als ein einzelnes Picture.

Für das PDF sieht der Code prinzipiell so aus: 21

Code:
'ExportAsFixedFormat (Type, FileName, Quality, IncludeDocProperties, IgnorePrintAreas, From, To, OpenAfterPublish, FixedFormatExtClassPtr)
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", "3", 0

Hier nutze ich die Konstanten, statt der Bezeichnungen. "1", "3" bedeutet eben von Seite 1 bis Seite 3. 0 ist False und -1 ist True.

Du musst jetzt eben eine Zelle, die per Code gefüllt wird, auf der entsprechenden Seite prüfen und die angeben:

Code:
Dim strTMP As String
If Range("A100").Value <> "" Then strTMP = "3" Else strTMP = "2"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0

Also, wenn in A100 etwas steht drucke 3 Seiten aus, sonst nur 2 Seiten.

Das ist das Prinzip. Mach was draus. 21
Hallo Case,

und wieder mal ein Traum!! 18 

Ich habs nun folgenden Code:
Code:
Private Sub CommandButton1_Click()
ChDir "C:\Users\******\Desktop\test"
Dim strTMP As String
If Range("D100").Value <> "" Then strTMP = "3" Else strTMP = "2"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0

If Range("A146").Value <> "" Then strTMP = "4" Else strTMP = "3"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0

If Range("A194").Value <> "" Then strTMP = "5" Else strTMP = "4"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0

If Range("A244").Value <> "" Then strTMP = "6" Else strTMP = "5"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0

If Range("A294").Value <> "" Then strTMP = "7" Else strTMP = "6"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0

End Sub
Hab jetzt nen bissl hin und her probiert und es klappt.

Das mit dem Bild kriege ich auch noch hin. Hatte mich für die Gruppierung entscheiden, aber feststellen müssen, dass beim speichern der Button ebenfalls mit angezeigt wird. Das sollte ich aber hinkriegen. Deinen anderen Vorschlag werde ich demnächst umsetzen... Zur Not schreibe ich einfach nochmal was rein 19 

Somit ist dieses Kapitel auch abgeschlossen...

Besten DANK!!! 18 18 18

Nachtrag: i-wie klappts doch nicht. Auf einmal speichert er nun doch wieder nicht gefüllte Blätter! Huh
Keine Ahnung warum´s eben noch funktionierte....  20 ????

Ich schau mir das heute abend nochmal in Ruhe an... 22
So...ich hab jetzt nochmal den Code vervollständigt. Allerdings ist er noch immer Fehlerhaft.
Code:
Private Sub CommandButton1_Click()
ChDir "C:\Users\Nutzer\Desktop\test"
Dim strTMP As String
If Range("D100").Value <> "" Then strTMP = "3" Else strTMP = "2"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0
End
If Range("A146").Value <> "" Then strTMP = "4" Else strTMP = "3"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0
End
If Range("A194").Value <> "" Then strTMP = "5" Else strTMP = "4"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0
End
If Range("A244").Value <> "" Then strTMP = "6" Else strTMP = "5"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0
End
If Range("A294").Value <> "" Then strTMP = "7" Else strTMP = "6"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0
End Sub
Bis Seite 3 funktioniert das super. Wenn ich bis Seite 2 was eintrage, speichert er auch nur diese 2 Seiten. Das selbe mit seite 3, also steht in D100 was drin, wird bis seite 3 gespeichert. Steht nun aber auf Seite 4 in A146 was speichert er nicht bis seite 4, sondern nur bis seite 3...Was is da falsch? Huh
Hallöchen,

falls Du die pdf bei Seite 3 anschaust und nicht schließt, geht's nicht weiter.
Warum speicherst Du eigentlich nach jeder Seite?

Dein erster Ansatz mit If Then ... in einer Zeile war ja prinzipiell gut - wobei man die Else nicht braucht - , als Konsequenz hätte aber 1x

ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0

gereicht.

Code:
...
'strTmp auf kleinsten Wert setzen
strTMP = "2"
'Zellen auf Inhalt pruefen
If Range("D100").Value <> "" Then strTMP = "3"
If Range("A146").Value <> "" Then strTMP = "4"
...
'Blaetter ausgeben
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0
...
Moin schauan,
ich danke Dir! 18 
Leider bin ich nicht grad DER Experte in VBA... Da wäre ich im Leben nicht drauf gekommen. Ich hatte schon etliche Code-Varianten eingegeben...das der PC nicht den Volumeregler vom Fernsehr meines Nachbarns manipuliert hat, is echt ein Wunder!! 19 
In Sachen VBA muss ich mir echt mal die ganzen "Grundregeln" einhämmern. Das Prinzip verstehe ich ja, aber bei sowas hörts dann auch schon auf.
Danke, Danke, Danke!! 19 
Hi Stefan,

VBA ist das Eine. Wichtig beim Programmieren ist auch, sich die Abläufe usw. klar zu machen.
Du kannst zum Lernen auch mal probieren, in Kommentaren zu "programmieren" bzw. den Ablauf aufzuschreiben, da musst Du die VBA-Befehle noch gar nicht im einzelnen kennen bzw. verwenden. Ich schreib deswegen hier auch gerne Lösungen mit vielen Kommentaren, auch wenn die manchmal vielleicht etwas  verbesserungswürdig sind Smile

Ich nehm nur mal meine 3 Kommentare raus, etwas ergänzt:

'strTmp auf kleinsten Wert setzen
'Zellen D100, A146, ... fuer Festlegung Anzahl Blaetter auf Inhalt pruefen
'entsprechende Anzahl Blaetter ausgeben


In Deinem code hätten Kommentare vielleicht so ausgesehen

...
'Wenn in Zelle D100 was steht, dann 3 Druckseiten festlegen, sonst 2
'entsprechende Anzahl Seiten ausgeben
'Wenn in Zelle A146 was steht, dann 4 Druckseiten festlegen, sonst 3
'entsprechende Anzahl  Seiten ausgeben
...

btw. im letzten code

...
'Wenn in Zelle D100 was steht, dann
3 Druckseiten festlegen, sonst 2
'entsprechende Anzahl Seiten ausgeben
'Ende Wenn in Zelle D100 was steht, dann

'Wenn in Zelle A146 was steht, dann
4 Druckseiten festlegen, sonst 3
'entsprechende Anzahl  Seiten ausgeben
'Ende Wenn in Zelle A146 was steht, dann
...

--> das gleichzeitig als Hinweis, dass Dein Then und das folgende End auch nicht exakt waren. Korrekt wäre die AUfteilung des If ... Then in zwei Zeilen und das If nach End gewesen

If Range("D100").Value <> "" Then
strTMP = "3" Else strTMP = "2"
ActiveSheet.ExportAsFixedFormat 0, [D22] & Format(Date, "_DD_MM_YYYY"), 0, -1, 0, "1", strTMP, 0
End If
Seiten: 1 2