Help!

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

Hulp bij posten

Recente topics

Auteur Topic: VBA sorteerregels onder voorwaarden  (gelezen 693 keer)

0 leden en 1 gast bekijken dit topic.

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
VBA sorteerregels onder voorwaarden
« Gepost op: 06 februari 2024, 10:20:59 »
Goede voormiddag allemaal,

In één van mijn projecten heb ik voor één der werkbladen volgende code voor de sorteerregels :

With Sheets("klaar").Sort
   .SortFields.Clear: .SortFields.Add Key:=Range("G2"): .SortFields.Add Key:=Range("F2"): .SetRange Range("A2:H500"): .Header = xlNo: .Apply
End With

Met de code op zich is niets verkeerd en een gewone aanpassing mbt de sorteerregels is ook geen probleem maar de sorteerregels dienen aangepast te worden op basis van bepaalde voorwaarden en daar komt ik toch wel een beetje vast te zitten.

De eerste vijf rijen van dit werkblad worden via formules weergegeven op mijn werkblad "dashboard" alwaar ik ermee aan de slag ga voor verdere verwerking. Echter met bovenstaande sorteerregels worden niet altijd de juiste rijen bovenaan geplaatst waardoor ik dan via mijn dashboard niet de gewenste rijen kan verwerken.

De sorteerregels zouden via volgende voorwaarden gesorteerd dienen te worden :
Eerst de rijen waarbij de waarden in kolom ‘G’ gelijk zijn aan ‘0’ en dit in oplopende volgorde van kolom ‘A’.
Dan de rijen waarbij de waarde in kolom ‘G’ gelijk is aan de waarde van kolom ‘F’ en dit in aflopende volgorde van kolom ‘F’ of ‘G’.
Tenslotte de resterende rijen in oplopende volgorde van kolom ‘A’.

Is dit überhaupt mogelijk en zoja, wat is hiervoor dan de correcte opbouwstructuur?

Alvast dank op voorhand.

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 sorteerregels onder voorwaarden
« Reactie #1 Gepost op: 06 februari 2024, 16:21:21 »
Hey Bieke,

Citaat
Is dit überhaupt mogelijk
Ja en neen :D :D

Ook je bestaande code proberen uitbreiden zal m.i. geen oplossing bieden. Veel verder dan de 'standaard' mogelijkheden die je op een werkblad hebt, dus zonder vba, kom je daar niet mee.
Als ik zo ruwweg je voorwaarden bekijk zal je hier echt een sorteeralgoritme 'op maat' nodig hebben, dat herleidt de mogelijkheden tot één, met name het helemaal zelf gaan uitschrijven, dus los van Excel-sorteermethodes.
Voor sommigen onder ons (ik durf mezelf daar bij rekenen :D 0:-)) zal dat weer 'a walk in the park' zijn. Ik sluit niet uit dat je dat zelf ook in orde krijgt, maar het kan niet de bedoeling zijn dat je opnieuw 'dagen zal verliezen' zoals onlangs, dus als je niet gauw het licht ziet puzzel ik het wel even uit.

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.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: VBA sorteerregels onder voorwaarden
« Reactie #2 Gepost op: 06 februari 2024, 21:59:46 »
Hey Molly,

Na het lezen van je berichtje ben ik meteen aan de slag gegaan.
In theorie weet ik min of meer wat er moet gebeuren maar na 5u proberen krijg ik het maar niet vertaald naar de juiste structuur en/of syntax wegens te beperkte kennis van bepaalde methodes.
Moest ik daar wat meer inzicht (lees kennis) in hebben dan zou het mij uiteindelijk wel lukken om zelf een goed werkend codeblok in elkaar te puzzelen maar momenteel vind ik het gewoonweg niet  :'( :-[

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 sorteerregels onder voorwaarden
« Reactie #3 Gepost op: 06 februari 2024, 23:33:06 »
Hey Bieke,
Heb momenteel enkel de phone in de buurt, maar morgen rond de klok van 10 heb ik wel even tijd. Komt zeker goed, hoor.
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 sorteerregels onder voorwaarden
« Reactie #4 Gepost op: 07 februari 2024, 10:01:07 »
Hey Bieke,

De planning verloopt zoals verwacht: het eerste overleg is tijdig afgerond.
Hierbij dus de beloofde code. Delen ervan zouden wel degelijk met de Sort-methode kunnen gebeuren, maar naar mijn gevoel zou ik daar weinig mee gewonnen hebben, daarom heb ik het maar voor elke 'fase' bij dezelfde techniek gehouden, en dat maakte het ook simpeler om alles buiten het werkblad te regelen.
Mocht het nog niet 100% doen zoals je wou, dan lees ik het later wel.
En nu iets minder aangenaam: op naar de volgende meeting :(

Groetjes,
Molly

Sub raar_sorteren()

arr = Cells(1, 1).CurrentRegion
ReDim arr_r(1 To UBound(arr))
For i = 1 To UBound(arr)
  arr_r(i) = Application.Index(arr, i, 0)
  If arr_r(i)(7) = 0 Then
    aantal_0 = aantal_0 + 1
  Else
    If arr_r(i)(6) = arr_r(i)(7) Then aantal_fg = aantal_fg + 1
  End If
Next i
For i = 2 To UBound(arr) - 1
  For j = i + 1 To UBound(arr)
    If arr_r(j)(7) = 0 And arr_r(i)(7) <> 0 Then
      tmp = arr_r(j)
      arr_r(j) = arr_r(i)
      arr_r(i) = tmp
    End If
  Next j
Next i
For i = 2 To aantal_0
  For j = i + 1 To aantal_0 + 1
    If arr_r(j)(1) < arr_r(i)(1) Then
      tmp = arr_r(j)
      arr_r(j) = arr_r(i)
      arr_r(i) = tmp
    End If
  Next j
Next i
For i = aantal_0 + 2 To UBound(arr) - 1
  For j = i + 1 To UBound(arr)
    If arr_r(j)(7) = arr_r(j)(6) And arr_r(i)(7) <> arr_r(i)(6) Then
      tmp = arr_r(j)
      arr_r(j) = arr_r(i)
      arr_r(i) = tmp
    End If
  Next j
Next i
For i = aantal_0 + 2 To aantal_0 + aantal_fg
  For j = i + 1 To aantal_0 + aantal_fg + 1
    If arr_r(j)(6) > arr_r(i)(6) Then
      tmp = arr_r(j)
      arr_r(j) = arr_r(i)
      arr_r(i) = tmp
    End If
  Next j
Next i
For i = aantal_0 + aantal_fg + 2 To UBound(arr) - 1
  For j = i + 1 To UBound(arr)
    If arr_r(j)(1) < arr_r(i)(1) Then
      tmp = arr_r(j)
      arr_r(j) = arr_r(i)
      arr_r(i) = tmp
    End If
  Next j
Next i
For i = 1 To UBound(arr)
  Cells(i, 1).Resize(, 8) = arr_r(i)
Next i

End Sub
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.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: VBA sorteerregels onder voorwaarden
« Reactie #5 Gepost op: 07 februari 2024, 11:25:45 »
@Molly,

Hartelijk dank voor de code en de tijd die je hebt vrijgemaakt ervoor. :thumbsup:
Ben wel blij te zien dat ik met mijn pogingen volledig in de juiste richting zat en dat het louter te maken had met mijn beperkte kennis tov voornamelijk meerdimensionele arrays en in iets mindere mate tov opbouwstructuur dat ik er zelf niet uit kwam  :).

Ik heb de code nog niet getest maar heb wel al een vraagje en extra toelichting.

Aangezien de sorteercode aangeroepen wordt vanaf mijn werkblad 'dashboard' en de sorteer-procedure zelf, die je aangereikt hebt, achter het te sorteren werkblad ("klaar") gaat komen te staan, gaat deze dan nog correct werken als ik deze aanroep vanuit het werkblad 'dashboard'? Ik vraag dit maar omdat ik in het verleden al wel regelmatig conflicten heb ervaren mbt de locatie van de code en de locatie van de aanroeping.

Dan heb ik nog een kleine 'toelichting' met betrekking tot het 'rare'-aspect van de voorwaarden  :D
Zodra een item (via het werkblad "dashboard") wordt toegevoegd aan het werkblad "klaar" heeft de cel in kolom 7 de waarde '0' wat betekend dat hier nog alle handelingen op moeten worden toegepast. Als er een tussen-bewerking plaatsvind, krijgt (opnieuw via het werkblad "dashboard") de cel in kolom 7 dezelfde waarde als in kolom 6. Zodra de eindbewerking heeft plaatsgevonden krijgt de cel in kolom 7 (opnieuw via werkblad "dashboard") een nieuwe waarde die altijd kleiner is dan de waarde in kolom 6.
Globaal dienen de items dus in volgorde van nog uit te voeren handelingen gesorteerd te staan, dus eerst de items die nog geen handelingen hebben gekregen, dan de items die al een tussen-bewerking hebben gekregen en tenslotte de items die volledig afgewerkt zijn. De items met waarde 0 en de volledig afgewerkte item dienen dan onderling gesorteerd te worden op hun ID-nr (kolom 1). De items met gelijke waarde dienen onderling gesorteerd te worden op die waarde van groot naar klein.
Telkens nadat er een wijziging heeft plaatsgevonden in één der items (1 tot max 5 per keer (enkel eerste 5 zichtbaar op "dashboard)) dient het werkblad "klaar" dus opnieuw gesorteerd te worden. Wanneer een item volledig afgewerkt is zal dit (via dezelfde knop die de sortering uitvoert) gekopieerd worden naar het werkblad met de definitieve lijst met enkel de waarde uit kolom 7 waar de lijst dan alfabetisch gesorteerd is.
Ik moet dus op "dashboard" altijd eerst de items (rijen) kunnen zien met nog de meeste uit te voeren handelingen. Vandaar het 'rare' aspect van de sorteervoorwaarden  ;D.

groetjes,
Bieke

*edit*
getest en werkt perfect  :thumbsup: _/-\o_
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 sorteerregels onder voorwaarden
« Reactie #6 Gepost op: 07 februari 2024, 14:44:36 »
Hey Bieke,

Citaat
Hartelijk dank voor de code en de tijd die je hebt vrijgemaakt ervoor.
Graag gedaan, hoor ('t was een leuk intermezzo tussen 2 saaie overlegmomenten ;))

Aan me gedetailleerd afvragen wat precies de reden kon zijn voor dit soort sorteren was ik niet begonnen, maar het was me inderdaad wel al duidelijk dat de bovenste rijen altijd de belangrijkste zouden zijn :D

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

 


www.combell.com