Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA PDF per Button-Klick
#1
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

Interpunktion und Orthographie dieses Textes sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.

Grüße, StefanB
Antworten Top
#2
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
________
Servus
Case
[-] Folgende(r) 1 Nutzer sagt Danke an Case für diesen Beitrag:
  • StefanB
Antworten Top
#3
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

Interpunktion und Orthographie dieses Textes sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.

Grüße, StefanB
Antworten Top
#4
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

Interpunktion und Orthographie dieses Textes sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.

Grüße, StefanB
Antworten Top
#5
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
________
Servus
Case
[-] Folgende(r) 1 Nutzer sagt Danke an Case für diesen Beitrag:
  • StefanB
Antworten Top
#6
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

Interpunktion und Orthographie dieses Textes sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.

Grüße, StefanB
Antworten Top
#7
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

Interpunktion und Orthographie dieses Textes sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.

Grüße, StefanB
Antworten Top
#8
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
...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • StefanB
Antworten Top
#9
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 

Interpunktion und Orthographie dieses Textes sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.

Grüße, StefanB
Antworten Top
#10
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
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • StefanB
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste