Help!

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

Hulp bij posten

Recente topics

Auteur Topic: vba for..next..-loop wegschrijfvraagje  (gelezen 10213 keer)

0 leden en 1 gast bekijken dit topic.

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #60 Gepost op: 21 januari 2024, 14:26:04 »
Hey molly,

 :thumbsup: _/-\o_

Dit was dus exact wat ik van in het begin in gedachten had  ;)

misschien nog één klein extraatje indien mogelijk.
het zou visueel fijner zijn ingeval de waarde in "A1" opnieuw de originele kolom-titel "Parochie" zou weergeven elke keer het werkblad geactiveerd wordt.
Is dat mogelijk?

groetjes,
Bieke.
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline MollyVH

  • Excel-Expert
  • Oplosser
  • *****
  • Berichten: 847
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #61 Gepost op: 21 januari 2024, 14:33:16 »
Hey Bieke,

Ja natuurlijk, gewoon tussen het verwijderen en het terug toevoegen van de validatie:
With Cells(1, 1).Validation
  .Delete
  Cells(1, 1) = "Parochie"
  .Add Type:=xlValidateList, Formula1:=Join(val_lijst, ",")
End With

Groetjes,
Molly
Windows 11 Home NLD 64bit
11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz 2496
Aspire TC-1660
Intel(R) UHD Graphics 750 1024MB
476 GB SSD KINGSTON OM8PCP3512F-AA
1863 GB HD Seagate ST2000DM008-2FR102
Office 2021 Professional Plus NLD 64bit

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #62 Gepost op: 21 januari 2024, 14:36:55 »
Hey Della,

Hoi, ik blijf eventjes meedenken.
Gezien je Worksheet_Activate gebruikt, lijkt deze oplossing iets?
(zie bijlage)
Bedankt voor het blijven meedenken.
Ik zie in je code dat er geen rekening werd gehouden met nieuwe rijen? Aangezien de lengte van de lijst constant langer zal worden kan/mag er geen vaste eind-rij gebruikt worden.
Ook is die extra combobox niet erg interessant op mijn werkblad aangezien er in mijn 'echt' bestand reeds tal van opdrachtknoppen zullen staat (dus niet enkel de "idx2dig"-knop)

Citaat
Dan heb ik nog een vraagje.
Ik zie dat je onderaan volgende code gebruikt.
Worksheets("DIG_G_PR-" & par).Visible = xlSheetHiddenIs het de bedoeling dat je deze aangemaakte bladen blijft behouden nadat ze zijn opgeslagen als PDF?
Idd, Della, dat is exact de bedoeling, anders zou die code er niet staan.

groetjes,
Bieke
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #63 Gepost op: 21 januari 2024, 14:38:57 »
Hey Bieke,

Ja natuurlijk, gewoon tussen het verwijderen en het terug toevoegen van de validatie:
With Cells(1, 1).Validation
  .Delete
  Cells(1, 1) = "Parochie"
  .Add Type:=xlValidateList, Formula1:=Join(val_lijst, ",")
End With

Groetjes,
Molly
:thumbsup: :thumbsup: :thumbsup: _/-\o_  ;D
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #64 Gepost op: 21 januari 2024, 15:39:05 »
@Molly,

Naarmate elk onderdeel meer vorm krijgt ben ik stilaan mijn 'echt' bestand opnieuw aan het samenstellen.
Voor één onderdeel zou ik een andere aanpak willen proberen, het is te zeggen, de verwerkings-code zelf dient ongewijzigd te blijven maar het gebruikte hulpmiddel zou ik willen aanpassen. Het is maar een idee waarmee ik aan het spelen ben, enerzijds om praktische redenen en anderzijds een beetje uit leergierigheid  ;D en te zien of mijn idee al dan niet mogelijk zou zijn.

Zoals je weet (denk ik toch) werd tussen 1792 en 1806 gebruik gemaakt van de Frans Republikeinse kalender waarvoor ik reeds de nodige converteer-code heb verwerkt in mijn 'echt' bestand. Voor de conversie maak ik gebruik van een tweede bestand dat ik zo'n 15 jaar geleden gemaakt heb waarin de Frans Republikeinse kalender netjes per maand-periode (1 werkblad per periode) staat verwerkt met de corresponderen gregoriaanse datums.

Om te vermijden dat ik elke keer een tweede bestand zou moeten aanspreken zou ik iets willen creëren dat aangemaakt wordt elke keer mijn 'echt' bestand geopend word, dus bij de 'workbook_open'.
Ik zou dus een 3D-array willen aanmaken in dezelfde structuur als mijn uitgewerkt tweede bestand, dus in de vorm "array(1 to 13, 1 to 30, 1 to 14)".
Ik heb al een beetje een werkwijze in gedachten om dit te realiseren maar gezien ik nog niet veel ervaring heb met meervoudige dimensionele arrays zal ik wel wat hulp nodig hebben vrees ik  :).

Ik hoop dit te kunnen realiseren door telkens per jaar van de Fr. Rep. kalender te starten met de gekende corresponderende gregoriaanse datum voor de eerste dag van dat jaar en dan, rekening houdend met het aantal dagen/gregoriaanse maand en de schrikkeljaren via een loop met 1 te verhogen en in de 3D-array te plaatsen.
De Fr. Rep. kalender telt 14 jaren met 12 maanden van 30 dagen en dan nog een 13e maand met de overblijvende dagen.

hoe kan ik dan best de opbouw van mijn codeblok starten?

groetjes,
Bieke
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #65 Gepost op: 22 januari 2024, 12:51:30 »
*update*

Het is me gelukt om die 3D-array(1 to 14, 1 to 13, 1 to 30) correct gevuld te krijgen met de corresponderende gregoriaanse datums :D.
Dus dat is al opgelost. ::thumbsup::

Nu is mijn resterende vraag, is het mogelijke om deze code éénmalig te laten lopen (bij openen van het bestand) en vervolgens het gevulde 3D-array te behouden zolang het bestand geopend is voor gebruik in mijn andere subs ingeval er eens een datum geconverteerd moet worden? Is dit überhaupt mogelijk? Of dien ik deze opvul-code elke keer, dat ik de 3D-array nodig heb, opnieuw te laten lopen?

De converteer-code voor de datum wordt geactiveerd via een “woksheet_change”-event zodra er in één der IDX-werkbladen een Frans Republikeinse datum wordt ingevuld.
Dus het zou wel handig zijn moest ik niet elke keer opnieuw die 3D-array moeten laten vullen.


Groetjes,
Bieke
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline MollyVH

  • Excel-Expert
  • Oplosser
  • *****
  • Berichten: 847
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #66 Gepost op: 22 januari 2024, 12:52:15 »
Hey Bieke,

Een misschien verrassende vraag: zou je dat wel doen... ?  0:-)

Citaat
Zoals je weet (denk ik toch) werd tussen 1792 en 1806 gebruik gemaakt van de Frans Republikeinse kalender
Ja hoor ;) al moest ik de juiste begindatum en nog wat andere details wel even opsnorren...

En die vielen reuze mee, vandaar mijn inleidende vraag.

Maar eerst even kijken of ik mee ben met hoe jij het zag (mogelijk kan je leergierigheid dan later voorbeeldgewijs alsnog bevredigd worden). In die 3D-array zal er één dimensie bestaan voor jaren, één voor maanden en één voor dagen (telkens van de republikeinse kalender) en de inhoud zullen de datums zijn van de gregoriaanse kalender? Vervolgens ga je jaar, maand en dag gebruiken om de locatie in de array te bepalen en er de inhoud van ophalen?
Maar: als je geen extern bestand wil gebruiken én vermoedelijk daarover niets in je (toch al groot) bestand wil toevoegen betekent dat volgens mij automatisch dat je die array zal moeten opvullen iedere keer je het bestand opent!

Over naar een alternatief? De republikeinse kalender begint op 1/1/1 (als ik dat zo mag stellen), elke van de eerste 12 maanden telt 30 dagen, en als er al een schrikkeldag is, dan is de laatste dag van het jaar. Wat kan een mens meer verlangen :)

Waar en wanneer je het in je bestand moet gebruiken vraag ik me daarbij zelfs niet af, want ik denk hierbij eerder aan een udf, en omwille van voorgaande kan die kort zijn:
Function fr2greg(jaar, maand, dag)
   
For j = 1 To jaar - 1
  If j Mod 4 = 3 Then d = 366 Else d = 365
  dagen = dagen + d
Next j
dagen = dagen + ((maand - 1) * 30) + (dag - 1)
fr2greg = DateSerial(1792, 9, 22) + dagen

End Function

Groetjes,
Molly
Windows 11 Home NLD 64bit
11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz 2496
Aspire TC-1660
Intel(R) UHD Graphics 750 1024MB
476 GB SSD KINGSTON OM8PCP3512F-AA
1863 GB HD Seagate ST2000DM008-2FR102
Office 2021 Professional Plus NLD 64bit

Offline MollyVH

  • Excel-Expert
  • Oplosser
  • *****
  • Berichten: 847
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #67 Gepost op: 22 januari 2024, 12:56:55 »
Zie nu, binnen de minuut een post van elk van ons waaruit blijkt dat het vullen van de array ons beiden irriteerde
(in mijn geval zelfs dat eenmalige bij het openen van het bestand :D :D :D)
Windows 11 Home NLD 64bit
11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz 2496
Aspire TC-1660
Intel(R) UHD Graphics 750 1024MB
476 GB SSD KINGSTON OM8PCP3512F-AA
1863 GB HD Seagate ST2000DM008-2FR102
Office 2021 Professional Plus NLD 64bit

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #68 Gepost op: 22 januari 2024, 13:31:04 »
@Molly,

het telkens opnieuw vullen van het array op zich irriteerde me totaal niet hoor maar vond het zelf wat 'zinloos' om elke paar seconden die array opnieuw te laten vullen.
Wat me wél irriteert en ik sowieso wat onpraktisch vind is om telkens dat 2e bestand te moeten gaan openen als ik in mijn hoofdbestand aan het werk wil gaan.
Dat de opvulcode éénmalig doorlopen wordt wanneer het bestand geopend wordt daar zou ik zelfs niets van merken en vond ik dus voor mij het beste alternatief.

Nu, ik heb even, uit nieuwsgierigheid, jouw function-code uitgeprobeerd maar in eerste instantie krijg als resultaat al meteen dit : "#######" en in tweede instantie
 zou ik er dan al een extra kolom moeten gaan voor voorzien waarin ik dan de te gebruiken formule zou moeten plaatsen.
Elk werkblad heeft enerzijds al meer dan voldoende kolommen die écht noodzakelijk zijn en anderzijds hou ik bepaalde werkbladen liever volledig "fomule-vrij".
En als laatste, niet onbelangrijk aspect, in mijn werkblad zal de maand niet als een getal worden ingevuld maar wel met de naam van die maand (vendémiaire, brumaire, frimaire, enz)...

Toch bedankt voor jouw optie-poging. ;)

groetjes,
Bieke


*edit*

PS: maar wat ik wel kan doen is gewoon de berkenings-code zelf (zonder het "function"-aspect) verwerken in mijn converteercode.
      ik bekijk het even maar denk wel dat het dan zo in orde zal zijn :thumbsup:
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #69 Gepost op: 22 januari 2024, 14:15:09 »
*update*

na de gebruikte code in de function-methode geïntegreerd te hebben in mijn converteer-code werkt het perfect (zonder eerst een 2e bestand te moeten openen of eerst een 3D-array te moeten aanmaken  ;D ). :thumbsup:

Het enige wat ik nu nog zou willen "inkorten" is mijn "select case" om de maand-naam om te zetten naar het maand-getal (puur voor het visuele mbt de lengte van het codeblok want de 'select case' doet uiteraard exact wat er moet gedaan worden).
Ik dacht hierbij eventueel aan het vullen van een variabele met een 1D-array en dan het element-getal van waar de betreffende maand vermeld staat in het array als maandgetal te gebruiken.
Ik bekijk het nog even verder...

opgelost! :thumbsup: ;D

groetjes,
Bieke
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline MollyVH

  • Excel-Expert
  • Oplosser
  • *****
  • Berichten: 847
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #70 Gepost op: 22 januari 2024, 16:16:56 »
Hey Bieke,

Citaat
Toch bedankt voor jouw optie-poging
Wat ik dan denk is dat je nog eens meteen wat 'eerste indruk'-bezwaren hebt geuit (toegegeven, naderhand wel redelijk bijgestuurd ;D).
Zelf vond ik (even afstand nemen van 'eigen lof'-gezegdes :D) dat ik een pracht van een functie had geschreven die vooral schittert door haar eenvoud 0:-)

Omwille van je laatste post dus niet als kritiek bedoeld, maar wel in de hoop dat je er inhoudelijk wat van opsteekt:

Citaat
in mijn werkblad zal de maand niet als een getal worden ingevuld maar wel met de naam van die maand
Euh... die kwestie moest je met een array-methode toch ook vooraf regelen...

Citaat
in eerste instantie krijg als resultaat al meteen dit : "#######"
Natuurlijk, de functie resulteert in een datum (vóór 1/1/1900 een probleem voor Excel maar niet voor vba)

Citaat
in tweede instantie zou ik er dan al een extra kolom moeten gaan voor voorzien
Maar neen, een UDF is niet exclusief als werkbladformule bruikbaar! Héél rudimentair voorbeeldje hierbij.

Groetjes,
Molly
Windows 11 Home NLD 64bit
11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz 2496
Aspire TC-1660
Intel(R) UHD Graphics 750 1024MB
476 GB SSD KINGSTON OM8PCP3512F-AA
1863 GB HD Seagate ST2000DM008-2FR102
Office 2021 Professional Plus NLD 64bit

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #71 Gepost op: 22 januari 2024, 16:51:19 »
Hey Molly,

Inderdaad, die omzetting van naam naar getal moest ik ook vooraf regelen met de array-methode, wat ik daar dan ook gedaan had via die 'select case'-methode (welke ik nu netjes anders heb opgelost waardoor ik zo'n 19 lijntjes code korter zit  :) )

Wat de udf betreft had ik ondertussen ook al gemerkt dat deze niet exclusief voor gebruik als werkbladformule gebruikt kan worden  ;D

Mijn code ziet er nu zo uit :
in elk werkblad deze "worksheet_change"-event :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim frepdag As Variant, frepmnd As Variant, frepjr As Variant
  If Target.Column = 7 Then
    frepdag = Cells(Target.Row, 5)
    frepmnd = Cells(Target.Row, 6)
    frepjr = Cells(Target.Row, 7)
    If frepdag <> "" And frepmnd <> "" And frepjr <> "" Then
      frep_conv frepdag, frepmnd, frepjr
      Cells(Target.Row, 2) = ndatum(0)
      Cells(Target.Row, 3) = ndatum(1)
      Cells(Target.Row, 4) = ndatum(2)
    End If
  End If
End Sub

en dan in een aparte module deze converteer-sub :
Sub frep_conv(tmp_dag, tmp_mnd, tmp_jaar)
  Dim frepmndn, i As Long, j As Long, d As Long, dagen As Long
  frepmndn = Array("vendémiaire", "brumaire", "frimaire", "nivôse", "pluviôse", "ventôse", "germinal", "floréal", "prairial", "messidor", "thermidor", "fructidor", "jours complémentaires")
  ReDim Preserve frepmndn(1 To 13)
  For i = 1 To 13
    If frepmndn(i) = tmp_mnd Then
      tmp_mnd = i
      Exit For
    End If
  Next i
  For j = 1 To tmp_jaar - 1
    If j Mod 4 = 3 Then d = 366 Else d = 365
    dagen = dagen + d
  Next j
  dagen = dagen + ((tmp_mnd - 1) * 30) + (tmp_dag - 1)
  ndatum = Split(DateSerial(1792, 9, 22) + dagen, "/")
End Sub

groetjes,
Bieke

P.S.: jouw berekeningscode is inderdaad een geweldig en eenvoudig codeblokje  \o/ :thumbsup: ;D
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline MollyVH

  • Excel-Expert
  • Oplosser
  • *****
  • Berichten: 847
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #72 Gepost op: 22 januari 2024, 17:33:30 »
Hey Bieke,

Klaar voor nog een extraatje?

In je converteer-sub kan je
ReDim Preserve frepmndn(1 To 13)
For i = 1 To 13
  If frepmndn(i) = tmp_mnd Then
    tmp_mnd = i
    Exit For
  End If
Next i
vervangen door
tmp_mnd = Application.Match(tmp_mnd, frepmndn, 0)
En, hoewel volledig achterhaald in dit project, misschien nog een weetje voor latere kwesties:
Citaat
is het mogelijke om deze code éénmalig te laten lopen (bij openen van het bestand) en vervolgens het gevulde 3D-array te behouden zolang het bestand geopend is voor gebruik in mijn andere subs ingeval er eens een datum geconverteerd moet worden? Is dit überhaupt mogelijk?
Wel, daar heb je gisteren zelf :D het antwoord op gegeven in een ander draadje, nl. "public" (want een array is ook een 'variabele' ;))

Groetjes,
Molly
Windows 11 Home NLD 64bit
11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz 2496
Aspire TC-1660
Intel(R) UHD Graphics 750 1024MB
476 GB SSD KINGSTON OM8PCP3512F-AA
1863 GB HD Seagate ST2000DM008-2FR102
Office 2021 Professional Plus NLD 64bit

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #73 Gepost op: 22 januari 2024, 20:13:55 »
Hey Molly,

bedankt voor de extra inkorting  ;D :thumbsup:

Inzake die 'public'-variabele om een sub maar één keer te moeten laten doorlopen had ik uitgetest maar dit werkte enkel de eerste keer dat ik de array nodig had. Zodra ik hem een 2e keer wou aanspreken bleek hij terug 'leeg' te zijn. Maar goed, dat zijn zorgen voor als ik het eens écht nodig heb  :D.

Terug naar mijn actuele problemen/vragen  :)

Bij het verder op punt zetten van mijn 'echt' bestand ben ik toe gekomen aan mijn 'stats'-werkbladen.
Hiervoor had ik zo'n week of twee geleden reeds 2 subs geschreven maar bij nader inzien zijn de opbouw en de gekozen methoden niet zo efficiënt qua snelheid.
Voor een 50 tal te verwerken rijen per werkblad lukt het nog maar in mijn echte bestand zullen dat duizenden rijen per werkblad worden aan 6 werkbladen die doorzocht en berekend moeten worden dus dan zijn de gekozen 'tel-methodes' in deze 2 subs alles behalve geschikt.
Ik heb dus 2 'stats'-werkbladen, het eerste voor de 'statistieken/jaar/parochie' en het 2e voor de 'statistieken/naam/parochie'.
Als je de subs bekijkt (die nog gebaseerd zijn op maar 3 te doorzoeken werkbladen) zal je meteen zien, zelfs zonder te testen, dat deze zéér vertragend werken  ;D.

Dus, indien je er tijd en zin voor hebt, graag jouw tips voor een efficiëntere code  :)

In bijlage mijn laatste versie (5.0)

groetjes,
Bieke
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.031
  • Geslacht: Vrouw
  • veni vidi vici
Re: vba for..next..-loop wegschrijfvraagje
« Reactie #74 Gepost op: 23 januari 2024, 09:52:50 »
***update***

Heb ondertussen toch zelf nog geprobeerd de sub's aan te passen en ben tot de oplossing gekomen om ze in twee te splitsen...
Enerzijds het plaatsen van de unieke waarden die geteld moeten worden in de betreffende kolom op het 'stats'-werkblad.
En anderzijds dan de eigenlijke telling.
Bij het testen van de subs was er al een geweldige verbetering qua snelheid maar gezien er maar een dikke 30-tal rijen te verwerken zijn in het test-bestand heb ik geen idee hoe de snelheid gaat zijn bij duizenden rijen....

De telmethode zelf heb ik voor beide subs behouden maar de plaatsing voor de te tellen waarden heb ik dus helemaal anders aangepakt, telkens in een aparte sub die eerst aangeroepen wordt door de tel-sub.
Dit zijn de aparte subs :
Option Explicit

Sub uniekejaren()
  Dim wsStats As Worksheet, wsFltr1 As Worksheet, wsFltr2 As Worksheet, wsFltr3 As Worksheet, wsFltr4 As Worksheet, wsFltr5 As Worksheet, wsFltr6 As Worksheet
  Set wsStats = Sheets("stats-jr-par")
  Set wsFltr1 = Sheets("IDX_G_PR")
  Set wsFltr2 = Sheets("IDX_H_PR")
  Set wsFltr3 = Sheets("IDX_O_PR")
  Set wsFltr4 = Sheets("IDX_G_BS")
  Set wsFltr5 = Sheets("IDX_H_BS")
  Set wsFltr6 = Sheets("IDX_O_BS")
  wsStats.Range("A3:S" & Rows.Count).ClearContents
  wsFltr1.Range("D2:D" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA1"), True
'  wsFltr2.Range("D2:D" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
'  wsFltr3.Range("D2:D" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
'  wsFltr4.Range("D2:D" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
'  wsFltr5.Range("D2:D" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
'  wsFltr6.Range("D2:D" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
  wsStats.Range("AA1:AA" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("A3"), True
  wsStats.Range("AA:AA").ClearContents
End Sub

Sub uniekenamen()
  Dim wsStats As Worksheet, wsFltr1 As Worksheet, wsFltr2 As Worksheet, wsFltr3 As Worksheet, wsFltr4 As Worksheet, wsFltr5 As Worksheet, wsFltr6 As Worksheet
  Dim n As Long, d As Long, naam As Variant
  Set wsStats = Sheets("stats-nm-par")
  Set wsFltr1 = Sheets("IDX_G_PR")
  Set wsFltr2 = Sheets("IDX_H_PR")
  Set wsFltr3 = Sheets("IDX_O_PR")
  Set wsFltr4 = Sheets("IDX_G_BS")
  Set wsFltr5 = Sheets("IDX_H_BS")
  Set wsFltr6 = Sheets("IDX_O_BS")
  wsStats.Range("A3:T" & Rows.Count).ClearContents
  wsFltr1.Range("I2:I" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA1"), True
'  wsFltr2.Range("I2:I" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
'  wsFltr3.Range("I2:I" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
'  wsFltr4.Range("I2:I" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
'  wsFltr5.Range("I2:I" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
'  wsFltr6.Range("I2:I" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("AA" & Rows.Count + 1), True
  wsStats.Range("AA1:AA" & Rows.Count).AdvancedFilter xlFilterCopy, , wsStats.Range("B3"), True
  wsStats.Range("AA:AA").ClearContents
  With wsStats
    For n = 3 To .Cells(Rows.Count, 2).End(xlUp).Row
      naam = .Cells(n, 2)
      d = Sheets("famnm-conv").Rows("1:150").Find(naam, LookIn:=xlValues, LookAt:=xlWhole).Column
      .Cells(n, 1) = Sheets("famnm-conv").Cells(1, d)
    Next n
  End With
End Sub

Moest er, puur qua snelheid gezien, toch nog een betere methode zijn dan lees ik het graag  :)

groetjes,
Bieke

1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

 


www.combell.com