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.

Uitleg van de macro opslaan als PDF

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.

48 replies on “Opslaan als PDF”

  • 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?

    Maurice Subscriber
    • 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

      Joost Administrator
      • 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!

          Joost Administrator
  • 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

      Joost Administrator
  • 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.

      Joost Administrator
  • 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

      Joost Administrator
  • 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.

      Joost Administrator
  • 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?

    Neeten Siewnath
    • 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.

      Joost Administrator
  • 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

      Joost Administrator
  • 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.

      Joost Administrator
      • 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.

          Joost Administrator
  • 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!

      Joost Administrator
  • 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!

      Joost Administrator
  • 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!

      Joost Administrator
  • 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?

      Joost Administrator
  • 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.

      Joost Administrator
  • 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

      Joost Administrator
      • 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!

          Joost Administrator
  • 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

      Joost Administrator
  • 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

      Joost Administrator
  • 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.

      Joost Administrator
  • 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?

Leave a Comment

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *