• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Performance matrix formule

Status
Niet open voor verdere reacties.
snb met jouw kennis van vba kun je best beredeneren dat dat "vernaggelen" geen invloed heeft op de tijdwaarneming.
 
Aangepaste code:

Code:
Sub M_snb()
    sn = [transpose(Blad1!B1:B5000&Blad1!E1:E5000)]
    sp = Blad2.Cells(14, 1).CurrentRegion.Offset(, 10).Resize(, 6)
    sq = Blad2.Cells(14, 1).CurrentRegion.Columns(1)
    
    For j = 2 To UBound(sp)
      For jj = 1 To UBound(sp, 2)
        sp(j, jj) = UBound(Filter(Filter(sn, sq(j, 1)), sp(1, jj))) + 1
      Next
    Next
    
    Blad2.Cells(14, 1).CurrentRegion.Offset(, 10).Resize(, 6) = sp
End Sub
 
@sylv

Het maakt uit of je de opdracht
sn = [transpose(Blad1!B2:B5000&Blad1!C2:C5000)]
1 keer uitvoert (zoals in mijn code)
- of 500 keer (zoals in jouw code)

Het maakt ook uit of je alle berekeningen in een array zet (zoals in mijn code)
- of iedere keer naar het werkblad schrijft (zoals in jouw code)

Minimaliseer immer het aantal interakties (lezen/schrijven) met een werkblad.

Juist vanwege wat je me toedicht kan ik analyseren dat mijn code vele malen sneller is dan die jij ervan gemaakt hebt.
 
hier een test bestandje:
let op de rode cellen geven verschillende waarden om dat er verschillende algoritmen zijn gebruikt.
in de tabel heb ik waarde51234 (rij 14) gezet met status waarde waarde1.
hij staat er maar 1 maal in en mag in dus maar 1 maal geteld worden .
en wel bij status waarde1.

1234 wordt ook gezocht. deze staat ook in rij 14 .
deze mag ook alleen bij status waarde1 geteld worden.
 

Bijlagen

@snb: Dank voor de aangepaste macro. Deze werkt perfect! Ik zal zelf nog wel een keer gaan puzzelen hoe dit nu precies werkt (want ik begrijp hem echt nog steeds niet ...)

@snb & sylvester-ponte: Allebei super bedankt voor de uitgebreide hul!. Het blijkt dat vertragingen vooral werden veroorzaakt doordat ik de tab met de ellendige formule nog een keer had gekopieerd om mee "te prutsen" (waarna ik hem compleet ben vergeten ... :(), waardoor de metingen heel erg vertroebeld werden. Wel toevallig dat "het kennelijk vernaggelen" van het script van snb zorgde voor (ongeveer) dezelfde resultaten. De nu opgeleverde versie van snb doet z'n werk vanachter een button < 1 seconde en dat is dus gewoon super!

Ik ben hier echt heel blij mee! :)
 
Peter, heb je nog gekeken naar de verschillen in de telling?
snb, je code gaat ongeveer 3 maal sneller als je het filteren splitst:
Code:
Sub M_snb()
    sn = [transpose(Blad1!B1:B5000&Blad1!E1:E5000)]
    sp = Blad2.Cells(14, 1).CurrentRegion.Offset(, 10).Resize(, 6)
    sq = Blad2.Cells(14, 1).CurrentRegion.Columns(1)
    For j = 2 To UBound(sp)
        f1 = Filter(sn, sq(j, 1))
        For jj = 1 To UBound(sp, 2)
            sp(j, jj) = UBound(Filter(f1, sp(1, jj))) + 1
        Next
    Next
    Blad2.Cells(14, 1).CurrentRegion.Offset(, 10).Resize(, 6) = sp
End Sub
snb, je code doet iets met waarde1 waarde2 enz.
daardoor werd mijn fuction getriggerd en dat had een nadelige in vloed op jouw performens.
in een nieuwe test waarbij de waardes apart gezet zijn is het verschil veel minder.
en met de gescheiden filters is de jouwe sneller :eek:
 
Laatst bewerkt:
Ik was zo dom om 'm zomaar af te trappen. Mijn laptop is kennelijk een tikkeltje trager ... Code snb = 4:36; code sylvester-ponte = 4:20. Echter had ik wel van alles open staan, dus of deze getallen echt representatief zijn vraag ik mij af. Ik zal hem zo nog een keer aftrappen als ik mijn laptop een tijdje niet nodig heb.

Je hebt hiermee wel aangetoond dat ik toch een probleempje krijg met de code van snb. Ik had hier geen last van, maar nu ik zie hoe snel het kan werken wordt ik een beetje hebberig en wil ik ook nog per weeknummer uitsplitsen voor 1 status. Het gaat om de weeknummers 10-41, dus zou gefilterd moeten worden op de rechter 2 waarden. Met dank aan je uitsplising lijkt de code voor mij ook begrijpelijker geworden, dus dit zou m.i. betekenen dat ik in de volgende regel alleen op de rechter 2 waarden van f1 zou moeten filteren ... Maar een simpele right() werkt natuurlijk niet.
Code:
sp(j, jj) = UBound(Filter(f1, sp(1, jj))) + 1
Heb jij/ hebben jullie hier nog goede ideeën over?
 
Laatst bewerkt:
UDF's vertragen alle andere akties in Excel, ook al staat een UDF in een ander geopend werkboek.

Testen gaat dus alleen goed als je geen werkboek met een UDF open hebt staan.
 
Laatst bewerkt:
peter,ik zie geen weeknummers in je voorbeeld

en dat de macro van snb andere antwoorden geeft dan die van sylv, maakt dat niet uit??
 
Laatst bewerkt:
Resultaten zien er nu heel anders uit:
snb: 0:00:17
syl: 0:00:05

Dat scheelt "iets".

@sylvester-ponte: Voor het vervangen van de bestaande formule maakt het idd. niet uit, omdat de waarden waarop gezocht wordt dermate uniek zijn dat dit niet voor komt. Voor het deel "ik word een beetje hebberig, dus ik wil uitsplitsen van 1 status naar weken" echter wel. Dit is eigenlijk een nieuwe vraag, dus weeknummers staan niet opgenomen in het representatieve voorbeeld uit post #22.

Zie bijgesloten het nieuwe voorbeeld.

Terwijl ik dit voorbeeld aan het uitwerken was constateerde ik wel een verschil in aantallen (formule sylvester-ponte vs. handmatig filteren). Wat is hiervan de verklaring?
 

Bijlagen

Blij dat er een simpele verklaring is!

Helaas is deze keer de geboden oplossing niet wat ik zoek. Ik heb in het voorbeeld in de kolommen S t/m AX weeknummers opgenomen van 10 t/m 41. Ik wil hierin voor alleen Waarde1 de aantallen ingevuld hebben.
 
In de aangedragen oplossing wordt het totaal aantal per week weergegeven. Het is echter de bedoeling dat dit alleen voor waarde1 wordt weergegeven per gevonden omschrijving in de tekststring.

Dus voor abcd EN Waarde1. En voor 1234 EN Waarde1. Enz.

Daarnaast wil ik de berekening graag (eenmalig) getriggerd hebben. Dat zal zijn na het inlezen van een inputbestand. Op die manier gaat sowieso niet telkens alles herberekend worden (dit heeft ook geen toegevoegde waarde, want de aantallen wijzigen alleen a.g.v. het inlezen van een inputbestand).

Overigens vraag ik mij nog steeds af of ik deze vraag moet sluiten en met een nieuwe vraag moet doorgaan, of dat ik deze vraag onopgelost moet zetten (dit is niet zo, want ik heb gewoon een extra vraag ...) of dat ik inderdaad in deze vraag moet "doorzeuren" want uiteindelijk heb ik al meer gekregen dan ik had kunnen wensen.
 
Daarnaast wil ik de berekening graag (eenmalig) getriggerd hebben. Dat zal zijn na het inlezen van een inputbestand. Op die manier gaat sowieso niet telkens alles herberekend worden (dit heeft ook geen toegevoegde waarde, want de aantallen wijzigen alleen a.g.v. het inlezen van een inputbestand).

Een macro komt in zicht ...

Hoe wordt het 'inputbestand ingelezen' ?
Wat voor soort bestand is het 'inputbestand' ?
Zou het dan niet handiger zijn de analyse van de gegevens uit het inputbestand met het inputbestand zelf te doen zonder eerst te converteren naar Excel ?
 
@snb: Het inputbestand is een export uit een andere applicatie. Deze wordt in .xls aangeboden. In de andere applicatie is voor zover ik weet geen mogelijkheid om dergelijke analyses uit te voeren. Het inputbestand wordt ingelezen vanaf een share.

@sylvester-ponte: Bedankt voor weer een oplossing. Nu heb ik nog één laatste verzoek en dat is dat ik achter ieder te zoeken woord uit kolom A de aantallen per week ingevuld wil hebben. Helaas is je oplossing voor mij echt hogere wiskunde (ik begrijp op de één of andere manier niet hoe het nu echt werkt) waardoor mijn eigen aanpassingen alleen maar leiden tot 1) een zeer langzame oplossing en 2) en dan nog met een verkeerd resultaat ook!

Ik heb voor de zekerheid nog even de laatste versie van het bestand bijgevoegd ter verduidelijking van mijn wensen.

Bekijk bijlage Performance matrix formule met weeknummers en knop (Peter B).xlsm
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan