Cel vullen met opvolgend nr uit folder

Status
Niet open voor verdere reacties.

Rietv

Gebruiker
Lid geworden
22 nov 2020
Berichten
49
Hallo iedereen.

Allereerst natuurlijk vast de beste wensen voor 2021.
En hopelijk kunnen jullie mij nog tussen de oliebollen door op weg hepen.

Ik zou graag een cel willen vullen met de waarde plus 1 verkregen door het aantal pdf's in een map te tellen.
De map zelf moet opgezocht worden door gebruik van variabele.

Kortom, ik zou graag het aantal PDF's willen tellen en deze dan ophogen met (-0001) zodat ik altijd een unieke naam heb.
Hopelijk is het bestandje en mijn vraag duidelijk voor jullie.

Gr Cor
 

Bijlagen

  • Testmap001.xlsm
    14,9 KB · Weergaven: 22
zoiets misschien?

Code:
Sub TelBestanden()
Dim i As Integer
Path = Range("$B$9") & Range("$B$10")
    Bestand = Dir(Path & "*.pdf")
    If Bestand = "" Then
        i = 0
    Else
        While Bestand <> ""
            i = i + 1
            Bestand = Dir()
        Wend
    End If
    
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        Path & Range("B11").Value, Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        False
End Sub
 
Beste Luc,

Is het niet helemaal eigenlijk.
Met jou suggestie wordt er nu gekeken welke folder en subfolder dus dat gaat helemaal top.
Het opslaan gedeelte kan er wel uit, want dat regel ik met een andere macro.

Dus wat ik eigenlijk wil is dat hij kijkt hoeveel pdf's er in die subfolder staan.
En aan de hand daarvan een nieuw boekingsnummers maakt.
Dus als er 5 pdf's in staan dat hij automatisch -0006 in de cel B4 plaatst.
En de macro automatisch start met het openen van het blad zodat die cel gelijk met het juiste nummer gevuld is.

Gr Cor
 
voer de code toch maar 's uit.
Dit gedeelte zorgt voor een oplopend nummer.

Code:
        While Bestand <> ""
            i = i + 1
            Bestand = Dir()
        Wend
        Range("B4").Value = i

Tuurlijk... de code kan wellicht anders, zonder dat je alles in cellen gaat opslaan, maar die doet wel wat je vroeg.
Bovendien heb ik zo veel mogelijk je eigen code gebruikt die er al in zat, wat het voor jou misschien wel makkelijker maakt om te zien waar de verschillen zitten.

ps. toch nog vergeten er een stukje bij te plaatsen. Ik zet het hier toch nog even bij:

Range("B4").Value = i

Sorry... inderdaad vergeten om het oplopend getal eventjes in een cel op te slaan. Ik weet nu niet of die B4 de bewuste cel in je bestand is.
 
Laatst bewerkt:
Hoi Luc,

Natuurlijk super bedankt, het werkt nu door de range erbij te zetten. Top dus....
Enige is dat hij nu wel eerst een Pietje0 gebruikt als alles leeg is in de Dir.
Heb je daar toevallig ook een oplossing voor.
Kortom dat hij altijd begint met 1 als alles leeg is. (liefst -0001). Heb al e.e.a geprobeerd door de waarde op te hogen.
Alleen gaat het dan niet goed met de vervolg boekingsnummers.

Ben er echt blij mee. maar als je een betere suggestie/versie hebt die hetzelfde doet.
Helemaal prima hoor, want dan verdiep ik me gewoon daar in.
Wil graag zoveel mogelijk alles gelijk goed leren te begrijpen zeg maar.
En is er ook een mogelijkheid om het nr er automatisch neer te zetten bij het openen van de sheet?
Dus dan gelijk zonder tussenkomst de macro te laten uitvoeren.
Dan zou het helemaal top zijn.

Voor nu nogmaals harstikke bedank en weer goed geholpen.
Wellicht hoor ik het nog anders voor nu een gezond en gelukkig 2021!

Gr Cor
 
Alles gelijk goed leren zal moeilijk zijn :).
Ik ben er al jaren mee bezig, en ontdek nog steeds nieuwe dingen (of ik bedenk ze zelf).

Maar goed... misschien kom ik er nog op terug. Hou er bijvoorbeeld rekening mee dat om de één of andere redenen het zou kunnen dat één van je pdf bestanden verwijderd is, waardoor het oplopend nummer zou resulteren in een nummer dat al bestaat :(.

Tja... met het programmeren moet je eigenlijk rekening houden met alle stomme uitzonderingen. Nu natuurlijk oudejaar, met super beperkte kring, maar dan ga ik niet aan de pc zitten.

Vooral voor iedereen toch nog een fijne jaarovergang gewenst.
 
Code:
Sub VenA()
  MsgBox Format(Application.Max(0, UBound(Split(CreateObject("wscript.shell").exec("cmd /c Dir " & Range("$B$9") & Range("$B$10") & "*.pdf /b").stdout.readall, vbCrLf))) + 1, "-0000")
End Sub
 
Voila... omdat je wat wil bijleren.
Een functie die doet wat je wil, én met de nodige uitleg bij, om te begrijpen wat alles doet.

Code:
Function OpslaanAls(strBestandslocatie As String, strBestandsnaam As String)
    ' Fuctie kan als volgt gebruikt worden: OpslaanAls "C:\Bureaublad\", "BestandsnaamZonderNummer"
    On Error Resume Next            ' Zorgt er voor dat de functie niet blokkeert wanneer er bestanden in die map zitten, die problemen veroorzaken
    
    Dim i               As Integer  ' Nummer dat aan je bestand gegeven gaat worden
    Dim iTemp           As Integer  ' Hoogste nummer dat gevonden wordt in je map
    Dim Bestand         As String   ' Gevonden bestandsnaam
    Dim iBestandsnaam   As Integer  ' Aantal karakters in je bestandsnaam, om te kunnen bepalen op welke plaats je nummer staat
    
    
    iBestandsnaam = Len(strBestandsnaam) ' Vaststellen van het aantal karakters in je bestandsnaam
    
    i = 0 ' Dit kan weggelaten worden, tenzij je niet met nummer 1 wil beginnen, maar met een ander nummer.  Gebruik géén negatieve nummers.
    
    Bestand = Dir(strBestandslocatie & bestandsnaam & "*.pdf") ' Bestand wordt gezocht op de bestandslocatie, maar enkel degene die ook de bestandsnaam hebben
    If Bestand <> "" Then
        While Bestand <> ""     ' Loopt door alle aanvaardbare bestanden
            iTemp = CInt(Mid(Bestand, iBestandsnaam + 2, 4)) ' Bepaalt het nummer van het gevonden bestand
            If iTemp > i Then       ' te gebruiken bestandsnummer wordt gewijzigd wanneer er een hoger nummer gevonden wordt.
                i = iTemp
                Bestand = Dir()
            End If
        Wend
        
    End If
    
    i = i + 1  ' i is nu gelijk met het hoogste gevonden nummer (of 0 wanneer er geen gevonden is).  Vermits dit nummer al bestaat wordt er dus 1 bijgeteld.
    
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        strBestandslocatie & strBestandsnaam & "-" & Format(i, "0000") & ".pdf", Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        False ' opslaan van het werkblad.  Vermits dit bijna automatisch samenhangt met deze functie, zou ik dit er niet van loskoppelen.
        
End Function
 
Beste Luc,

Helemaal top. Zeker de bijgeplaatste uitleg.
Alleen loopt excel vast zodra ik de bestands locatie (B9) en de naam (B2) invul.
Enig idee hoe dit kan? Er staan overigens drie pdf's en 1 subfolder in D:\Hoofdmap\
Mocht je nog tijd/zin hebben dan hoor ik het graag.

Gr Cor
 
Hier had ik inderdaad nog een opmerking aan kunnen toevoegen:

Code:
Function OpslaanAls(strBestandslocatie As String, strBestandsnaam As String)

String wil zeggen: een tekst.
Dus de argumenten die deze functie vraagt zijn woorden, en géén locaties (B2) is een locatie, en dan zou het zijn

Code:
Function OpslaanAls(strBestandslocatie As Range, strBestandsnaam As Range)

Maar opgelet: enkel deze veranderingen zijn nog onvoldoende om de code te verwerken.

Mij lijkt het echter dat je deze functie niet zomaar als een formule in je excel werkblad kan gebruiken. 't Zou ook onlogisch zijn, gezien deze functie slechts éénmaal per bestand gebruikt mag worden.

Voer deze Sub bijvoorbeeld eens uit, en dan zal het wellicht wel werken:

Code:
Sub Test()
OpslaanAls "C:\Bureaublad\", "Test"
End Sub

Uiteraard in de veronderstelling dat je bovenstaande functie in hetzelfde bestand hebt geplaatst.
Ik ga er ook van uit dat je een Bureaublad op je C schijf hebt.

Voor de juiste bestandslocatie: klik eens rechts op een bestand, of een map, en kies dan voor eigenschappen. Dan zie je daar wel de juiste locatie staan.
 
Laatst bewerkt:
Toch nog even getest wanneer ik de functie in een werkblad invul... en ook dan werkt het, met een celverwijzing.
Maar het is niet aangeraden.
Om het zelf te testen: maak eens een extra map in de hoofdmap, waarin weinig bestanden staan, en verwijs rechtstreeks naar die map. Zo heb je de vertraging niet als zou de code te veel bestanden moeten controleren.
 
Code nog eens getest. Wanneer er bestandsnamen in je map zitten die een fout kunnen veroorzaken, loopt de code inderdaad vast.
Een kleine aanpassing dus, waardoor dit probleem verholpen is. Met opnieuw de opmerkingen er bij.

Code:
Function OpslaanAls(strBestandslocatie As String, strBestandsnaam As String)
    ' Fuctie kan als volgt gebruikt worden: OpslaanAls "C:\Bureaublad\", "BestandsnaamZonderNummer"
    On Error Resume Next            ' Zorgt er voor dat de functie niet blokkeert wanneer er bestanden in die map zitten, die problemen veroorzaken
    
    Dim i               As Integer  ' Nummer dat aan je bestand gegeven gaat worden
    Dim iTemp           As Integer  ' Hoogste nummer dat gevonden wordt in je map
    Dim Bestand         As String   ' Gevonden bestandsnaam
    Dim iBestandsnaam   As Integer  ' Aantal karakters in je bestandsnaam, om te kunnen bepalen op welke plaats je nummer staat
    
    Err.Number = 0                  ' Wanneer er geen fout is, staat de Err.Number automatisch op 0.  Nu zet ik dit opzettelijk op 0 omdat ik wil controleren of er een fout voorkomt.
    iBestandsnaam = Len(strBestandsnaam) ' Vaststellen van het aantal karakters in je bestandsnaam
    
    i = 0 ' Dit kan weggelaten worden, tenzij je niet met nummer 1 wil beginnen, maar met een ander nummer.  Gebruik géén negatieve nummers.
    
    Bestand = Dir(strBestandslocatie & bestandsnaam & "*.pdf") ' Bestand wordt gezocht op de bestandslocatie, maar enkel degene die ook de bestandsnaam hebben
    If Bestand <> "" Then
        While Bestand <> ""     ' Loopt door alle aanvaardbare bestanden
            iTemp = CInt(Mid(Bestand, iBestandsnaam + 2, 4)) ' Bepaalt het nummer van het gevonden bestand.  Hier zou een fout kunnen ontstaan, wanneer je bijvoorbeeld een letter wil omzetten naar een nummer.
            If Err.Number = 0 Then      ' De code loopt door zolang er geen fout vastgesteld is.
                If iTemp > i Then       ' te gebruiken bestandsnummer wordt gewijzigd wanneer er een hoger nummer gevonden wordt.
                    i = iTemp
                    Bestand = Dir()
                End If
            Else                        ' Wanneer er echter wel een fout vastgesteld wordt, dan moeten de noodzakelijke handelingen toch nog uitgevoerd worden
                Bestand = Dir()
                Err.Number = 0          ' waarna de Err.Number terug op 0 komt.
            End If
        Wend
        
    End If
    
    i = i + 1  ' i is nu gelijk met het hoogste gevonden nummer (of 0 wanneer er geen gevonden is).  Vermits dit nummer al bestaat wordt er dus 1 bijgeteld.
    
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        strBestandslocatie & strBestandsnaam & "-" & Format(i, "0000") & ".pdf", Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        False ' opslaan van het werkblad.  Vermits dit bijna automatisch samenhangt met deze functie, zou ik dit er niet van loskoppelen.
        
End Function
 
Laatst bewerkt:
Ha die Luc,

Het enige waar ik nu niet echt uitkom is waar hij de bestands locatie vandaan c.q uithaalt.
Voorheen hadden we natuurlijk deze
Code:
Path = Range("$B$9") & Range("$B$10")
    Bestand = Dir(Path & "*.pdf")

Kan die er gewoon tussen gezet worden zodat hij weer kijkt naar de "hoofdmap en subfolder"?

Gr Cor

ps Voor de rest begin ik het redelijk te begrijpen. Tenminste denk ik.....
Dus als je ook nog uit kan leggen waar hij de huidige bestandslocatie vandaan haalt dan wordt dat stukje ook weer wat duidelijker.

Gr Cor
 
#7 blijkbaar gemist? Met 1 regel code kan je de bestanden in 1 directory uitlezen en filteren of het een .pdf is. Geen overbodige variabelen en lusje voor nodig.
 
Jazeker,

Wel gezien en geprobeerd.
Alleen geeft die een MsgBox en ik zou graag willen dat de cel B4 gevuld wordt met het nummer.
Vandaar dat ik er verder nog niks mee had gedaan.
Maar ik ga er ook zeker naar kijken hoe deze in elkaar steekt.
En kijken of ik eruit kan komen om dat voor elkaar te krijgen.
Dus dat staat ook op de wensenlijst zeg maar.
Voor nu thanks voor je input en mocht je ook de oplossing weten voor mijn vraag... graag.


Gr Cor
 
Hoe moeilijk kan het zijn om de waarde dan in B4 te krijgen? Een msgbox is handig middel om even te kijken of je de juiste waarde krijgt.

Code:
Range("B4") = Format(Application.Max(0, UBound(Split(CreateObject("wscript.shell").exec("cmd /c Dir " & Range("$B$9") & Range("$B$10") & "*.pdf /b").stdout.readall, vbCrLf))) + 1, "-0000")
 
Beste VenA,

Dank je voor je input, en ja als het weet is eigenlijk niks moeilijk toch?
Maar wederom een stukje verder met mijn leerproces.
Hoewel ik er niet echt veel van snap.
Lijkt mij geen VBA of vergis ik mij nu.
Enfin, wel thanks voor je input en het meedenken. Top

Gr Cor
 
Het is juist VBA. Alleen is het wat lastig te lezen. Volgens mij is de applcation.max overbodig nu ik het herlees.

Code:
Range("B4") = Format(UBound(Split(CreateObject("wscript.shell").exec("cmd /c Dir " & Range("$B$9") & Range("$B$10") & "*.pdf /b").stdout.readall, vbCrLf)) + 1, "-0000")
 
Laatst bewerkt:
Hier een voorbeeldje:
Ga naar macro's, en voer de macro TestFunction uit (dat is die macro die ik gegeven had)
Voer vervolgens ook de macro TestVenA uit. Dat is de macro van VenA... wat al een heel mooie is, ik had er zelf niet opgekomen.

De voor en nadelen:
Die van mij zoekt het hoogste nummer op, en maakt er eentje bij dat hoger is. Géén kans dus op dubbele namen.
Die macro is uiteraard een stukje langer.

Die van VenA telt de bestanden, en geeft dan een nummer. Zeer kort, maar met het nadeel dat als er bestanden ontbreken, je wel 's dubbele nummers zou kunnen krijgen.

Aan jou de keuze hoe je het gaat oplossen. Ze kunnen dus beiden voldoen.

En zoals VenA zopas opmerkte: wat lastig te lezen. Ik heb er zelf wat moeite mee. Maar toch nog proficiat met je oplossing.
 

Bijlagen

  • Testmap001 (1).xlsm
    20,1 KB · Weergaven: 20
Laatst bewerkt:
Die van VenA telt de bestanden, en geeft dan een nummer. Zeer kort, maar met het nadeel dat als er bestanden ontbreken, je wel 's dubbele nummers zou kunnen krijgen.

Is een beetje kul augment wat in jouw code ook niet ondervangen wordt. Als je het laatste bestand verwijderd klopt de nummering ook niet meer.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan