Avatar billede tobler Nybegynder
04. marts 2003 - 15:31 Der er 31 kommentarer og
1 løsning

Tælle antal kreditnotaer ud af journalliste

Hej,

Jeg har en fakturajournal inklusiv alle varelinier, hvorfra jeg vil udtrække forskellige oplysninger. Jeg har styr på at tælle antal faktura/kreditnotalinier med countif.
Ligeledes kan jeg med løsningen fra:  http://www.eksperten.dk/spm/274968 ,med formlen =SUM(IF(FREQUENNCY(A:A;A:A)>0;1)), tælle det totale antal fakturaer/kreditnotaer, nu vil jeg gerne udvide formlen til kun at tælle alle fakturaer som har et nummer under 900000 og alle kreditnotaer som har et nummer over 900000.
Avatar billede martin_moth Mester
04. marts 2003 - 15:39 #1
Nu skal jeg nok blande mig udenom ting der ikke rager mig ;o) - men det lader til, at en database er det du har brug for, ikke et regneark :o)

Men kan du ikke bare smide en  HVIS omkring din formel, og så ikke gøre noget hvis en eller anden betingelse ikke er opfyldt, og gøre noget andet hvis den er?

Alternativt, lave en macro der looper over alle dine poster, og kun tæller hvis en eller anden betingelse er opfyldt, fx. at et eller andet nummer er større end 9000000
Avatar billede tobler Nybegynder
04. marts 2003 - 15:49 #2
Hvis dataen lå og flød hos mig, ville jeg nok også gøre det den vej.

Men jeg har adgang til dette Oracle extract via internettet, og vil derfor lige kopiere fire formler ind i regnearket, for at gi' mig de værdier jeg skal bruge i mine videre analyser.
Avatar billede janvogt Praktikant
04. marts 2003 - 16:01 #3
Excel kan fint bruges til en opgave som denne.
Om man ønsker at bruge Access er oftest en smagssag.
I bund og grund er Excel også en database.

Du skal have gang i en array- eller =SUMPRODUKT-formel.
Hvis du skal have mere hjælp skal vi have lidt flere oplysninger eller du kan sende dit ark til mig.

janvogt@esenet.dk
Avatar billede martin_moth Mester
04. marts 2003 - 16:03 #4
Ja, men det er lidt basværligt at lave SQL-udtræk fra Excel ;o)

Men for at vende tilbage til spørgsmålet - er det ikke bare at smide en HVIS ind?
Avatar billede janvogt Praktikant
04. marts 2003 - 16:08 #5
HVIS-formlen er bedst når der kun er ét kriterie. Her er der mindst 3, så derfor er det nødvendigt at bruge en lidt kraftigere formel.
Avatar billede bak Forsker
04. marts 2003 - 16:13 #6
Martin-> det eneste besværlige ved det, er at man kun kan lave sql-udtræk fra lukkede excel-filer (via msquery) :-)
Avatar billede martin_moth Mester
04. marts 2003 - 16:15 #7
Flere Hvis'er kan jo sagtens kombineres.

"nu vil jeg gerne udvide formlen til kun at tælle alle fakturaer som har et nummer under 900000 og alle kreditnotaer som har et nummer over 900000."

Er det ikke bare at putte 2 hvis'ser ind i hinanden? Eller en Hvis kombineret med en OG...

Nå, blander mig udenom. Over & Out, Martin :o)
Avatar billede janvogt Praktikant
04. marts 2003 - 16:20 #8
Du kan ikke kombinere HVIS og OG - prøv selv ......
Avatar billede janvogt Praktikant
04. marts 2003 - 16:23 #9
Hvis'er er heller ikke specielt stærke, når det gælder et range.
Med to eller flere hvis´ser vil du kunne finde ud af, om den pågældende linie opfylder kriterierne, men ikke tælle alle linier.
Så skal det ihvertfald kombineres med en array-formel.
Avatar billede martin_moth Mester
04. marts 2003 - 16:24 #10
oki :o)
Avatar billede janvogt Praktikant
04. marts 2003 - 16:26 #11
=|:-)
Avatar billede tobler Nybegynder
04. marts 2003 - 16:28 #12
Kolonne A indeholder en række af faktura-/kreditnota-numre i spredt blanding og mange af dem er redundante, idet der kan være flere linier med vareoplysninger pr. faktura/kreditnota.

=SUM(IF(FREQUENNCY(A:A;A:A)>0;1)) giver mig det samlede antal faktura/kreditnotaer, nu ville det være genialt, hvis jeg kunne afgrænse det i to formler, en der tæller antallet under 900000 og en der tæller antaller over 900000.

Naturligvis kan jeg lave en sortering, og derefter markere fra/til hvilke celler der skal behandles og få resultatet af den vej, men mon ikke der findes en løsning unden at skulle sortere.
Avatar billede janvogt Praktikant
04. marts 2003 - 16:39 #13
Hvordan skelner du mellem faktura og kreditnota?
Avatar billede tobler Nybegynder
04. marts 2003 - 16:42 #14
Faktura-nummeret er mindre end 900000, kreditnota-nummeret er større end 900000.
Avatar billede martin_moth Mester
04. marts 2003 - 16:47 #15
Jeg nævner lige igen, at en macro kan løse det på meget elegant vis - men nu har jeg jo allerede skrevet Over&Out een gang ;o)
Avatar billede janvogt Praktikant
04. marts 2003 - 17:00 #16
Jeg kæmper stadig med en enkelt array-formel, men vender nok ikke tilbage før i morgen. Det er alligevel en "lidt" kompliceret opgave :-)

Derfor kan det jo godt være, at jeg må overgive mig og erkende at en makro er den eneste løsning, men indtil videre har jeg ikke givet op ..... :-)
Avatar billede martin_moth Mester
04. marts 2003 - 17:02 #17
Hvorfor have den modvilje mod en macroløsning, som jeg fornemmer. Macroer er vores venner :o)
Avatar billede bak Forsker
04. marts 2003 - 19:29 #18
Disse to kan nok bruges, under forudsætning af at der ikke er tomme linier.
=SUMPRODUKT(1/TÆL.HVIS(A1:A100;A1:A100)*(A1:A100<900000))
=SUMPRODUKT(1/TÆL.HVIS(A1:A100;A1:A100)*(A1:A100>=900000))
Avatar billede bak Forsker
04. marts 2003 - 19:30 #19
Over and Out :-)
Avatar billede bak Forsker
04. marts 2003 - 22:46 #20
Macroer er vore venner ........ ;-)
Denne funktion tæller tager et range, et minimum og et maximum som argumenter og returnerer antallet af unikke værdi der imellem.
Kan også bruges med strenge.
=CountUniqBetween(A2:A10000;1;899999)
=CountUniqBetween(A2:A10000;999999;10000000)



Function CountUniqBetween(RNG As Range, mini As Variant, maxi As Variant) As Long

Dim xcol As New Collection
Dim varray As Variant
Dim i As Long
Dim j As Long
varray = RNG
On Error Resume Next
For i = 1 To UBound(varray, 2)
    For j = 1 To UBound(varray, 1)
    If varray(j, i) >= mini And varray(j, i) <= maxi Then _
            xcol.Add varray(j, i), CStr(varray(j, i))
    Next
Next
On Error GoTo 0
CountUniqBetween = xcol.Count
Set xcol = Nothing
Set varray = Nothing

End Function
Avatar billede bak Forsker
05. marts 2003 - 08:29 #21
Funktionen har et lille problem ang blank celle. dette løses ved at erstatte det midterste indenfor løkken med

If vArray(j, i) >= mini And vArray(j, i) <= maxi And Len(vArray(j, i)) > 0 Then _
            xcol.Add vArray(j, i), CStr(vArray(j, i))
Avatar billede janvogt Praktikant
05. marts 2003 - 09:55 #22
Selvfølgelig er makroer vore venner :-)

Det er bare lidt mere sport i at lave en formel på én linie end en makro på 20 linier .... :-)
Avatar billede bak Forsker
05. marts 2003 - 10:35 #23
Helt enig, Jan .................
Og en formel virker i alle ark, uden at man skal have indsat et vba-modul.
problemet er bare at der kan gå frygtelig lang tid med at lave formlen. :-)
her er det ofte hurtigere med en makro.
Avatar billede janvogt Praktikant
05. marts 2003 - 10:44 #24
Normalt er det hurtigt at lave en formel, men jeg må indrømme at denne er lidt langhåret. Problemet er at få den til at tage højde for blanke linier.
Måske kan du hjælpe ...

Jeg er foreløbig nået frem til denne arrayformel:
=SUM(IF(FREQUENCY(IF(LEN(A1:A1000)>0;MATCH(A1:A1000;A1:A1000;0);"");IF(LEN(A1:A1000)>0;MATCH(A1:A1000;A1:A1000;0);""))>0;1))

Denne tæller unikke værdier i området A1 til A1000, og tager også højde for blanke.

Problemet nu består i at få koblet (A1:A100<900000) på. Kan du gennemskue den?
Avatar billede janvogt Praktikant
05. marts 2003 - 10:46 #25
Det var vist noget vrøvl noget at det jeg skrev.
Problemet består ikke i at tage højde for blanke linier. Den har jeg jo løst ....
Avatar billede bak Forsker
05. marts 2003 - 11:00 #26
jeg har en lidt anden indgangvinkel:
=SUM(IF(COUNTIF(A1:A1000;A1:A1000)=0;"";1/COUNTIF(A1:A1000;A1:A1000)*(A1:A1000<900000)))
og
=SUM(IF(COUNTIF(A1:A1000;A1:A1000)=0;"";1/COUNTIF(A1:A1000;A1:A1000)*(A1:A1000>=900000)))

begge er array-formler
Avatar billede janvogt Praktikant
05. marts 2003 - 11:19 #27
Ja, godt set :-)
Avatar billede bak Forsker
05. marts 2003 - 11:20 #28
Ikke hjemmelavet, men kopieret. Desværre :-(
Avatar billede janvogt Praktikant
05. marts 2003 - 11:25 #29
Godt fundet så :-)
Avatar billede bak Forsker
05. marts 2003 - 11:50 #30
Jeg troede faktisk aldrig at jeg skulle opleve at en hjemmelavet vba-funktion var hurtigere end en formel, men det er faktisk tilfældet her.
Jeg testede på 10000 linier og array-funktion satte næsten min computer istå, hvorimod min egen funktion går meget hurtig.
Det må nok skyldes at array-funktionen bygger min. 5 arrays á 10000 elementer og skal kombinere disse.
Min vba-funktion bygger kun et array og overfører det til en collection (en collection kan kun tage mod unikke elementer i sit index)
Avatar billede tobler Nybegynder
12. marts 2003 - 12:52 #31
Det lykkedes mig at løse mit problem med nedenstående formel fra bak, så drop mig lige et svar.

=SUM(IF(COUNTIF(A1:A1000;A1:A1000)=0;"";1/COUNTIF(A1:A1000;A1:A1000)*(A1:A1000<900000)))
og
=SUM(IF(COUNTIF(A1:A1000;A1:A1000)=0;"";1/COUNTIF(A1:A1000;A1:A1000)*(A1:A1000>=900000)))

til uerfarne brugere, array-formler skal indtastes med "Ctrl+Shift+Enter"

Vedrørende macro diskussionen, ja så må jeg hellere rive en halv til hel dag ud af min kalender, og komme igang med den side af løsningsmulighederne.

Tak for hjælpen. :-))
Avatar billede bak Forsker
12. marts 2003 - 21:55 #32
Selv tak, tobler :-)
Tag du hellere en hel uge ud. Du vil blive forbavset over hvad excel også kan ..... ;-)
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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