Alternatief voor de Rang Functie In Excel?

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.232
Ik ben bezig met een toepassing in Access om wedstrijdresultaten te verwerken. Wie de meeste punten haalt krijgt de eerste plaats. Wordt nu in Excel gedaan (door iemand anders, op een heel omslachtige en grotendeels manuele manier, details zijn hier onbelangrijk)

Resultaat (in een rapport of query) zou iets dergelijks moeten zijn:
Categorie 1:
Deelnemer Punten Plaats
Deelnemer1 100 1
Deelnemer2 90 2
Deelnemer3 80 3

Categorie 2:
Deelnemer1 100 1
Deelnemer2 90 2
enz.

In Excel zijn de punten niet gesorteerd en wordt de RANG functie gebruikt voor het bepalen van de plaats.

In Access volstaat het de punten te sorteren en dan in het rapport een running total over groups te maken.


Maar wat in het geval van ex aequo?


Running total geeft dit:


Deelnemer Punten Plaats
Deelnemer1 100 1
Deelnemer2 100 2
Deelnemer3 80 3

Terwijl ik het volgende wil:

Deelnemer Punten Plaats
Deelnemer1 100 1
Deelnemer2 100 1
Deelnemer3 80 3


Bestaat hiervoor een ingebouwde functie of moet je in de detailsectie van het rapport iets gaan programmeren met VBA ?
 
Denk dat je met VBA aan de slag zult moeten.
Je kunt dus ex aequo's hebben voor de 1e, 2e en 3e plaats..
Dus moet je per type de gevolgen beschrijven.
Code:
1 100
1 100
-
3 90
4 80
en
Code:
1 100
2 90
2 90
-
4 80
en
Code:
1 100
2 90
3 80 
3 80
-
5 70
Toch..?
De streepjes voor de plaatsen die overgeslagen zijn er alleen hier ter illustratie.
Je zou het met een IF THEN aanpak kunnen doen, waarbij je dus de gelijke scores die ik genoemd heb daarin meeneemt als voorwaarde (IF) met daarna de gevolgen op de weergave (THEN).
 
Laatst bewerkt:
Ik snap je probleem, maar hoe je dat moet oplossen? Lastig, want Access kent de Rank functie niet. De oplossing van route99 snap ik niet (te klein denkraam denk ik) dus ik zit meer te denken aan een VBA functie die de RANK functie van Excel gebruikt, waarbij je dan wel de Excel bibliotheek moet koppelen.
Andere oplossing: een (virtuele) tabel maken waarin je alle resultaten zet met het aantal keer dat een waarde voorkomt, aflopend gesorteerd en een volgnummer. Het hoogste getal 100 krijgt dan Volgnummer = 1 (Aantal uit vorige waarde) (=0) +1), Aantal krijgt 2. De waarde 90 krijgt dan Aantal = 1, Volgnummer = 3 (Aantal uit vorige waarde) (=2) +1) en zo ga je door. De virtuele tabel bevat dus op basis van het aantal keer dat de vorige waarde voorkomt een aangepast volgnummer.
Deze virtuele tabel koppel je dan aan je formulier/rapport. Of desnoods maak je er een echte tabel van, die je dan steeds leegmaakt bij een volgende exercitie.
 
In feite zou je zoiets via een IF/THEN ook in VBA kunnen doen... daarom heb ik de opties er neer gezet waar je rekening mee moet houden.... Zonder dat je het opgeeft weet het systeem niet dat er na een gelijke ranking een plaats over geslagen moet worden...
Het commentaar is wel errug kort door de bocht en jumpt naar conclusions, iets waar je met database bouwen juist moet voorkomen....
Ik heb nl alleen een gedachtengang voorgesteld en geen concrete oplossing...hoe moet je het exact doen.
 
Laatst bewerkt:
...Het commentaar is wel errug kort door de bocht en jumpt naar conclusions, iets waar je met database bouwen juist moet voorkomen.....
Heb ik iets gemist, of is er een berichtje verwijderd? Ik zie nergens iets dat ‘kort door de bocht’ is, en al helemaal niets dat naar ‘conclusies jumpt’ (wat ook nog eens geen geweldig Nederlands is, maar dit terzijde). Ik zeg alleen dat ik de oplossing van route99 niet snap (kun je toch niet ‘kort door de bocht’ noemen) en ik geef aan hoe ik het zou doen.

Daarnaast wordt die IF ongelooflijk ingewikkeld omdat hij in de voorgedragen oplossing alleen werkt als er twee ex aequo’s zijn. Bij 3 of meer (en dat lijkt mij een reële optie) is zo’n formule al bijna niet meer te maken.
 
Ik ga er een goed over nadenken.
Als je de rank functie uit Excel zou gebruiken (wat mij het makkelijkst lijkt), hoe moet je dan de range bepalen? Die range omvat alle records uit een categorie.
 
Je moet het virtueel houden, dus een array maken waar je de RANK functie op los laat. Dus eerst een Excel sessie openen, dan de dataset inlezen en dan de functie gebruiken. Of e.e.a. snel gaat werken, is lastig te zeggen al denk ik van niet. Mijn oplossing (heb ‘m al redelijk werkend) lijkt mij een stuk sneller en handiger, omdat je geen Excel nodig hebt.
 
Ondertussen geen reacties bekeken. Maar ik denk dat ik een oplossing heb.
De resultatentabel (eigenlijk een query maar dat doet er hier niet toe) heeft de velden "categorie", "naam" en "punten"
Op het rapport wordt gegroepeerd per categorie en aflopend gesorteerd op punten.
Het bevat de
  • velden "categorie", "naam" en "punten"
  • een berekend veld ("txt_RT" - running total over groups) dat verborgen moet worden
  • een onafhankelijk tekstvak "txt_Rang" waarin de rang verschijnt bij de print gebeurtenis van de detailsectie (openen in afdrukweergave).

Dit is de code:
De rang wordt niet in de tabel weggeschreven, enkel getoond op het rapport maar dit is voor de prijsuitreiking niet belangrijk.

Code:
Option Compare Database
Option Explicit
Dim puntenVorige As Integer, Rang As Byte, RangVorige



Private Sub Details_Print(Cancel As Integer, PrintCount As Integer)
If txt_RT = 1 Then
    puntenVorige = Punten
    
    Rang = 1
    
    RangVorige = 1
    txt_Rang = txt_RT
ElseIf txt_RT <> 1 Then
    If Punten < puntenVorige Then 'punten is het veld
        Rang = Rang + 1
        RangVorige = Rang
        txt_Rang = Rang
    
    Else
        txt_Rang = RangVorige
        Rang = Rang + 1
    End If
puntenVorige = Punten
End If
  
    
End Sub

Resultaat:
Rang.JPG
 
Mooie schone, effectieve if/then/else code! :thumb:
De resultatentabel (eigenlijk een query maar dat doet er hier niet toe) heeft de velden "categorie", "naam" en "punten"
Vet: typisch termen uit een database wereld....Het is niet voor niets dat veel uitslagen systemen een database zijn. Das zoveel handiger vaak dan Excel... Waar ik bij wedstrijden help is er meestal een database.
Voor de historie zou je de uitslag nog wel op te slaan, hoef je de query niet meer te draaien en is bijvoorbeeld een 10-jaren overzicht nog simpeler te maken.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan