• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

VBA gevraagd voor het maken van filters en pdf's

Senso

Inventaris
Lid geworden
13 jun 2016
Berichten
11.855
Besturingssysteem
W11 Pro 25H2
Office versie
Office 2007 H&S en Office 2021 Prof Plus
Kolom A is jaren, kolom B de codes
1. Maak filters van de jaren die in kolom A staat en maak sheets met de naam 2020, 2021 etc.

2. Maak filters van de codes die in kolom B staan en maak sheets met de naam van de code A-001-L, B001 etc

3. Zijn alle sheets gemaakt, maak dan van alle sheets een aparte pdf. Ik zet het document in E:\Filters
Hoop dat het duidelijk is.
Kan best zijn dat ik dit al eens gevraagd heb, maar daar weet ik niets meer van. Geheugenverlies. En dan moet ik toch weer opnieuw beginnen.
 

Bijlagen

Laat maar even zitten. AI heeft een robuuste code geschreven en die ga ik eerst uitgebreid testen en heb ik vragen of problemen kom ik er op terug.
 
De code werkt goed, echter ik zou een aparte module willen hebben om de aangemaakte sheets te verwijderen. De originele sheet (bron) heeft de naam Filters. Die moet dus altijd blijven bestaan. Kan iemand daar de VBA voor schrijven?

Code:
    ' Zet filters uit en herstel scherm
    wsSource.AutoFilterMode = False
    Application.ScreenUpdating = True

Code:
 ' Optioneel: Verwijder het aangemaakte blad na export om je bestand schoon te houden
        ' Application.DisplayAlerts = False
        ' ws.Delete
        ' Application.DisplayAlerts = True
    Next filterValue
Dit laatste moet dus niet. Moet alleen als ik dat wil en niet automatisch.

edit:
Is gelukt, nu nog in het grote document verwerken.
 
Laatst bewerkt:
Ik krijg nu alle codes als sheets. Die sorteer ik met VBA. Ik kan nu alle sheets behalve de bronsheet wissen. Echter de marges worden niet overgenomen in de nieuwe sheets.

was links 0 en rechts 0
wordt links 1,8 en rechts 1,8

boven 0,4 en onder 0,4
wordt 1,9 en onder 1,9

De zoom wijzigt van 90 naar 100
De kolombreedtes worden niet aangepast naar de oude situatie.
Dat wordt dus een hele toer om dat allemaal goed te krijgen.
Dan moet je een VBA schrijven die dat allemaal aanpast.

Het moge dan ook duidelijk zijn dat de pdf's niet kloppen.
 
Ik krijg nu alle codes als sheets. Die sorteer ik met VBA. Ik kan nu alle sheets behalve de bronsheet wissen.

Zoals je kunt lezen/begrijpen heb ik dat gedaan en de VBA zag er perfect uit en werkt in de proefopstelling uitstekend. Met wat uitbreidingen ging het ook goed maar de uitwerkingen bij het grote document zijn niet goed.

Het is logisch als de opmaak niet wordt overgenomen in de filters/nieuwe sheets dat er ook niets meer klopt van de pdf's.
Dus ik moet een macro opnemen die de de filters kan aanpassen. Maar dat kost mij altijd veel tijd.
 
Onderstaande de code die aangepast moet worden. Je krijgt dus allemaal foute pdf's. Punt is de marges, zoom, koptekst, kolombreedte e.d. kloppen niet. Ik bouw dan deze code in tussen 2 en 3
Let op. Dit is vermoedelijk onjuist:
Sheets(Array("Blad1", "Blad2", "Blad3")).Select
Sheets("Blad1").Activate
Dit moet van toepassing zijn op alle nieuwe aangemaakte filters/sheets of alle aanwezige sheets! Wat is dan de juiste regel?

Wie wil de code nakijken of deze juist zal werken.
edit:
Ik heb het geprobeerd en krijg Compileerfout
Er wordt End Sub verwacht. Foutonderbreking en MS zegt Excel werkt niet meer. Rapport naar Amerika e.d.

PHP:
Attribute VB_Name = "Module1"
Sub CreateSheetsAndExportPDFs()
    Dim ws As Worksheet, dataWs As Worksheet
    Dim filterRange As Range, cell As Range
    Dim uniqueValues As New Collection
    Dim folderPath As String, filterValue As Variant
  
    ' --- CONFIGURATIE ---
    Set dataWs = ThisWorkbook.Sheets("Hoofdblad") ' Naam van je brondata blad
    ' De kolom waarop je filtert (bijv. kolom A vanaf rij 2)
    Set filterRange = dataWs.Range("B2:B" & dataWs.Cells(dataWs.Rows.Count, "A").End(xlUp).Row)
    folderPath = ThisWorkbook.Path & "\PDF_Exports\"
    ' --------------------

    ' Maak exportmap aan als deze nog niet bestaat
    If Dir(folderPath, vbDirectory) = "" Then MkDir folderPath

    ' Verzamel unieke waarden uit de filterkolom
    On Error Resume Next
    For Each cell In filterRange
        If cell.Value <> "" Then uniqueValues.Add cell.Value, CStr(cell.Value)
    Next cell
    On Error GoTo 0

    ' Loop door elke unieke waarde
    For Each filterValue In uniqueValues
        ' 1. Maak een nieuw blad aan
        Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
        ws.Name = Left(CStr(filterValue), 31) ' Bladnaam max 31 tekens

        ' 2. Filter data en kopieer zichtbare cellen naar nieuw blad
        dataWs.UsedRange.AutoFilter Field:=2, Criteria1:=filterValue
        dataWs.UsedRange.SpecialCells(xlCellTypeVisible).Copy Destination:=ws.Range("A1")
        dataWs.AutoFilterMode = False

Sub SheetsAanpassen()
'
' SheetsAanpassen Macro
'

'
    Sheets(Array("Blad1", "Blad2", "Blad3")).Select
    Sheets("Blad1").Activate
    With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = ""
        .LeftFooter = ""
        .CenterFooter = ""
        .RightFooter = ""
        .LeftMargin = Application.InchesToPoints(0)
        .RightMargin = Application.InchesToPoints(0)
        .TopMargin = Application.InchesToPoints(0.15748031496063)
        .BottomMargin = Application.InchesToPoints(0.15748031496063)
        .HeaderMargin = Application.InchesToPoints(0.31496062992126)
        .FooterMargin = Application.InchesToPoints(0.31496062992126)
        .PrintHeadings = False
        .PrintGridlines = True
        .PrintComments = xlPrintNoComments
        .CenterHorizontally = False
        .CenterVertically = False
        .Orientation = xlPortrait
        .Draft = False
        .PaperSize = xlPaperA4
        .FirstPageNumber = xlAutomatic
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = 90
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = True
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
        .FirstPage.CenterHeader.Text = ""
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With
    With ActiveSheet.PageSetup
        .LeftHeader = ""
        .CenterHeader = ""
        .RightHeader = ""
        .LeftFooter = ""
        .CenterFooter = ""
        .RightFooter = ""
        .LeftMargin = Application.InchesToPoints(0)
        .RightMargin = Application.InchesToPoints(0)
        .TopMargin = Application.InchesToPoints(0.15748031496063)
        .BottomMargin = Application.InchesToPoints(0.15748031496063)
        .HeaderMargin = Application.InchesToPoints(0.31496062992126)
        .FooterMargin = Application.InchesToPoints(0.31496062992126)
        .PrintHeadings = False
        .PrintGridlines = True
        .PrintComments = xlPrintNoComments
        .CenterHorizontally = False
        .CenterVertically = False
        .Orientation = xlPortrait
        .Draft = False
        .PaperSize = xlPaperA4
        .FirstPageNumber = xlAutomatic
        .Order = xlDownThenOver
        .BlackAndWhite = False
        .Zoom = 90
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = True
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
        .FirstPage.CenterHeader.Text = ""
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With
    ActiveWindow.Zoom = 100
    Columns("A:A").Select
    Selection.ColumnWidth = 5.71
    Columns("B:B").Select
    Selection.ColumnWidth = 6.57
    Columns("C:C").Select
    Selection.ColumnWidth = 14
    Columns("D:D").Select
    Selection.ColumnWidth = 0.5
    Columns("E:E").Select
    Selection.ColumnWidth = 10.29
    Columns("F:F").Select
    Selection.ColumnWidth = 11
    Columns("G:G").Select
    Selection.ColumnWidth = 10
    Columns("H:H").Select
    Selection.ColumnWidth = 10
    Columns("I:I").Select
    Selection.ColumnWidth = 10.14
    Columns("J:J").Select
    Selection.ColumnWidth = 9.14
    Columns("K:K").Select
    Selection.ColumnWidth = 8
    Columns("L:L").Select
    Selection.ColumnWidth = 9
    Sheets("Blad1").Select
End Sub

        ' 3. Exporteer het nieuwe blad naar PDF
        ws.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=folderPath & ws.Name & ".pdf", _
            Quality:=xlQualityStandard

        ' Optioneel: Verwijder het aangemaakte blad na export om je bestand schoon te houden
        ' Application.DisplayAlerts = False
        ' ws.Delete
        ' Application.DisplayAlerts = True
    Next filterValue

    MsgBox "Klaar! De PDF's zijn opgeslagen in: " & folderPath
End Sub
 
Laatst bewerkt:
Ik heb geen verstand van VBA maar dit zegt Chatgpt
Vervelend dat Excel vastloopt, maar de oorzaak is gelukkig heel duidelijk. Je krijgt de foutmelding "End Sub verwacht" omdat je midden in een bestaande macro (CreateSheetsAndExportPDFs) een nieuwe macro-kop (Sub SheetsAanpassen()) hebt geplakt. In VBA mag je nooit een Sub binnen een andere Sub zetten.

Daarnaast klopt je vermoeden: Sheets(Array("Blad1", ...)).Select werkt niet, omdat die bladen in jouw loop telkens een andere naam krijgen.
Ben benieuwd.

Code:
Attribute VB_Name = "Module1"
Sub CreateSheetsAndExportPDFs()
    Dim ws As Worksheet, dataWs As Worksheet
    Dim filterRange As Range, cell As Range
    Dim uniqueValues As New Collection
    Dim folderPath As String, filterValue As Variant
 
    ' --- CONFIGURATIE ---
    Set dataWs = ThisWorkbook.Sheets("Hoofdblad") ' Naam van je brondata blad
    ' De kolom waarop je filtert (bijv. kolom B vanaf rij 2)
    Set filterRange = dataWs.Range("B2:B" & dataWs.Cells(dataWs.Rows.Count, "A").End(xlUp).Row)
    folderPath = ThisWorkbook.Path & "\PDF_Exports\"
    ' --------------------

    ' Maak exportmap aan als deze nog niet bestaat
    If Dir(folderPath, vbDirectory) = "" Then MkDir folderPath

    ' Verzamel unieke waarden uit de filterkolom
    On Error Resume Next
    For Each cell In filterRange
        If cell.Value <> "" Then uniqueValues.Add cell.Value, CStr(cell.Value)
    Next cell
    On Error GoTo 0

    ' Loop door elke unieke waarde
    For Each filterValue In uniqueValues
        ' 1. Maak een nieuw blad aan
        Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
        ws.Name = Left(CStr(filterValue), 31)

        ' 2. Filter data en kopieer naar nieuw blad
        dataWs.UsedRange.AutoFilter Field:=2, Criteria1:=filterValue
        dataWs.UsedRange.SpecialCells(xlCellTypeVisible).Copy Destination:=ws.Range("A1")
        dataWs.AutoFilterMode = False

        ' --- STAP 3: OPMAAK (Toegepast op het nieuwe blad 'ws') ---
        With ws.PageSetup
            .LeftMargin = Application.InchesToPoints(0)
            .RightMargin = Application.InchesToPoints(0)
            .TopMargin = Application.InchesToPoints(0.16)
            .BottomMargin = Application.InchesToPoints(0.16)
            .HeaderMargin = Application.InchesToPoints(0.31)
            .FooterMargin = Application.InchesToPoints(0.31)
            .PrintGridlines = True
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
            .Zoom = 90 ' Hier stel je de zoom in voor de PDF
        End With

        ' Kolombreedtes instellen op het nieuwe blad
        ws.Columns("A").ColumnWidth = 5.71
        ws.Columns("B").ColumnWidth = 6.57
        ws.Columns("C").ColumnWidth = 14
        ws.Columns("D").ColumnWidth = 0.5
        ws.Columns("E").ColumnWidth = 10.29
        ws.Columns("F").ColumnWidth = 11
        ws.Columns("G:I").ColumnWidth = 10
        ws.Columns("J").ColumnWidth = 9.14
        ws.Columns("K").ColumnWidth = 8
        ws.Columns("L").ColumnWidth = 9

        ' 4. Exporteer het nieuwe blad naar PDF
        ws.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=folderPath & ws.Name & ".pdf", _
            Quality:=xlQualityStandard

        ' Optioneel: Verwijder het blad na export (haal de apostrof weg om te activeren)
        ' Application.DisplayAlerts = False
        ' ws.Delete
        ' Application.DisplayAlerts = True
    Next filterValue

    MsgBox "Klaar! De PDF's staan in: " & folderPath
End Sub
 
Attribute VB_Name = "Module1"
gewijzigd in:
'Attribute VB_Name = "Module1"

Eerste uitvoering Fout 104
Methode Autofilter van klasse Range is mislukt
dataWs UsedRange Field:=2 (is goed kolom B)..... is geel
Tweede uitvoering


ws.Name = Left(CStr(filterValue), 31).jpg
Bericht automatisch samengevoegd:

Ik plaats het document zonder data. Daar kun je dan zelf de VBA op uitvoeren.
 

Bijlagen

Laatst bewerkt:
Ik heb het opnieuw geprobeerd en het filter in Kolom B uitgeschakeld en nu werkt het wel. Nog even verder testen.
edit:
Ziet er zeer goed uit. Perfect in de pdf's.
 
Laatst bewerkt:
is het ook de bedoeling dat hij nieuwe tabbladen aanmaakt in jouw bestand of alleen PDF's
 
Beide. Dat zit ook in de VBA-code wat ik aan AI gevraagd had. Het is een eclatant succes geworden en ik heb nu wel recht op een Nobelprijs...
Ik ga nog proberen of ik ook jpg's van de sheets kan maken. Maar eerst nu eens verder met het invoeren van data.

Bedankt voor de hulp. Klasse👍
 
Zoiets misschien?

Code:
Sub CreateSheetsExportPDFandJPG()
    Dim ws As Worksheet, dataWs As Worksheet
    Dim cell As Range
    Dim uniqueValues As New Collection
    Dim folderPath As String, filterValue As Variant
    Dim lastRow As Long, lastCol As Long
    Dim sheetName As String
    Dim i As Long

    ' --- CONFIGURATIE ---
    Set dataWs = ThisWorkbook.Sheets("Hoofdblad")
    folderPath = ThisWorkbook.Path & "\Exports_" & Format(Now, "yyyymmdd_HHMM") & "\"
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    ' Filter resetten op bronblad
    If dataWs.FilterMode Then dataWs.ShowAllData
    dataWs.AutoFilterMode = False
    
    ' Laatste rij bepalen
    lastRow = dataWs.Cells(dataWs.Rows.Count, "B").End(xlUp).Row
    
    If lastRow < 2 Then
        MsgBox "Geen data gevonden in kolom B vanaf rij 2.", vbExclamation
        GoTo Afsluiten
    End If

    ' --- MAPPEN MAAK ---
    If Dir(folderPath, vbDirectory) = "" Then MkDir folderPath
    If Dir(folderPath & "PDF\", vbDirectory) = "" Then MkDir folderPath & "PDF\"
    If Dir(folderPath & "JPG\", vbDirectory) = "" Then MkDir folderPath & "JPG\"

    ' --- UNIEKE WAARDEN VERZAMELEN (STAP 1) ---
    ' We lopen door kolom B en vullen de collectie
    On Error Resume Next
    For i = 2 To lastRow
        Dim val As String
        val = Trim(CStr(dataWs.Cells(i, 2).Value)) ' Trim haalt onnodige spaties weg
        If val <> "" Then
            uniqueValues.Add val, val
        End If
    Next i
    On Error GoTo 0

    ' --- LOOP DOOR DE UNIEKE WAARDEN (STAP 2) ---
    For Each filterValue In uniqueValues
        
        ' Naam opschonen
        sheetName = Left(CStr(filterValue), 31)
        sheetName = Replace(sheetName, "/", "-")
        sheetName = Replace(sheetName, "\", "-")
        sheetName = Replace(sheetName, ":", "")

        ' Verwijder bestaand blad met dezelfde naam (om duplicaten te voorkomen)
        On Error Resume Next
        ThisWorkbook.Sheets(sheetName).Delete
        On Error GoTo 0

        ' 1. Nieuw blad maken
        Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        ws.Name = sheetName

        ' 2. Filter en kopieer op Hoofdblad
        lastCol = 12 ' Kolom A t/m L
        
        ' Belangrijk: Eerst filter uitzetten voor we opnieuw filteren
        dataWs.AutoFilterMode = False
        
        With dataWs.Range(dataWs.Cells(1, 1), dataWs.Cells(lastRow, lastCol))
            .AutoFilter Field:=2, Criteria1:=filterValue
            .SpecialCells(xlCellTypeVisible).Copy Destination:=ws.Range("A1")
        End With

        ' 3. Opmaak van het nieuwe blad
        With ws.PageSetup
            .PrintGridlines = True
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
            .Zoom = 90
            ' Marges op 0 zoals gewenst
            .LeftMargin = 0
            .RightMargin = 0
            .TopMargin = Application.InchesToPoints(0.16)
            .BottomMargin = Application.InchesToPoints(0.16)
        End With

        ' Kolombreedtes instellen
        ws.Columns("A").ColumnWidth = 5.71
        ws.Columns("B").ColumnWidth = 6.57
        ws.Columns("C").ColumnWidth = 14
        ws.Columns("D").ColumnWidth = 0.5
        ws.Columns("E").ColumnWidth = 10.29
        ws.Columns("F").ColumnWidth = 11
        ws.Columns("G:I").ColumnWidth = 10
        ws.Columns("J").ColumnWidth = 9.14
        ws.Columns("K").ColumnWidth = 8
        ws.Columns("L").ColumnWidth = 9

        ' 4. Export PDF
        ws.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=folderPath & "PDF\" & sheetName & ".pdf"

        ' 5. Export JPG
        ExportRangeToJPG ws.UsedRange, folderPath & "JPG\" & sheetName & ".jpg"
        
    Next filterValue

Afsluiten:
    dataWs.AutoFilterMode = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "Klaar! Er zijn " & uniqueValues.Count & " tabbladen verwerkt.", vbInformation
End Sub

' --- DE HULPFUNCTIE VOOR JPG (MOET ONDERAAN STAAN) ---
Sub ExportRangeToJPG(rng As Range, filePath As String)
    Dim chtObj As ChartObject
    If rng Is Nothing Then Exit Sub
    
    rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture
    Set chtObj = rng.Parent.ChartObjects.Add(Left:=rng.Left, Top:=rng.Top, _
                                             Width:=rng.Width, Height:=rng.Height)
    With chtObj
        .Select
        .Chart.Paste
        .Chart.Export Filename:=filePath, FilterName:="JPG"
        .Delete
    End With
End Sub
 
Ja, ga ik bewaren en later testen/uitvoeren. Het andere werkt nu en ik ga eerst verder met data invoeren. Bedankt.
 
Beste jverkerk,
ik wilde een test doen door jaarfilters te maken van kolom A
ik krijg echter alles codes/filters uit kolom B en alle filters, jpg en pdf zijn op rij 1 na leeg. Dus totaal geen inhoud op het hele blad behalve rij 1 na
Ik heb Field 2 in 1 gewijzigd.

Wil jij nog eens kijken naar de code.
Ik wil dus filters, pdf's en jpg's van kolom A dat zijn de jaren 2009, 2010, 2001 etc.

edit: nu lukt het ineens wel. Laat mij dus eerst maar verder testen. I'll be back.

Waarom in het naamvak rij 1 afbeelding 21 staat is mij een raadsel. Blijkbaar wordt van deze rij ergens een afbeelding van gemaakt. Te zien in Het hoofdblad.

PHP:
Sub MaakJaarfiltersPDFandJPG()
    Dim ws As Worksheet, dataWs As Worksheet
    Dim cell As Range
    Dim uniqueValues As New Collection
    Dim folderPath As String, filterValue As Variant
    Dim lastRow As Long, lastCol As Long
    Dim sheetName As String
    Dim i As Long

    ' --- CONFIGURATIE ---
    Set dataWs = ThisWorkbook.Sheets("Hoofdblad")
    folderPath = ThisWorkbook.Path & "\Exports_" & Format(Now, "yyyymmdd_HHMM") & "\"
  
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
  
    ' Filter resetten op bronblad
    If dataWs.FilterMode Then dataWs.ShowAllData
    dataWs.AutoFilterMode = False
  
    ' Laatste rij bepalen
    lastRow = dataWs.Cells(dataWs.Rows.Count, "A").End(xlUp).Row
  
    If lastRow < 2 Then
        MsgBox "Geen data gevonden in kolom A vanaf rij 2.", vbExclamation
        GoTo Afsluiten
    End If

    ' --- MAPPEN MAAK ---
    If Dir(folderPath, vbDirectory) = "" Then MkDir folderPath
    If Dir(folderPath & "PDF\", vbDirectory) = "" Then MkDir folderPath & "PDF\"
    If Dir(folderPath & "JPG\", vbDirectory) = "" Then MkDir folderPath & "JPG\"

    ' --- UNIEKE WAARDEN VERZAMELEN (STAP 1) ---
    ' We lopen door kolom B en vullen de collectie
    On Error Resume Next
    For i = 2 To lastRow
        Dim val As String
        val = Trim(CStr(dataWs.Cells(i, 2).Value)) ' Trim haalt onnodige spaties weg
        If val <> "" Then
            uniqueValues.Add val, val
        End If
    Next i
    On Error GoTo 0

    ' --- LOOP DOOR DE UNIEKE WAARDEN (STAP 2) ---
    For Each filterValue In uniqueValues
      
        ' Naam opschonen
        sheetName = Left(CStr(filterValue), 31)
        sheetName = Replace(sheetName, "/", "-")
        sheetName = Replace(sheetName, "\", "-")
        sheetName = Replace(sheetName, ":", "")

        ' Verwijder bestaand blad met dezelfde naam (om duplicaten te voorkomen)
        On Error Resume Next
        ThisWorkbook.Sheets(sheetName).Delete
        On Error GoTo 0

        ' 1. Nieuw blad maken
        Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        ws.Name = sheetName

        ' 2. Filter en kopieer op Hoofdblad
        lastCol = 12 ' Kolom A t/m L
      
        ' Belangrijk: Eerst filter uitzetten voor we opnieuw filteren
        dataWs.AutoFilterMode = False
      
        With dataWs.Range(dataWs.Cells(1, 1), dataWs.Cells(lastRow, lastCol))
            .AutoFilter Field:=1, Criteria1:=filterValue
            .SpecialCells(xlCellTypeVisible).Copy Destination:=ws.Range("A1")
        End With

        ' 3. Opmaak van het nieuwe blad
        With ws.PageSetup
            .PrintGridlines = True
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
            .Zoom = 90
            ' Marges op 0 zoals gewenst
            .LeftMargin = 0
            .RightMargin = 0
            .TopMargin = Application.InchesToPoints(0.16)
            .BottomMargin = Application.InchesToPoints(0.16)
        End With

        ' Kolombreedtes instellen
        ws.Columns("A").ColumnWidth = 5.71
        ws.Columns("B").ColumnWidth = 6.57
        ws.Columns("C").ColumnWidth = 14
        ws.Columns("D").ColumnWidth = 0.5
        ws.Columns("E").ColumnWidth = 10.29
        ws.Columns("F").ColumnWidth = 11
        ws.Columns("G:I").ColumnWidth = 10
        ws.Columns("J").ColumnWidth = 9.14
        ws.Columns("K").ColumnWidth = 8
        ws.Columns("L").ColumnWidth = 9

        ' 4. Export PDF
        ws.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=folderPath & "PDF\" & sheetName & ".pdf"

        ' 5. Export JPG
        ExportRangeToJPG ws.UsedRange, folderPath & "JPG\" & sheetName & ".jpg"
      
    Next filterValue

Afsluiten:
    dataWs.AutoFilterMode = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "Klaar! Er zijn " & uniqueValues.Count & " tabbladen verwerkt.", vbInformation
End Sub

' --- DE HULPFUNCTIE VOOR JPG (MOET ONDERAAN STAAN) ---
Sub ExportRangeToJPG(rng As Range, filePath As String)
    Dim chtObj As ChartObject
    If rng Is Nothing Then Exit Sub
  
    rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture
    Set chtObj = rng.Parent.ChartObjects.Add(Left:=rng.Left, Top:=rng.Top, _
                                             Width:=rng.Width, Height:=rng.Height)
    With chtObj
        .Select
        .Chart.Paste
        .Chart.Export Filename:=filePath, FilterName:="JPG"
        .Delete
    End With
End Sub
 
Laatst bewerkt:
Ik heb het goed werkend gekregen, echter de zoom in de nieuwe sheets/filters staat op 100%. Dat is wat vreemd, immers in de code zoom = 90. Hoe kan dit? Oplossing?

PHP:
        ' 3. Opmaak van het nieuwe blad
        With ws.PageSetup
            .PrintGridlines = True
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
            .Zoom = 90
            ' Marges op 0 zoals gewenst
            .LeftMargin = 0
            .RightMargin = 0
            .TopMargin = Application.InchesToPoints(0.16)
            .BottomMargin = Application.InchesToPoints(0.16)
        End With
Dit heb ik opgelost door ActiveWindow.Zoom = 90 toe te voegen.
Maar nu krijg ik een onderbreking > Foutopsporing
rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture
is dit niet helemaal goed of kan deze regel beter?
Dan wordt het Hoofdblad =bron overschreven door een filter en dit mag natuurlijk nooit gebeuren.
CopyPicture van Klasse Range is mislukt.
 
Laatst bewerkt:
Dit zegt Chatgpt
Om ook het tabblad zelf op het scherm op 90% te zetten, moet je de ActiveWindow.Zoom aanpassen. Omdat de macro door meerdere bladen loopt, moeten we elk nieuw blad even "activeren" om de schermzoom in te stellen.

Code:
' 3. Opmaak van het nieuwe blad
        ws.Activate ' Activeer het blad om de schermzoom te kunnen instellen
        ActiveWindow.Zoom = 90 ' Dit stelt de zoom op je BEELDSCHERM in
        
        With ws.PageSetup
            .PrintGridlines = True
            .Orientation = xlPortrait
            .PaperSize = xlPaperA4
            .Zoom = 90 ' Dit stelt de zoom voor PDF/PRINT in
            
            ' Marges op 0 zoals gewenst
            .LeftMargin = 0
            .RightMargin = 0
            .TopMargin = Application.InchesToPoints(0.16)
            .BottomMargin = Application.InchesToPoints(0.16)
            .HeaderMargin = Application.InchesToPoints(0.31)
            .FooterMargin = Application.InchesToPoints(0.31)
        End With

Nog een kleine tip voor de JPG's:​

Als je merkt dat de JPG's nu een beetje vreemd schalen, komt dat doordat de kwaliteit van een JPG-export in Excel vaak afhankelijk is van de zoomfactor op het scherm. Door ActiveWindow.Zoom = 90 toe te voegen, zullen je JPG's er waarschijnlijk ook consistenter uitzien!

Probeer dit toe te voegen; dan zouden zowel de PDF als het tabblad in Excel er nu exact hetzelfde uit moeten zien.
 
De zoom is het probleem niet meer. Alle filters komen nu met zoom 90. Echter er gebeuren vreemde zaken, zoals ik al aangaf. Er worden ook random geen afbeeldingen jpg's aangemaakt. Soms is 2015 blanco. Soms ook 3 jaren zijn blanco.


PHP:
    rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture
    DoEvents
    'Allow system to catch up
    'rng.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
xlBitmap werkt helemaal niet en alle jaren blijven blanco
DoEvents werkt ook niet, blijven drie jaren blanco bij de jpg's

Nu krijg ik dit weer:
CopyPicture van Klasse Range is mislukt.

Wat die ook doet is allemaal filters op de kop van het hoofdblad zetten.

Probeer het zelf maar eens een paar keer en contoleer de jpg's map. De macro jaarfilters aanmaken.
 

Bijlagen

Laatst bewerkt:
Op mijn nieuwe pc (snel) worden alle jpg's goed aangemaakt. i9 processor 64GB RAM, W11 pro en Excel 2021.
 
Terug
Bovenaan Onderaan