Opslaan als PDF
Als je vaak bestanden opslaat als PDF, dan is deze macro echt iets voor jou.
Het slaat bestanden op in het juiste formaat in een vooraf opgegeven map met een druk op de knop.
Vooraf is het handig om te weten hoe je het Ontwikkelaars tabblad krijgt en hoe je een macro toevoegt.

Opslaan als PDF
Open de VB editor, ALT + F11, en maak een nieuwe Module aan.
Sub PDF()
Dim FacName As String
FacName = ActiveSheet.Range("C2").Value
If Dir("C:\Users\Nick\Desktop\" & FacName & ".pdf") <> "" Then
MsgBox "Het bestand: " & FacName & ".pdf bestaat reeds"
Exit Sub
Else
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Users\Nick\Desktop\" & FacName & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Nu slaat hij het bestand op met de naam die is opgegeven in cel A1.
De locatie dien je nog wel te wijzigen naar je eigen wens.
Let op: er zijn 2 locaties die hetzelfde moeten zijn!
De 1ste locatie kijkt of de bestandsnaam al in gebruik is, mocht dit niet zijn dan slaat hij hem op op de 2de locatie.
We maken voor het gemak even een ActiveX besturingselement aan.
Open op het lint het tabblad Ontwikkelaars, selecteer hier de optie Invoegen en kies voor knop.
Koppel hier de zojuist aangemaakte module aan.
Je kan het bestand ook opslaan met een andere extensie dan PDF hiervoor moet je de code een klein beetje aanpassen.
Geweldig deze formule! Werkte perfect toen ik het uitprobeerde in windows. Nu wil ik deze macro gaan gebruiken op mijn iMac. Helaas accepteert hij de filepath niet. De harde schijf naam van de iMac is MacintoshHD, hierbij krijg ik steeds een foutmelding. Hebben jullie een oplossing hiervoor?
Hoi Loes,
Ik kan het zelf niet testen omdat ik geen mac bezit, maar zou je dit kunnen proberen en laten weten of het lukt?
Sub PDFopslaanMAC()
FacName = ActiveSheet.Range("C2").Value
ChDir "/Users/Desktop/PDFopslaan/"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _
"/Users/Desktop/PDFopslaan/" & FacName & ".pdf", Quality:=xlQualityMinimum _
, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
False
End Sub
Scheidingsteken bij imac is een : , dus macintosh HD:Users:….
Beste Nick,
Geweldige Module! Deze wil ik zeker vaak gaan gebruiken.
Mijn enige probleem is dat mijn PDFjes uit 2 pagina`s moeten bestaan en de module pakt alleen de eerste pagina van het afdrukbereik.
Kan je mij hiermee helpen?
Met vriendelijke groet,
Axel
De 3de regel van onder.
From:=1, To:=1, OpenAfterPublish:=True
Maak hier
From:=1, To:=2, OpenAfterPublish:=True
van, of bij meer pagina’s de 2 ophogen
Deze lijkt wel op wat ik wil maken. alleen wil ik mijn bestand niet opslaan als PDF maar gewoon als XLS-file. Is dit ook mogelijk?
Ja, de code kan worden aangepast om het actieve blad op te slaan als een Excel-bestand (xls of xlsx). In plaats van de methode “ExportAsFixedFormat” te gebruiken voor het opslaan als PDF, kunnen we de methode “SaveAs” gebruiken om het bestand op te slaan als een Excel-bestand.
De aangepaste code:
Sub OpslaanAlsXLS()
Dim FacName As String
FacName = ActiveSheet.Range(“C2”).Value
If Dir(“C:\Users\Nick\Desktop\” & FacName & “.xls”) <> “” Or Dir(“C:\Users\Nick\Desktop\” & FacName & “.xlsx”) <> “” Then
MsgBox “Het bestand: ” & FacName & “.xls(x) bestaat reeds”
Exit Sub
Else
‘ Bepaal welk type Excel-bestand je wilt opslaan (xls of xlsx)
Dim Bestandstype As XlFileFormat
Bestandstype = IIf(Application.DefaultSaveFormat = xlWorkbookDefault, xlOpenXMLWorkbook, xlExcel8)
‘ Sla het actieve blad op als Excel-bestand op het bureaublad
ActiveSheet.SaveAs Filename:=”C:\Users\Nick\Desktop\” & FacName & “.xls”, FileFormat:=Bestandstype
‘ Je kunt ook de onderstaande regel gebruiken voor een dynamische bestandsnaam en de .xlsx-extensie
‘ ActiveSheet.SaveAs Filename:=”C:\Users\Nick\Desktop\” & FacName & “.xlsx”, FileFormat:=xlOpenXMLWorkbook
End If
End Sub
Beste Joost, ik zou graag een excelbestand opslaan in PDF formaat op datum. Iedereen op het werk gebruikt hetzelfde excelbestand dus iedereen moet vanuit hetzelfde bestand het pdf document kunnen opslaan op met als bestandnaam de datum. Het moet opgeslagen worden op de S schijf in de map PICS-PDF-Sensitiviteitstest. kan jij mij helpen aub, want met de code die ik nu heb wordt het oud bestand overschreven door het nieuw bestand.
Danku 🙂
Ja ik kan je wel helpen.
Hier is de aangepaste code:
Sub PDF()
Dim FacName As String
Dim SavePath As String
Dim FileName As String
‘ Haal de waarde op uit cel C2 voor de bestandsnaam
FacName = ActiveSheet.Range(“C2”).Value
‘ Bepaal het pad voor het opslaan van de PDF
SavePath = “S:\PICS-PDF-Sensitiviteitstest\”
‘ Genereer de bestandsnaam met de huidige datum
FileName = Format(Date, “yyyy-mm-dd”) & ” – ” & FacName & “.pdf”
‘ Controleer of het bestand al bestaat in de opgegeven map
If Dir(SavePath & FileName) <> “” Then
MsgBox “Het bestand: ” & FileName & ” bestaat reeds”
Else
‘ Exporteer het actieve blad als PDF
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SavePath & FileName, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Deze code zal het Excel-blad exporteren als een PDF-bestand met de bestandsnaam in het formaat “yyyy-mm-dd – FacName.pdf”.
Het bestand wordt opgeslagen in de opgegeven map op de S-schijf.
De datum wordt automatisch gegenereerd op basis van de systeemdatum op het moment dat de code wordt uitgevoerd.
Hoor het graag als dit goed voor je werkt!
Hoi,
Kun je mij helpen met het volgende.
Ik wil graag per regel uit een tabblad een aparte pdf opslaan. In kolom a staat het nummer dat kan dienen als bestand naam. Maar als er geen waarde meer staat in de onderste cel van mijn tabel wil ik dat ie stopt. Snap je wat ik bedoel. Uiteindelijk verwacht ik zo’n 170 pdfjes te maken. Alvast bedankt Usnach
Hieronder de VBA code die de gegevens uit een tabblad leest, per regel een aparte PDF genereert en het nummer uit kolom A gebruikt als bestandsnaam. Het programma stopt wanneer er geen waarde meer in de onderste cel van de tabel staat.
Sub CreatePDFs()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim nummer As String
Dim inhoud As String
Dim pdfFileName As String
‘ Vervang “Sheet1” door de naam van je tabblad waar de gegevens zich bevinden
Set ws = ThisWorkbook.Worksheets(“Sheet1”)
‘ Zoek de laatste ingevulde rij in kolom A
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
‘ Loop door elke rij en genereer een PDF-bestand
For i = 1 To lastRow
nummer = CStr(ws.Cells(i, “A”).Value)
‘ Als de cel leeg is, stoppen we de loop
If nummer = “” Then
Exit For
End If
‘ Hier kun je de inhoud van de PDF aanpassen, bijvoorbeeld met gegevens uit andere kolommen
inhoud = “Dit is regel ” & nummer
‘ Bestandsnaam voor de PDF
pdfFileName = nummer & “.pdf”
‘ Maak de PDF met de inhoud
CreatePDF pdfFileName, inhoud
Next i
End Sub
Sub CreatePDF(fileName As String, content As String)
‘ Hier kun je aanvullende opmaak en inhoud voor de PDF toevoegen
‘ Dit is een eenvoudig voorbeeld dat de tekst ‘content’ opslaat in de PDF-bestand met de naam ‘fileName’
Dim pdfApp As Object
Set pdfApp = CreateObject(“AcroExch.App”)
Dim pdfDoc As Object
Set pdfDoc = pdfApp.CreateDocument
pdfDoc.CreatePage 0, 0, 595, 842
pdfDoc.AddText 72, 720, content
pdfDoc.Save 1, fileName
pdfDoc.Close
pdfApp.Exit
Set pdfDoc = Nothing
Set pdfApp = Nothing
End Sub
Dag Joost,
Wat een geweldenaar ben je toch… het is soms zo simpel maar ook zo lastig om het voor elkaar te krijgen…
Kleine uitdaging voor je…
Heb een order-excel gemaakt met 5 kolommen, nu wil ik dat die door middel van 2 knoppen, verwerkt wordt.
1. de knop “opslaan” zodat de klant zijn order, direct als pdf op zijn computer heeft staan.. (dit is reeds door jouw input gelukt)
2. een verzendknop (deels gelukt) met daarin ook een “CC” (is voor de leverancier) waarbij ik slechts 3 kolommen door gemaild wil hebben van de excel file. (hier staan namelijk de bedragen in voor de klant maar zijn niet noodzakelijk voor de leverancier van deze goederen)
Hoop op jouw briljante oplossing.
Veel dank alvast.
Dit kan zeker, de stappen zijn als volgt:
1: Open het Excel-bestand waarin je de knoppen wilt toevoegen.
2: Druk op ALT + F11 om de VBA-editor te openen.
3: Klik in het VBA-venster op Invoegen in de menubalk en selecteer Module. Hiermee voegen we een nieuwe module toe waarin we de VBA-code plaatsen.
4: Plak de onderstaande VBA-code in de nieuwe module:
Sub OpslaanAlsPDF()
Dim filePath As String
Dim fileName As String
‘ Stel het bestandspad en de bestandsnaam in (pas dit aan indien nodig)
filePath = “C:\Pad\Naar\Opslag\Map\” ‘ Zorg ervoor dat de map bestaat
fileName = “Klant_Order.pdf”
‘ Verberg het Excel-venster terwijl het PDF wordt gemaakt
Application.ScreenUpdating = False
‘ Exporteer het actieve werkblad als PDF
ThisWorkbook.ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=filePath & fileName, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
‘ Toon het Excel-venster weer
Application.ScreenUpdating = True
End Sub
Sub VerstuurEmailMetCC()
Dim OutApp As Object
Dim OutMail As Object
Dim ws As Worksheet
Dim rng As Range
Dim ccAddress As String
‘ Stel de leverancierse-mail in en de kolommen die moeten worden verstuurd
ccAddress = “leverancier@example.com”
‘ Stel het werkblad in waarvan je de gegevens wilt versturen
Set ws = ThisWorkbook.Sheets(“Naam_van_je_werkblad”)
‘ Stel het bereik in van de kolommen die je wilt versturen (bijvoorbeeld A:C)
Set rng = ws.Range(“A:C”)
On Error Resume Next
Set OutApp = GetObject(, “Outlook.Application”)
If OutApp Is Nothing Then
Set OutApp = CreateObject(“Outlook.Application”)
End If
On Error GoTo 0
‘ Maak een nieuw e-mailbericht
Set OutMail = OutApp.CreateItem(0)
‘ Stel het onderwerp, het ontvangersadres en de cc-gegevens in
With OutMail
.Subject = “Onderwerp van de e-mail”
.To = “klant@example.com” ‘ Voeg het klant-e-mailadres toe
.CC = ccAddress
.Body = “Beste klant,” & vbNewLine & vbNewLine & _
“Hierbij sturen we u de bestelde producten.” & vbNewLine & vbNewLine & _
“Met vriendelijke groeten,” & vbNewLine & _
“Uw bedrijfsnaam”
‘ Voeg de gewenste bijlagen toe (hier voegen we het hele bereik toe)
.Attachments.Add Source:=rng
‘ Toon het e-mailbericht (je kunt dit weglaten als je het eerst wilt controleren)
.Display
End With
‘ Ruim de objecten op
Set OutMail = Nothing
Set OutApp = Nothing
End Sub
5: Bewaar en sluit de VBA-editor.
6: Voeg de knoppen toe aan je Excel-werkblad:
Ga terug naar het Excel-werkblad waarop je de knoppen wilt toevoegen.
Klik op Ontwikkelaars in de menubalk (als je de Ontwikkelaars tab niet ziet, ga dan naar `Bestand -> Opties -> lint aanpassen -> kies “Ontwikkelaars” en klik op “OK”).
Klik op Invoegen in het ontwikkelaars-tabblad en selecteer Knop (invoegen besturingselement) uit de ActiveX-besturingselementen.
Teken twee knoppen op het werkblad en geef ze een naam (bijvoorbeeld “Opslaan als PDF” en “Verstuur e-mail met CC”).
7: Wijs macro’s toe aan de knoppen:
Klik met de rechtermuisknop op de eerste knop (“Opslaan als PDF”) en selecteer Macro toewijzen.
Kies de macro OpslaanAlsPDF en klik op OK.
Herhaal deze stap voor de tweede knop (“Verstuur e-mail met CC”) en wijs de macro VerstuurEmailMetCC toe.
8: Bewaar het bestand als een Excel-macro-enabled werkmap (.xlsm) om de VBA-code en knoppenfunctionaliteit te behouden.
Nu zou je twee knoppen op je Excel-werkblad moeten hebben. Als je op “Opslaan als PDF” klikt, wordt de actieve sheet opgeslagen als een PDF-bestand op de opgegeven locatie. Als je op “Verstuur e-mail met CC” klikt, wordt er een e-mail gemaakt en worden alleen de kolommen A tot C als bijlage verzonden naar de klant met de opgegeven cc-adres voor de leverancier.
Let op: Zorg ervoor dat je de VBA-code en e-mailinstellingen aanpast aan jouw specifieke behoeften, zoals de e-mailadressen en bestandspaden. Succes! Als je verdere hulp nodig hebt, laat het me gerust weten.
Beste Joost,
of iemand anders
De formule werkt prima. Opslaan als pdf en openen als pdf. Ideaal !!
Maar de map moet wel al bestaan. Kan er een formule aan toegevoegd worden waarmee je de map, als deze nog niet bestaat, ook nog toegevoegd kan worden alvorens dit opgeslagen wordt?
Alvast erg bedankt !
Zekers.
Om ervoor te zorgen dat de map wordt toegevoegd als deze nog niet bestaat, kunnen we enkele aanpassingen maken aan de code. Hiervoor zullen we de functie MkDir gebruiken, die een map (directory) aanmaakt als deze nog niet bestaat.
Met deze aanpassing zal de map “C:\Users\Nick\Desktop” worden aangemaakt als deze nog niet bestaat voordat het bestand wordt opgeslagen als PDF. Als de map al bestaat, zal de code doorgaan met het controleren of het PDF-bestand al bestaat en de gebruiker een bericht geven als dat het geval is. Anders zal het PDF-bestand worden gegenereerd en automatisch geopend.
Hier is de aangepaste code:
Sub PDF()
Dim FacName As String
Dim FilePath As String
FacName = ActiveSheet.Range(“C2”).Value
FilePath = “C:\Users\Nick\Desktop\” & FacName & “.pdf”
‘ Controleer of de map bestaat
If Dir(“C:\Users\Nick\Desktop\”, vbDirectory) = “” Then
‘ De map bestaat nog niet, maak deze aan
MkDir “C:\Users\Nick\Desktop\”
End If
‘ Controleer of het bestand al bestaat
If Dir(FilePath) <> “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds”
Else
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=FilePath, _
Quality:=xlQualityStandard, IncludeDocProperties:=False, _
IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Dag Nick,
Super bedankt voor je hulp, werkt prima! het enige waar ik last van heb, is dat ie mijn excel document sluit wanneer ik op opslaan druk. althans, mijn excel bestaand wordt helemaal grijs en ik moet hem dan opnieuw opstarten. ligt dat aan mijn laptop of kan ik dat verhelpen?
krijg een foutmelding bij opslaan; ken er niets van kan iemand mij verder helpen aub
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=”C:\Users\toycr\ondrive\glenn\offertes” & FacName &
“.pdf”, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
De foutmelding die je ontvangt, kan te maken hebben met het stukje code dat je gebruikt om het actieve Excel-blad op te slaan als een PDF-bestand. Ik zie echter geen specifieke fout in de code zelf, dus het kan te wijten zijn aan andere factoren. Er zijn een paar punten waar je op moet letten:
Zorg ervoor dat de variabele “FacName” correct is gedefinieerd en een geldige waarde heeft voordat je de code uitvoert.
Controleer of de map waarin je het PDF-bestand wilt opslaan, al bestaat. Als dat niet het geval is, moet je ervoor zorgen dat de map “C:\Users\toycr\ondrive\glenn\offertes” bestaat voordat je probeert het bestand daar op te slaan.
Controleer of je voldoende rechten hebt om bestanden op te slaan in de opgegeven maplocatie. Soms kunnen beperkingen in de bestandsmachtigingen problemen veroorzaken bij het opslaan van bestanden.
De code lijkt correct te zijn, maar zorg ervoor dat je geen onzichtbare tekens of speciale tekens in de bestandsnaam hebt die mogelijk een probleem kunnen veroorzaken.
Zorg ervoor dat de macrobeveiliging in Excel is ingesteld op een niveau dat het uitvoeren van macro’s toestaat. Anders zal de code niet worden uitgevoerd.
Als je nog steeds problemen hebt na het controleren van deze punten, laat me dan weten welke specifieke foutmelding je ontvangt, zodat ik je verder kan helpen. Foutmeldingen kunnen vaak nuttige aanwijzingen bevatten over wat er mis is gegaan.
Als ik een excel document met een pdf knop wil maken dat ik verstuur naar een extern persoon (dus die heeft een andere opslag drive). Hoe kan ik dit het beste aanpakken dat ik toch een werkend document kan versturen?
Om een Excel-document met een PDF-knop te maken en dit naar een externe persoon te versturen, zijn er verschillende opties om ervoor te zorgen dat het document correct werkt, ongeacht de opslaglocatie van de ontvanger. Hier zijn enkele suggesties:
Gebruik ingebouwde functies
Zorg ervoor dat je gebruikmaakt van ingebouwde Excel-functies en knoppen om de PDF-functionaliteit toe te voegen. Dit zorgt ervoor dat de ontvanger de macro’s of VBA-code niet hoeft in te schakelen of te vertrouwen.
Exporteer als PDF
In plaats van een externe knop, kun je gebruikmaken van de ingebouwde functionaliteit van Excel om het werkblad als PDF te exporteren. Dit is een veilige optie die meestal geen problemen veroorzaakt.
Relatieve verwijzingen
Als je VBA-code gebruikt voor de PDF-knop, zorg er dan voor dat alle verwijzingen binnen het VBA-script relatief zijn en niet gebaseerd zijn op een specifieke opslaglocatie. Relatieve verwijzingen zorgen ervoor dat het VBA-script correct werkt, zelfs als het bestand wordt verplaatst naar een andere map of station.
Documentatie voor de ontvanger
Als je toch complexe VBA-code moet gebruiken en er bestaat een kans dat de ontvanger macro’s moet inschakelen, zorg er dan voor dat je gedetailleerde documentatie verstrekt over hoe ze dit kunnen doen voor verschillende Excel-versies. Geef ook uitleg over hoe ze de knop moeten gebruiken om het PDF-bestand te genereren.
Testen op verschillende systemen
Test het Excel-document op verschillende systemen (indien mogelijk) om er zeker van te zijn dat het correct werkt op verschillende versies van Excel en met verschillende beveiligingsinstellingen.
Beveiligingsoverwegingen
Houd er rekening mee dat sommige organisaties of beveiligingsinstellingen macro’s of VBA-code mogelijk uitschakelen of beperken. Zorg ervoor dat je de ontvanger informeert over eventuele beveiligingsbelemmeringen en mogelijke oplossingen.
Opslaglocatie voor PDF
Als je Excel-document naar een externe opslaglocatie verwijst om de PDF op te slaan, zorg er dan voor dat deze locatie toegankelijk is voor de ontvanger. Overweeg om het PDF-bestand in dezelfde map op te slaan als het Excel-document, zodat er geen problemen ontstaan met ontbrekende verwijzingen.
Het is altijd een goed idee om te kiezen voor eenvoudige en ingebouwde functies als dat mogelijk is, omdat dit het risico op compatibiliteits- en beveiligingsproblemen vermindert. Als je VBA-code moet gebruiken, zorg er dan voor dat deze goed is getest en gedocumenteerd voor de ontvanger.
En vergeet niet om altijd te communiceren met de ontvanger over eventuele specifieke vereisten of stappen die nodig zijn om het document correct te laten werken.
Dit is (bijna) precies wat ik zocht, waarvoor dank!
Is het echter ook mogelijk om een bepaalde range in een verborgen tabblad op te slaan als PDF?
Om verborgen werkbladen ook op te slaan als PDF, moet je de code aanpassen om eerst de verborgen werkbladen zichtbaar te maken, vervolgens het gewenste bereik af te drukken als PDF en ten slotte de verborgen werkbladen weer te verbergen.
Hier is een aangepaste versie van de VBA-code om dit te bereiken:
Sub PDF()
Dim FacName As String
FacName = ActiveSheet.Range(“C2”).Value
Dim ws As Worksheet
Dim actieveBlad As Worksheet
‘ Sla het actieve werkblad op voor later herstel
Set actieveBlad = ActiveSheet
‘ Loop door alle werkbladen in het werkboek
For Each ws In ThisWorkbook.Worksheets
‘ Controleer of het werkblad verborgen is
If ws.Visible = xlSheetHidden Or ws.Visible = xlSheetVeryHidden Then
‘ Maak het verborgen werkblad tijdelijk zichtbaar
ws.Visible = xlSheetVisible
End If
Next ws
‘ Controleer of het PDF-bestand al bestaat
If Dir(“C:\Users\Nick\Desktop\” & FacName & “.pdf”) <> “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds”
Else
‘ Activeer het oorspronkelijke actieve blad om het als PDF op te slaan
actieveBlad.Activate
‘ Sla het actieve blad op als PDF op het bureaublad
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=”C:\Users\Nick\Desktop\” & FacName & “.pdf”, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
‘ Loop opnieuw door alle werkbladen om eventueel verborgen werkbladen weer te verbergen
For Each ws In ThisWorkbook.Worksheets
If ws.Visible = xlSheetVisible Then
ws.Visible = xlSheetHidden ‘ Of xlSheetVeryHidden als het werkblad oorspronkelijk zeer verborgen was
End If
Next ws
End Sub
is het ook mogelijk om de naam van het pdf bestand naar 2 cellen te vernoemen. Dus bijvoorbeeld factuurnummer en klant naam?
Het is zeker mogelijk om de naam van het PDF-bestand te baseren op twee verschillende cellen, zoals het factuurnummer en de klantnaam.
Je kunt de waarden van de cellen combineren in de FacName-variabele, voordat je de PDF maakt.
Hier de code:
Sub PDF()
Dim FacNummer As String
Dim KlantNaam As String
Dim FacName As String
FacNummer = ActiveSheet.Range(“A2”).Value
KlantNaam = ActiveSheet.Range(“B2”).Value
FacName = FacNummer & “_” & KlantNaam ‘ Combineer Factuurnummer en Klant naam
If Dir(“C:\Users\Nick\Desktop\” & FacName & “.pdf”) <> “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds”
Exit Sub
Else
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=”C:\Users\Nick\Desktop\” & FacName & “.pdf”, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
In dit voorbeeld wordt aangenomen dat het factuurnummer in cel A2 staat en de klantnaam in cel B2.
De FacName-variabele wordt gecreëerd door het factuurnummer en de klantnaam te combineren, en dit wordt gebruikt als de naam voor het PDF-bestand.
Je kunt de cellen waarin het factuurnummer en de klantnaam zich bevinden naar wens aanpassen.
Hallo Joost, bedankt voor dit. alleen ik snap het stukje bij FacName = niet moet ik hier ook nog iets aan veranderen? ik krijg nu steeds een opslaan fout
Het stukje bij FacName = haalt simpelweg de waarde op uit cel F1 van het actieve werkblad (ActiveSheet).
Dus als je de naam van het bestand dat je wilt opslaan als PDF in cel F1 hebt staan, zal deze regel die waarde toewijzen aan de variabele FacName.
Verder oplossen dan dit lukt me helaas ook niet.
Hoi Joost,
Super fijne codes om mee te werken en combineren.
ik heb nu deze:
Sub PDF()
Dim FacName As String
FacName = ActiveSheet.Range(“D18”).Value
If Dir(“C:\directory\” & FacName & “.pdf”) “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds en is nog niet gekopieerd naar de definitieve bestemming.”
Exit Sub
Else
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=”C:\directory\” & FacName & “.pdf”, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Maar is het ook mogelijk dat het PDF zic opslaat op de locatie waar het excel staat? ik hoor graag
Het is mogelijk om het PDF-bestand op te slaan op de locatie waar het Excel-bestand zich bevindt.
In deze aangepaste code wordt ThisWorkbook.Path gebruikt om de map van het Excel-bestand te krijgen. Het PDF-bestand wordt vervolgens opgeslagen in dezelfde map met de naam die is opgegeven in cel D18.
Sub PDF()
Dim FacName As String
FacName = ActiveSheet.Range(“D18”).Value
If Dir(ThisWorkbook.Path & “\” & FacName & “.pdf”) <> “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds en is nog niet gekopieerd naar de definitieve bestemming.”
Exit Sub
Else
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & “\” & FacName & “.pdf”, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Succes!
Hey Nick,
Dit is de module waarnaar ik opzoek was. Nu wordt de pdf opgeslagen op een vooraf bepaalde map/locatie. Is het ook mogelijk om de pdf op te slagen op een map/locatie naar keuze? Zoiets als “save as” waar je kan bepalen in welke map hij moet worden opgeslagen.
Kan je mij hiermee helpen?
Groetjes,
Dominique
Hallo Dominique,
Dat kan inderdaad.
Onderstaande aangepaste code zal een dialoogvenster met een bestandskiezer openen, waarin de gebruiker een map kan selecteren waarin het PDF-bestand moet worden opgeslagen. Vervolgens wordt het PDF-bestand opgeslagen in de geselecteerde map met de door de gebruiker gekozen bestandsnaam.
Als er geen map wordt geselecteerd, wordt het proces geannuleerd.
Sub PDF()
Dim FacName As String
Dim SavePath As String
‘ Vraag de gebruiker om een map te selecteren
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = “Selecteer een map om het bestand op te slaan”
If .Show = -1 Then
SavePath = .SelectedItems(1) & “\”
Else
MsgBox “Geen map geselecteerd. Het proces wordt geannuleerd.”
Exit Sub
End If
End With
‘ Bepaal de bestandsnaam
FacName = ActiveSheet.Range(“C2”).Value
‘ Controleer of het bestand al bestaat op de gekozen locatie
If Dir(SavePath & FacName & “.pdf”) “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds”
Exit Sub
Else
‘ Sla het PDF-bestand op in de gekozen map
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=SavePath & FacName & “.pdf”, _
Quality:=xlQualityStandard, IncludeDocProperties:=False, _
IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Succes!
Hey Joost,
Bedankt voor je script en snelle reactie.
Als de module toewijs aan een knop en ik doe een test geeft ie een compileerfout: syntaxisfout
In de module geeft ie weer dat ‘sub pdf()’ een fout bevat.
Weet jij wat het probleem kan zijn en hoe ik dit kan oplossen?
groeten
Dominique
Het lijkt erop dat de compileerfout wordt veroorzaakt door het gebruik van een vooraf gereserveerde VBA-sleutelwoord als de naam van je subroutine (“PDF”).
Dit kan tot conflicten leiden omdat “PDF” mogelijk wordt gebruikt voor iets anders in VBA.
Probeer de naam van de subroutine te wijzigen naar iets anders, zoals “Sub ExportPDF(), om het conflict op te lossen”.
Succes!
Bij mij geeft deze formule de volgende foutmelding:
Fout-2147024773(8007007b) tijdens uitvoering: Het document is niet opgeslagen.
Dit kan te maken hebben met de waarde van:
C2 in:
FacName = ActiveSheet.Range(“C2”).Value
Is de naamgeving correct zonder haken, komma, punten of een dubbele punt, etc?
en in onderstaand pad:
If Dir(“C:\Users\Nick\Desktop\” & FacName & “.pdf”)
is de folder aanwezig en bestaat er al een document met dezelfde naam?
Mijn routine geeft de volgende fout en ik begrijp niet wat er mis aan is:Fout 1004 tijdens uitvoering: Door de toepassing of door object gedefinieerde fout. Dit gebeurd tijdens de stap van het aanmaken van de pdf….
Code:
Public Sub Create_PDFs_From_Slicer_Items()
Dim folderPath As String
Dim currentSheet As Worksheet
Dim slCache As slicerCache
Dim slItem As slicerItem
Dim pdfName As String
‘ Deze routine maakt PDF-bestanden van elk slicer-item en slaat ze op in de gespecificeerde map.
‘ Definieer de map voor de PDF-bestanden
folderPath = “C:\Tmp\Export\” ‘ WIJZIG DIT NAAR JE GEWENSTE MAP
If Right(folderPath, 1) “\” Then folderPath = folderPath & “\”
Set currentSheet = ThisWorkbook.ActiveSheet
Set slCache = ThisWorkbook.SlicerCaches(“Slicer_Tankstation”)
Application.ScreenUpdating = False
‘ Loop door elk slicer-item
For Each slItem In slCache.SlicerItems
‘ Reset filters
slCache.ClearManualFilter
‘ Selecteer het huidige slicer-item
slItem.Selected = True
‘ Haal de naam van het slicer-item op
pdfName = slItem.Name
‘ Maak een PDF van het huidige blad met de naam van het slicer-item
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=folderPath & pdfName & “.pdf”, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
Next slItem
‘ Reset de filters
slCache.ClearManualFilter
Application.ScreenUpdating = True
MsgBox “Klaar met maken van PDF-bestanden”
End Sub
Er zijn een paar mogelijke redenen waarom deze fout optreedt:
Bestandsnaam
Controleer of de variabelen folderPath en pdfName correct zijn gedefinieerd en of de resulterende bestandsnaam geen ongeldige tekens bevat.
Ongeldige tekens in bestandsnamen kunnen fouten veroorzaken.
Pad
Zorg ervoor dat de map die is opgegeven in de variabele folderPath daadwerkelijk bestaat en dat je toegang hebt tot deze map.
Als de map niet bestaat of als je geen toegang hebt tot schrijven in die map, kan dit de fout veroorzaken.
ActiveSheet
Controleer of er daadwerkelijk een werkblad is geactiveerd op het moment dat de code wordt uitgevoerd.
Als er geen werkblad actief is, kan dit leiden tot een fout bij het exporteren naar PDF.
Met bovenstaande code, zou je dan ook het bestand in plaats van op je pc kunnen opslaan op een sharepoint locatie? Dan is het voor mij werk een hele mooie uitkomst daar er veel mensen thuis werken met hetzelfde bestand.
Je zou je SharePoint-pad kunnen vinden door naar de locatie te navigeren waar je het bestand wilt opslaan in SharePoint, en vervolgens de URL uit de adresbalk van je browser te kopiëren. Pas het pad vervolgens aan in de VBA-code:
Sub PDF()
Dim FacName As String
Dim SharePointPath As String
‘ Verander hier de SharePointPath naar jouw specifieke SharePoint-locatie
SharePointPath = “\\sharepoint\path\to\folder\”
FacName = ActiveSheet.Range(“C2”).Value
If Dir(SharePointPath & FacName & “.pdf”) <> “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds”
Exit Sub
Else
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SharePointPath & FacName & “.pdf”, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Beste Joost, Bedankt voor je reactie.
Helaas geeft hij toch telkens een fout bij het pad van de website Sharepoint. Moet ik het wel met http ervoor invoeren?
Een voorbeeld van een SharePoint-pad zou er als volgt uit kunnen zien:
\\bedrijfsnaam.sharepoint.com\sites\mijnteam\Gedeelde%20documenten\
Hier is een korte uitleg van de verschillende delen van dit pad:
– \\bedrijfsnaam.sharepoint.com`: Dit is de basis-URL van je SharePoint-site. Het kan ook een IP-adres zijn als het zo is geconfigureerd.
– \sites\mijnteam\`: Dit zijn de mappenstructuur binnen de SharePoint-site. In dit voorbeeld is er een subsite genaamd “mijnteam” binnen de hoofdwebsite.
– Gedeelde%20documenten`: Dit is de naam van de map waarin je het bestand wilt opslaan. Let op het gebruik van `%20` in plaats van spaties. Dit komt omdat spaties in URLs moeten worden vervangen door `%20`.
Je zou je SharePoint-pad moeten vinden door naar de locatie te navigeren waar je het bestand wilt opslaan in SharePoint, en vervolgens de URL uit de adresbalk van je browser te kopiëren. Pas het pad vervolgens aan in de VBA-code.
Succes!
Helaas lukt het me nog steeds niet. Zie hieronder de code, kan jij zien wat ik fout doe?
Sub WPDF()
Dim FacName As String
Dim SharePointPad As String
SharePointPad = “https:\\xxxxxx-my.sharepoint.com\personal//Documents/”
FacName = ActiveSheet.Range(“C2”).Value
If Dir(Pad & sh.Name & “.pdf”) “” Then
MsgBox “Het bestand: ” & sh.Name & “.pdf bestaat reeds”
Exit Sub
Else
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SharePointPad & FacName & “.pdf”, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Zoiets werkt beter denk ik:
Sub WPDF()
Dim FacName As String
Dim SharePointPad As String
‘ SharePoint-pad corrigeren
SharePointPad = “https://xxxxxx-my.sharepoint.com/personal/Documents/”
‘ Celwaarde ophalen
FacName = ActiveSheet.Range(“C2”).Value
‘ Controleren of bestand al bestaat
If Dir(SharePointPad & FacName & “.pdf”) <> “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds”
Exit Sub
Else
‘ PDF exporteren
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SharePointPad & FacName & “.pdf”, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Beste Joost,
FacName = ActiveSheet.Range(“F1”).Value
If Dir(SharePointPad & FacName & “.pdf”) “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds”
Exit Sub
Else
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SharePointPad & FacName & “.pdf”, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=1, To:=1, OpenAfterPublish:=True
End If
End Sub
Bovenstaande code heb ik ingevoerd maar hij geeft telkens een Syntaxfout weet jij wellicht waarom?
Het lijkt op een kleine syntaxisfout is in de regel met de `Dir`-functie.
Om te controleren of een bestand bestaat, moet je de `Dir`-functie vergelijken met een waarde, zoals in de vorm van een vergelijking.
Probeer onderstaande code eens:
Sub ExporterenNaarPDF()
Dim FacName As String
Dim SharePointPad As String
FacName = ActiveSheet.Range(“F1”).Value
SharePointPad = “C:\SharePoint\” ‘ Vervang dit pad met het juiste SharePoint-pad
If Dir(SharePointPad & FacName & “.pdf”) <> “” Then
MsgBox “Het bestand: ” & FacName & “.pdf bestaat reeds”
Exit Sub
Else
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=SharePointPad & FacName & “.pdf”, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
From:=1, To:=1, _
OpenAfterPublish:=True
End If
End Sub
Goedemiddag allen. Ik heb een groot Excel bestand met 1 tabblad waarbij ik gewerkt heb met Pagina Einde. Dat wil zeggen, dat ik op dit aparte tabblad 10-20 pagina’s heb. Kan ik deze pagina’s los opslaan als PDF d.m.v. een knop? Titel van de losse pdf zou dan moeten zijn: 1 (voor pagina 1) 2 (voor pagina 2 etc.
Alvast bedankt!
Groet, Hans
Hier de code waarbij elke PDF wordt opgeslagen met een bestandsnaam die gedeeltelijk is gebaseerd op de waarde in cel `C2` en het paginanummer.
Hierbij controleert de code ook of de PDF al bestaat en voorkomt dat bestaande bestanden worden overschreven.
De code:
Sub SavePagesAsPDF()
Dim ws As Worksheet
Dim totalPages As Integer
Dim page As Integer
Dim pdfFilePath As String
Dim FacName As String
‘ Zet hier het pad waar je de PDF’s wilt opslaan
Dim folderPath As String
folderPath = “C:\Users\Nick\Desktop\” ‘ Pas dit pad aan naar de locatie waar je wilt opslaan
‘ Verwijzing naar het huidige werkblad
Set ws = ThisWorkbook.Sheets(“Sheet1”) ‘ Vervang “Sheet1” door de naam van jouw tabblad
‘ Haal de naam op uit cel C2
FacName = ws.Range(“C2”).Value
‘ Bepaal het aantal pagina’s
totalPages = ws.PageSetup.Pages.Count
‘ Loop door elke pagina en sla deze als PDF op
For page = 1 To totalPages
‘ Geef het bestand de naam van de paginanummer gecombineerd met de naam uit cel C2
pdfFilePath = folderPath & FacName & “_Pagina_” & page & “.pdf”
‘ Controleer of de PDF al bestaat
If Dir(pdfFilePath) <> “” Then
MsgBox “Het bestand: ” & FacName & “_Pagina_” & page & “.pdf bestaat reeds en wordt overgeslagen.”
Else
‘ Exporteer de huidige pagina naar PDF
ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfFilePath, Quality:=xlQualityStandard, _
IncludeDocProperties:=False, IgnorePrintAreas:=False, From:=page, To:=page
End If
Next page
MsgBox “Alle pagina’s zijn succesvol opgeslagen als losse PDF-bestanden in ” & folderPath
End Sub
Wat de code doet:
– FacName:
Haalt de naam op uit cel `C2` op het tabblad dat je wilt exporteren, en gebruikt die naam als basis voor het bestand.
– pdfFilePath:
Creëert een bestandsnaam op basis van `FacName` en voegt het paginanummer toe, bijvoorbeeld `FacName_Pagina_1.pdf`.
– If Dir(pdfFilePath) <> “” Then:
Controleert of de PDF al bestaat. Als dit het geval is, wordt de export overgeslagen voor die pagina.
– ws.ExportAsFixedFormat:
Exporteert de pagina naar PDF als het bestand nog niet bestaat.
Hoe gebruiken:
1. Pas `folderPath` aan naar de map waar je de PDF’s wilt opslaan.
2. Vervang `”Sheet1″` door de juiste naam van je tabblad.
3. Voer de macro uit via `ALT + F8` en kies `SavePagesAsPDF`.
Nu zou elke pagina als PDF moeten worden opgeslagen met de naam uit cel `C2` en het paginanummer, waarbij bestaande bestanden worden overgeslagen.
Hopelijk ben je hiermee geholpen.
Beste Joost,
Ik ben op zoek naar een vba script om een factuur te kunnen opslaan als pdf en vervolgens te verzenden via email doormiddel van een knop in excel.
Is dit mogelijk?
Goedemiddag,
Denk dat de blog: “Email versturen via Excel (ook als PDF)” je kan helpen.
Succes!