Avatar billede Martin_34_2 Nybegynder
09. november 2012 - 11:42 Der er 12 kommentarer og
1 løsning

Perfomance forbedring af formel

Hejsa,

Jeg sidder med Excel 2010, på engelsk.
Jeg vil gerne have en formael der kan hjælpe mig med følgende lille udfordring.

Jeg har understående "lille" udtræk, hvor jeg gerne vil tælle hvor mange unikke værdier der er i kolonne A, hvis kolonne B=01, kolonne C=DK, kolonne D=22 og kolonne E=yes.
Tællene i kolonne a går igen, men jeg vil kun tælle dem med en gang, og kun hvis alle 4 betingelser er opfyldt.

Jeg har i en tidligere tråd fået følgende svar fra PHChristensen (og tak for en god løsning), som virker, men da jeg har 127455 rekords lige nu, og med et potentiale på omkring 250.000 rekords, er dette for meget for excel der går ned hver gang jeg bruger formlen.

=SUMPRODUCT(($B$1:$B$199=1)*($C$1:$C$199="DK")*($D$1:$D$199=22)*($E$1:$E$199="Yes")/COUNTIF($A$1:$A$199;A1:A199&""))

Kan man forbedre performance på denne, så den kan køres på så mange rekords?
Jeg kan kun bruge formler, jeg kan ikke bruge VBA:(

Delivery no.=A
Delivery status=B   
Country    =C
Orderline status=D   
Is planned date before today?=E

  A    B      C      D      E
906951    01    NO    22    No
860401    02    SE    22    No
802057    02    SE    22    No
885656    02    SE    22    No
921432    01    DK    22    No
913123    01    FI    22    No
914955    01    NO    22    No
885415    02    SE    22    No
900358    01    NO    22    No
914739    01    SE    22    No
842658    05    NO    33    Yes
842658    05    NO    22    Yes
891892    02    NO    22    No
842658    05    NO    33    Yes
842658    05    NO    33    Yes
853979    02    SE    22    No
888688    02    SE    22    No
932638    01    NO    22    No
931741    01    SE    22    No
910786    02    SE    22    No
916469    01    NO    22    No
896629    01    NO    22    No
879490    02    DK    22    No
902582    02    SE    22    No
858404    05    DK    33    Yes
858404    05    DK    33    Yes
916235    01    NO    22    No
858404    05    DK    33    Yes
858404    05    DK    33    Yes
858404    05    DK    33    Yes
913123    01    FI    22    No
858404    05    DK    33    Yes
902362    02    SE    22    No
927493    02    NO    33    Yes
858404    05    DK    33    Yes
914955    01    NO    22    No
853979    02    SE    22    No
853979    02    SE    22    No
892275    02    SE    22    No
904063    01    DK    22    No
934213    01    NO    22    No
909565    01    NO    22    No
853979    02    SE    22    No
853979    02    SE    22    No
09. november 2012 - 12:10 #1
Det kunne gøres med færre ressourcer ved hjælp af en pivottabel. Men du skriver, at det skal være en formel?
Avatar billede Martin_34_2 Nybegynder
09. november 2012 - 14:21 #2
Hej Erikjuul,

Ja det har du ret i, mit problem er at jeg skal bruge omkring 4 forskellige diffinationer. Med andre ord, jeg samler op på 40 forskellige betingelser. Hvis jeg skal bruge pivo til det, vil det give mig 40 forskellige pivo tabeller.
Avatar billede Martin_34_2 Nybegynder
09. november 2012 - 14:24 #3
*Ikke 4 forskellige, men 40, beklager fejlen.
Avatar billede tbak Nybegynder
09. november 2012 - 16:07 #4
Prøv formlen COUNTIFS(), den er ret effektiv.
Avatar billede tbak Nybegynder
09. november 2012 - 16:28 #5
Jeg burde måske gøre formlen færdig:

=COUNTIFS
($B$1:$B$199;1;$C$1:$C$199;"DK";$D$1:$D$199;22;$E$1:$E$199;"Yes")
Avatar billede Martin_34_2 Nybegynder
10. november 2012 - 01:59 #6
Hej Tbak,

Jeg kan ikke se hvordan den vil kunne give mig de unikke værdier?
Avatar billede tbak Nybegynder
10. november 2012 - 07:05 #7
Hej Martin_34_2

Nej, hvis den samme værdi kan fremgå flere gange i kolonne A, duer min formel ikke, så får du for mange hits. Men hvis du starter med at fjerne dubletter, vil det virke. Er det en mulighed?
Avatar billede Slettet bruger
10. november 2012 - 07:26 #8
Hvis du bruger den formel du selv viste i #5 i tråden "SUM.HVISER eller lignende":

=SUMPRODUKT(('Ark1'!A:A='Ark2'!E2)*('Ark1'!D:D='Ark2'!A2)*('Ark1'!E:E>='Ark2'!D2)*('Ark1'!C:C<='Ark2'!C2)*('Ark1'!F:F))

så er det første du kan prøve da at begrænse celleområdet til det strengt nødvendige i stedet for at bruge "full-column-references". Sidstnævnte er måske bekvemt, men det er absolut en uskik i forbindelse med matriksfunktioner.

Det er ikke sikkert at det løser dit problem her, men rådet om at begrænse celleområdet til det nødvendige en generelt anvendeligt.

Hans
Avatar billede Slettet bruger
10. november 2012 - 07:34 #9
Glem venligst #8. Jeg kom til at blande noget forkert sammen.

Hans
Avatar billede Martin_34_2 Nybegynder
12. november 2012 - 08:50 #10
Hej Hans,

Du er nu ikke helt ved siden af. Det er en slem uskik og have så meget data i excel og så ønske og ligge sum, og hvis formler ned over alt den data.
Problematikken er at mit firma mangler og indse de er vokset fra excel som en standart løsning.

Jeg tror ikke på excel kan løse dette problem. Excel løser dette enten ved en vba programering, eller ved hjælp af filter, og ikke en løsning hvor der bruges så mange summer over så meget data.

Jeg lader lige spørgsmålet stå lidt i nu i håb om at jeg tager fejl, og der er en smart funktion til dette i excel.
Avatar billede Martin_34_2 Nybegynder
12. november 2012 - 08:52 #11
Beklager Tbak,

Men kun muligt såfremt der er via en funktion der giver mig mulighed for excel selv gør dette hver gang data arket opdateres.
Avatar billede Slettet bruger
12. november 2012 - 11:59 #12
Problemet er ikke at finde en funktion, men mængden af data.

Jeg er klar over du ikke er glad for VBA, men overvej alligevel følgende (hvis opgaven skal løses ved hjælp af Excel)

Med dine data i A2:E150000 (eller hvor meget det nu var) indtast følgende formel i F2: =(B2=1)*(C2="DK")*(D2=22)*(E2="Yes"). Med celle F2 aktiveret dobbeltklik på fyldhåndtaget for at kopiere hele vejen ned. Denne type Boolesk test er ekstremt hurtig (og rimelig hurtig selv ved 150.000 rækker). Lav nu en filtrering på kolonne F (=1).

Indsæt følgende kode i et almindeligt modul:


Sub CopyFilteredData()
Dim rng As Range

Set rng = ActiveSheet.AutoFilter.Range
rng.Copy

Worksheets("Sheet2").Range("A1").PasteSpecial (xlPasteValues)
Application.CutCopyMode = False
End Sub


Kør koden fra Sheet1.

I Sheet2 indsætter du denne formel (i for eksempel H1):

=SUMPRODUCT((A2:A100<>"")/COUNTIF(A2:A100;A2:A100&""))

Udvid celleområdet hvis der kan forekomme mere end 99 unikke værdier.

Jeg er selvfølgelig klar over, at løsningen ikke helt er det du ønsker. Om du kan bruge mmetoden må du selv afgøre.

Men hele opgaven her er i øvrigt anskuelsesundervisning i, at Excels 2^20 (= 1.048.576) rækker (når det gælder formler) mest af alt er mmarketing hype fra Microsofts side.
Avatar billede Martin_34_2 Nybegynder
20. december 2012 - 08:31 #13
For at lukke
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester