Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[XL 2K3] aantal rijgewijze maximumdata totaliseren per kolom

Pagina: 1
Acties:

  • Jackthe
  • Registratie: Januari 2005
  • Laatst online: 01-04-2024
Allen ik heb een klein functie waar ik niet helemaal uit kom. De bedoeling is dat voor een telling gemaakt moet worden van het aantal regels voor een bepaalde kolom (The_Col) waarvoor geldt dat die kolom de hoogste datum bevat.

A B C
1 1-feb 1-jan
2 2-jan 2-feb 1-jan
3 3-mrt 1-jan


Dus voor Kolom A is de uitkomst 2
Dus voor Kolom B is de uitkomst 1
Dus voor Kolom C is de uitkomst 0

Nu is het aantal kolommen 30 en aantal regels ongeveer 300. en simpele if-then-else constructies werken niet meer.

Ik heb onderstaande code gebrabbeld (niet veel ervaring in VB); en ik snap niet helemaal waar ik de mist in ga. Kunnen jullie mij verder helpen?

Alvast Bedankt!

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Function CompareDates(The_Col As Integer, _
                ColStart As Integer, ColEnd As Integer, _
                RowStart As Integer, RowEnd As Integer)
                
    'Compares For each row of The_Col weither it is the highest date of all Cols or not.
    'Returns number of rows where it is the highest
  
  Dim c, r, count, bol, d1, d2
  
  For r = RowStart To RowEnd
    bol = True
    
    For c = ColStart To ColEnd
      If (c <> The_Col) Then
        d1 = ActiveSheet.Cells(The_Col, r)
        d2 = ActiveSheet.Cells(c, r)
        bol = (bol & (d1 > d2))
      Else
      End If
    Next c
    If bol Then
    count = count + 1
    Else
    End If
  Next r
  
  CompareDates = count
  
End Function

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:28

Reptile209

- gers -

Ik zie het systeem in je voorbeeld al niet eens :X. Als je wil tellen hoe vaak de hoogste datum in een kolom voorkomt, waarom kom je dan voor kolom A (met drie verschillende datums) op 2 uit? Welke waarden geeft je functie nu terug (die dus niet zouden kloppen?

Zo scherp als een voetbal!


Verwijderd

Ik snap er ook niets van. Dan maar even een zijtak-commentaar op je code:

Visual Basic .NET:
1
2
3
4
If bol Then
    count = count + 1
    Else
    End If 


Dat "Else" kun je weglaten. Feitelijk geef je hier alleen maar "Do Nothing" mee aan ;)

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Als ik naar die voorbeelden kijk, dan wil je zoiets als het aantal rijen dat hoger is dan al zijn voorgangers waarbij je de eerste rij met waardes niet meeteld?
Of als formule voor kolom a bij max. 100 rijen:
code:
1
2
=SUMPRODUCT(--(A2:A100>SUBTOTAL(4,INDIRECT("a1:a"&ROW(A2:A100)-1))),
            --(SUBTOTAL(4,INDIRECT("a1:a"&ROW(A2:A100)-1))>0))

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Jackthe
  • Registratie: Januari 2005
  • Laatst online: 01-04-2024
Hmmm, wat ik bedoel is geloof ik niet helemaal goed over gekomen.

De uitkomst van 2 voor kolom A komt door:
TRUE: A1 > B1 & A1 > C1
False: A2 > B2 & A2 > C2
TRUE: A3 > B3 & A3 > C3


De uitkomst van 1 voor kolom B komt door:
False: B1 > A1 & B1 > C1
TRUE: B2 > A2 & B2 > C2
False: B3 > A3 & B3 > C3


De uitkomst van 0 voor kolom C komt door:
False: C1 > A1 & C1 > B1
False: C2 > A2 & C2 > B2
False: C3 > A3 & C3 > B3

Ik weet dat de ELSE niets doet, maar ik vind het zo nettere code.

Dus per regel in een kolom moet een vergelijking gemaakt worden. Aantal keren dat de vergelijking waar is moet geteld worden. De vergelijking is dat de datum het hoogst moet zijn van die regel.

Hopelijk snappen jullie hem nu... Duurde bij mij ook even een tijdje. De reden voor deze complexe (zelfbouw) formules is dat ik geen gebruik kan maken van hulpvelden.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Volgens mij doet de volgende, doortrekbare formule wat je wil en heb je geen VBA nodig:
code:
1
{=SUM(--(A1:A3=SUBTOTAL(4,OFFSET(1:1,ROW(A1:A3)-1,0))))}

(array formule, invoeren met ctrl-shift-enter.)

Hierbij wordt er eerst per rij het maximum bepaald (subtotal(4,...)), en vergeleken met de huidige waarde in de juiste kolom. Als ze gelijk zijn wordt er steeds 1 bij geteld. Gelijken worden dus goedgerekend als hoogste. Let trouwens op met cirkelverwijzingen als je het gaat testen.

Als je zoiets gaat maken in VBA, neem dan een Public Function die twee keer een Range als parameters heeft. Ik zou nooit gaan knoeien met ActiveSheet, Cells en lastig doortrekbare integers. ;) Dus:
Visual Basic:
1
Public Function NumberOfRowMaximums(column As Range, area As Range) As Long

Verder is er zoiets als 'Exit For'.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

de formule van pedorus doet het gevraagde. sterk!

  • Jackthe
  • Registratie: Januari 2005
  • Laatst online: 01-04-2024
Top! Hij doet het inderdaad! Nog een kleine check dat lege regels niet meegenomen worden levert het volgende resultaat.

code:
1
{=SUM(IF(Q4:Q500=SUBTOTAL(4;OFFSET(1:1;ROW(Q4:Q500)-1;16;1;21));1;0)) - SUM((IF(SUBTOTAL(4;OFFSET(1:1;ROW(Q4:Q500)-1;16;1;21))=0;1;0)))}


Allen dank!
Pagina: 1