Help!

PC-Problemen?
De vrijwilligers van Oplossing.be zoeken gratis met u mee!

Hulp bij posten

Recente topics

Auteur Topic: Iemand idee om PQ code sneller te maken ?  (gelezen 3906 keer)

0 leden en 1 gast bekijken dit topic.

Offline ValentinS

  • Lid
  • *
  • Berichten: 11
  • Geslacht: Man
Iemand idee om PQ code sneller te maken ?
« Gepost op: 23 mei 2026, 19:17:58 »
1. Download "Lijst winnende my bonus codes pdf" van https://www.nationale-loterij.be/onze-spelen/euromillions/uitslagen-trekking/
-------------------------------------------------------------------
2 Parameter instellen:
Sub TabelParameterMetUserName()
    Dim wsParam As Worksheet
    Dim GebruikersNaam As String
    Dim MapNaam As String
   
    Set wsParam = ThisWorkbook.Sheets("Parameter")
   
   
    GebruikersNaam = Environ$("USERNAME")
   
    MapNaam = "Downloads"
   
    wsParam.Range("A1:B1").Value = Array("Parameter", "Value")
    wsParam.Range("A2").Value = "File Path"
    wsParam.Range("B2").Value = "C:\Users\" & GebruikersNaam & "\" & MapNaam & "\"
   
    On Error Resume Next
    Dim tbl As ListObject
    Set tbl = wsParam.ListObjects("Parameter")
   
    If tbl Is Nothing Then
        Set tbl = wsParam.ListObjects.Add(xlSrcRange, wsParam.Range("A1:B2"), , xlYes)
        tbl.Name = "Parameter"
    Else
        tbl.Resize wsParam.Range("A1:B2")
    End If
    On Error GoTo 0
   
End Sub
--------------------------------------------------------------------------------------------------
3 PQ code

let
    // 1. Pad ophalen
    BronTabel = Excel.CurrentWorkbook(){[Name="Parameter"]}[Content],
    GeselecteerdPad = List.First(List.RemoveMatchingItems(Table.ToColumns(BronTabel){1}, {null, ""})),

    // 2. Bestand zoeken
    BronMap = Folder.Files(GeselecteerdPad),
    FilterBestanden = Table.SelectRows(BronMap, each Text.StartsWith(Text.Lower([Name]), "euromillions-winnende-my-bonus-codes-")),
    SorteerNieuwste = Table.Sort(FilterBestanden,{{"Date modified", Order.Descending}}),
    CheckBestand = if Table.IsEmpty(SorteerNieuwste) then error "Geen PDF gevonden" else SorteerNieuwste{0}[Content],

    // 3. PDF laden
    Bron = Pdf.Tables(CheckBestand, [Implementation="1.3"]),
    #"Rijen gefilterd" = Table.SelectRows(Bron, each Text.StartsWith([Id], "Table")),

    // 4. Kolommen uitvouwen
    AlleKolomNamen = List.Distinct(List.Combine(List.Transform(#"Rijen gefilterd"[Data], each Table.ColumnNames(_)))),
    #"Data uitgevouwen" = Table.ExpandTableColumn(#"Rijen gefilterd", "Data", AlleKolomNamen),

    // 5. Bedrag extraheren en omlaag invullen
    #"Bedrag Toevoegen" = Table.AddColumn(#"Data uitgevouwen", "Bedrag", each if Text.Contains(Record.Field(_, AlleKolomNamen{0}), "€") then Text.AfterDelimiter(Record.Field(_, AlleKolomNamen{0}), "€") else null),
    #"Omlaag Invullen" = Table.FillDown(#"Bedrag Toevoegen",{"Bedrag"}),
   
    // 6. Filteren op rijen die data bevatten
    #"Alleen Codes Behouden" = Table.SelectRows(#"Omlaag Invullen", each Text.StartsWith(Text.Trim(Record.Field(_, AlleKolomNamen{0})), "B") or Text.Contains(Record.Field(_, AlleKolomNamen{0}), "€")),
   
    // 7. Hulpkolommen verwijderen vóór Unpivot
    #"Hulpkolommen verwijderen" = Table.RemoveColumns(#"Alleen Codes Behouden", {"Id", "Name", "Kind"}),

    // 8. Unpivot
    #"Andere kolommen ontdraaid" = Table.UnpivotOtherColumns(#"Hulpkolommen verwijderen", {"Bedrag"}, "Attribuut", "BonusCodeRaw"),
   
    // 10. De kolom 'Attribuut' verwijderen voor het eindresultaat
    #"Kolommen verwijderd" = Table.RemoveColumns(#"Andere kolommen ontdraaid", {"Attribuut"}),
   
    // 9. Opschonen en Filteren
    #"Spaties Verwijderen" = Table.TransformColumns(#"Kolommen verwijderd", {{"BonusCodeRaw", Text.Trim, type text}}),
    #"Echte Codes Filteren" = Table.SelectRows(#"Spaties Verwijderen", each Text.StartsWith([BonusCodeRaw], "B")),
    #"Type Wijzigen" = Table.TransformColumnTypes(#"Echte Codes Filteren",{{"Bedrag", Int64.Type}, {"BonusCodeRaw", type text}}),
    #"Resultaat" = Table.RenameColumns(#"Type Wijzigen",{{"BonusCodeRaw", "BonusCode"}}),
    #"Dubbele waarden verwijderd" = Table.Distinct(Resultaat, {"BonusCode"})
in
    #"Dubbele waarden verwijderd"

Offline SoftAid

  • Administrator
  • Ambassadeur
  • *****
  • Berichten: 20.696
  • Geslacht: Man
  • Nobody is perfect, not even me...
Re: Iemand idee om PQ code sneller te maken ?
« Reactie #1 Gepost op: 24 mei 2026, 20:11:25 »
Hallo ValentinS,

volgens mijn vriend kan die PQ-code een heel stuk strakker, dus kijk maar of je er iets mee kan...

let
    P = Excel.CurrentWorkbook(){[Name="Parameter"]}[Content][Value]{0},
    N = Table.Sort(Table.SelectRows(Folder.Files(P), each Text.StartsWith(Text.Lower([Name]), "euromillions-winnende-my-bonus-codes-")), {{"Date modified", Order.Descending}}){0}[Content],
    T = Table.SelectRows(Pdf.Tables(N), each Text.StartsWith([Id], "Table")),
    K = List.Distinct(List.Combine(List.Transform(T[Data], each Table.ColumnNames(_)))),
    X = Table.ExpandTableColumn(T, "Data", K),
    B = Table.FillDown(Table.AddColumn(X, "Bedrag", each try Number.From(Text.AfterDelimiter(_{K{0}}, "€")) otherwise null), {"Bedrag"}),
    C = Table.SelectRows(B, each Text.StartsWith(Text.Trim(_{K{0}}), "B")),
    R = Table.Distinct(Table.TransformColumns(Table.UnpivotOtherColumns(C, {"Bedrag"}, "A", "BonusCode"), {{"BonusCode", Text.Trim, type text}}), {"BonusCode"})
in
    R

:) SoftAid :)             

Dubbelposten, het posten op verschillende forums van dezelfde vraag, dient op
voorhand gemeld te worden, met een link naar het topic op de andere site.
Overtreding van deze regel kan bestraft worden met verbanning !
Windows 11 Home 24H2   Office 2024 Pro Plus Nederlands

Offline ValentinS

  • Lid
  • *
  • Berichten: 11
  • Geslacht: Man
Re: Iemand idee om PQ code sneller te maken ?
« Reactie #2 Gepost op: 24 mei 2026, 21:20:59 »
Dank voor de code, heb het getest maar geeft niet gewenst resultaat.
Hier gaat het fout:  C = Table.SelectRows(B, each Text.StartsWith(Text.Trim(_{K{0}}), "B")),
Expression.Error: Een index van het type Text kan niet worden toegepast.

Ik  heb reeds verschillende codes getest maar tot nu toe is de code die ik nu gebruik de snelste, maar omdat het een groot pdf bestand is heeft PQ 22 sec nodig om dit te berekenen !

Offline SoftAid

  • Administrator
  • Ambassadeur
  • *****
  • Berichten: 20.696
  • Geslacht: Man
  • Nobody is perfect, not even me...
Re: Iemand idee om PQ code sneller te maken ?
« Reactie #3 Gepost op: 24 mei 2026, 21:42:34 »
Hallo Valentin,

probeer deze aanpassing eens. Het moeilijkste hieraan is, ik kanje PDF, je kolomnamen, jePDF‑structuur, je Parameter‑tabel en je Excel‑omgeving niet zien.
Dus ik kan nooit 100% garanderen dat het bij jou werkt. Structureel zou het moeten kloppen.

let
    P = Excel.CurrentWorkbook(){[Name="Parameter"]}[Content][Value]{0},
    N = Table.Sort(Table.SelectRows(Folder.Files(P), each Text.StartsWith(Text.Lower([Name]), "euromillions-winnende-my-bonus-codes-")), {{"Date modified", Order.Descending}}){0}[Content],
    T = Table.SelectRows(Pdf.Tables(N), each Text.StartsWith([Id], "Table")),
    K = List.Distinct(List.Combine(List.Transform(T[Data], each Table.ColumnNames(_)))),
    X = Table.ExpandTableColumn(T, "Data", K),
    B = Table.FillDown(Table.AddColumn(X, "Bedrag", each try Number.From(Text.AfterDelimiter(Record.Field(_, K{0}), "€")) otherwise null), {"Bedrag"}),
    C = Table.SelectRows(B, each Text.StartsWith(Text.Trim(Record.Field(_, K{0})), "B")),
    R = Table.Distinct(Table.TransformColumns(Table.UnpivotOtherColumns(C, {"Bedrag"}, "A", "BonusCode"), {{"BonusCode", Text.Trim, type text}}), {"BonusCode"})
in
    R

Succes,

:) SoftAid :)             
Dubbelposten, het posten op verschillende forums van dezelfde vraag, dient op
voorhand gemeld te worden, met een link naar het topic op de andere site.
Overtreding van deze regel kan bestraft worden met verbanning !
Windows 11 Home 24H2   Office 2024 Pro Plus Nederlands

Offline ValentinS

  • Lid
  • *
  • Berichten: 11
  • Geslacht: Man
Re: Iemand idee om PQ code sneller te maken ?
« Reactie #4 Gepost op: 25 mei 2026, 07:56:36 »
Heb uw code beetje aangepast, werkt, maar snelheidswinst is niet merkbaar. De eventuele winst in snelheid kan volgens mij mening bekomen worden met snellere processor, sneller systeem.

Offline Pieke

  • Nieuw lid
  • Berichten: 2
  • Geslacht: Man
Re: Iemand idee om PQ code sneller te maken ?
« Reactie #5 Gepost op: 25 mei 2026, 10:56:31 »
Ik denk dat er tijdswinst te behalen is als het document in .csv- of .xlsx-formaat zou zijn. Ik weet alleen niet of dat haalbaar is. In jouw voorbeeld haalt Power Query nu telkens 92 tabellen uit het PDF, en dat kost enorm veel tijd.

Offline ValentinS

  • Lid
  • *
  • Berichten: 11
  • Geslacht: Man
Re: Iemand idee om PQ code sneller te maken ?
« Reactie #6 Gepost op: 25 mei 2026, 11:29:01 »
De bonuscodes zijn helaas alleen beschikbaar in PDF. Eigenaardig want de trekking en financiële resultaten voor Euromillions zijn CSV. Wanneer ik die verwerk in mijn bestand gaat dat vlug. Waarom ze het zo aanbieden op de website ?

Offline SoftAid

  • Administrator
  • Ambassadeur
  • *****
  • Berichten: 20.696
  • Geslacht: Man
  • Nobody is perfect, not even me...
Re: Iemand idee om PQ code sneller te maken ?
« Reactie #7 Gepost op: 25 mei 2026, 11:36:16 »
Als de PDF tabellen bevat:
Excel ... Gegevens .... Gegevens ophalen .... Uit bestand .... Uit PDF 
Excel haalt de tabellen binnen .... je kunt exporteren naar CSV

:) SoftAid :)             
Dubbelposten, het posten op verschillende forums van dezelfde vraag, dient op
voorhand gemeld te worden, met een link naar het topic op de andere site.
Overtreding van deze regel kan bestraft worden met verbanning !
Windows 11 Home 24H2   Office 2024 Pro Plus Nederlands

Offline ValentinS

  • Lid
  • *
  • Berichten: 11
  • Geslacht: Man
Re: Iemand idee om PQ code sneller te maken ?
« Reactie #8 Gepost op: 25 mei 2026, 12:27:47 »
Wat Pieke schrijft is juist, was beter als het als CSV downloadbaar was.
Bestand wat gemaakt heb was op vraag van oud collega's, zij spelen al vele jaren in groep (33 personen) met Euromillions. De oude versie die ik indertijd voor hen gemaakt heb, toen was er nog geen sprake van bonuscodes, waren alleen trekking en financiële resultaten in CSV. De laatste tijd was er echter weer nood aan nieuw bestand omdat ze al geruime tijd het oude bestand niet meer konden gebruiken wegens de toegevoegde bonuscodes, en alles bij hielden op een papieren versie waar natuurlijk al eens iets fout ging.
Mijn oud collega die nu het nieuwe bestand gebruikt is tot nu toe tevreden maar vroeg of de berekening niet sneller kon, vandaar mijn vraag aan jullie.



Offline ValentinS

  • Lid
  • *
  • Berichten: 11
  • Geslacht: Man
Re: Iemand idee om PQ code sneller te maken ?
« Reactie #9 Gepost op: 31 mei 2026, 18:45:37 »
Ik heb snellere manier gevonden voor PDF import in Excel. VBA en Python.

VBA code:   
Sub RunPythonScriptPDF()
    Dim ShellApp As Object
    Dim PythonExe As String, PythonScript As String, Command As String
    Dim PdfFolder As String, ScriptFolder As String
    Dim CsvPath As String, FoutlogPath As String
    Dim wsParam As Worksheet
   
    Set wsParam = ThisWorkbook.Sheets("Parameter")
   
    ' 1. Paden rechtstreeks uitlezen uit de 4 aparte tabellen
    On Error Resume Next
    PdfFolder = wsParam.ListObjects("tblFile").DataBodyRange(1, 2).Value
    PythonExe = wsParam.ListObjects("tblExe").DataBodyRange(1, 2).Value
    PythonScript = wsParam.ListObjects("tblScript").DataBodyRange(1, 2).Value
    ScriptFolder = wsParam.ListObjects("tblFolder").DataBodyRange(1, 2).Value
    On Error GoTo 0
   
    ' Controleer of alle parameters succesvol zijn geladen
    If PdfFolder = "" Or PythonExe = "" Or PythonScript = "" Or ScriptFolder = "" Then
        MsgBox "Fout: Een of meerdere parameters konden niet worden gevonden.", vbCritical
        Exit Sub
    End If
   
    ' CSV en Foutlog paden samenstellen
    CsvPath = ScriptFolder & "output_codes.csv"
    FoutlogPath = ScriptFolder & "foutlog.txt"
   
    ' Verwijder oud CSV- en foutlogbestand indien aanwezig
    On Error Resume Next
    Kill CsvPath
    Kill FoutlogPath
    On Error GoTo 0

    ' 2. Python uitvoeren (0 = Onzichtbaar venster, True = Wacht op afronding)
    Command = """" & PythonExe & """ """ & PythonScript & """ """ & PdfFolder & """"
    Set ShellApp = CreateObject("WScript.Shell")
    ShellApp.Run Command, 0, True
   
    ' 3. Controleer of de CSV is aangemaakt, zo niet lees foutlog
    If Dir(CsvPath) = "" Then
        If Dir(FoutlogPath) <> "" Then
            MsgBox "Fout in Python script. Bekijk " & FoutlogPath & " voor details.", vbCritical
        Else
            MsgBox "Fout: Python heeft geen data kunnen wegschrijven.", vbCritical
        End If
        Exit Sub
    End If
   
    ' 4. Tabblad controleren of aanmaken
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets("Bonus")
    On Error GoTo 0
   
    If ws Is Nothing Then
        Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        ws.Name = "Bonus"
    Else
        Dim qt As QueryTable
        For Each qt In ws.QueryTables
            qt.Delete
        Next qt
        ws.Cells.Clear
    End If
   
    ' 5. QueryTable om de CSV in te laden
    With ws.QueryTables.Add(Connection:="TEXT;" & CsvPath, Destination:=ws.Range("A1"))
        .TextFileParseType = xlDelimited
        .TextFileSemicolonDelimiter = True
        .Refresh BackgroundQuery:=False
    End With
   
    MsgBox "Klaar! De bonuscodes zijn succesvol bijgewerkt in het tabblad 'Bonus'.", vbInformation
End Sub
-----------------------------------------------------------------------------------------------------
Python script:

import os
import re
import sys
import pandas as pd
import pdfplumber
def verwerk_my_bonus_pdf(geselecteerd_pad):
    # Verwijder spaties én eventuele verdwaalde aanhalingstekens uit het pad
    geselecteerd_pad = geselecteerd_pad.strip().replace('"', "")

# 1. Nieuwste bestand zoeken
    zoek_patroon = r"^euromillions-winnende-my-bonus-codes-.*\.pdf$"
    bestanden = []

    for f in os.listdir(geselecteerd_pad):
        if re.match(zoek_patroon, f, re.IGNORECASE):
            full_path = os.path.join(geselecteerd_pad, f)
            bestanden.append(full_path)

    if not bestanden:
        raise FileNotFoundError(
            f"Geen geldige PDF gevonden in de map: {geselecteerd_pad}"
        )

    # Sorteer op modificatiedatum (nieuwste eerst)
    nieuwste_bestand = max(bestanden, key=os.path.getmtime)

    # 2. PDF uitlezen met pdfplumber
    data_lijst = []
    actueel_bedrag = None

    with pdfplumber.open(nieuwste_bestand) as pdf:
        for pagina in pdf.pages:
            tekst = pagina.extract_text()
            if not tekst:
                continue

            regels = tekst.split("\n")
            for regel in regels:
                regel_clean = regel.strip()

                if "€" in regel_clean:
                    bedrag_match = re.search(r"€\s*(\d+)", regel_clean)
                    if bedrag_match:
                        actueel_bedrag = int(bedrag_match.group(1))
                    continue

                # Zoek naar bonuscodes
                codes = re.findall(r"\bB[A-Z0-9-]+\b", regel_clean)
                for code in codes:
                    if actueel_bedrag is not None:
                        data_lijst.append(
                            {"Bedrag": actueel_bedrag, "BonusCode": code}
                        )

    if not data_lijst:
        raise ValueError("Geen bonuscodes gevonden in de PDF")

    # 3. DataFrame maken en duplicaten verwijderen
    df_resultaat = pd.DataFrame(data_lijst)
    df_resultaat = df_resultaat.drop_duplicates(subset=["BonusCode"])

    # 4. Dynamisch pad bepalen op basis van de huidige Windows-gebruikersnaam
    username = os.getlogin()
    basis_pad = f"C:\\Users\\{username}\\OneDrive\\Bureaublad\\Nationale loterij spellen\\Euromillions\\Script"

    output_csv = os.path.join(basis_pad, "output_codes.csv")
    df_resultaat.to_csv(output_csv, index=False, sep=";")


if __name__ == "__main__":
    if len(sys.argv) > 1:
        pdf_folder_path = sys.argv[1]
        try:
            verwerk_my_bonus_pdf(pdf_folder_path)
        except Exception as e:
            # Sla foutlog dynamisch op
            username = os.getlogin()
            foutlog_pad = f"C:\\Users\\{username}\\OneDrive\\Bureaublad\\Nationale loterij spellen\\Euromillions\\Script\\foutlog.txt"
            with open(foutlog_pad, "w") as f:
                f.write(str(e))

 


www.combell.com