Avatar billede hugopedersen Nybegynder
20. februar 2004 - 09:58 Der er 34 kommentarer og
1 løsning

Tælle antal værdier i område

Jeg har nogle områder i et ark bestående af 3 kolonner. I disse kolonner kan der stå et tal i en eller flere af cellerne i en række. Jeg vil nu gerne kunne tælle antal rækker hvor der er udfyldte felter, men selv om der er tal i alle 3 felter, skal der linien kun tælle med 1 gang.

Håber det giver mening.
20. februar 2004 - 09:59 #1
=TÆL("celler")
20. februar 2004 - 10:00 #2
celler kan godt være flere usammenhængende områder i flere kolonner
Avatar billede hugopedersen Nybegynder
20. februar 2004 - 10:06 #3
Desværre giver det ikke det ønskede resultat.
Jeg går ud fra at TÆL er lig med COUNT på engelsk.
Hvis der står noget i flere felter i en linie tælles de med som flere og det er det der er hele humlen i det.
Avatar billede janvogt Praktikant
20. februar 2004 - 10:24 #4
Prøv at gøre følgende:

Lav en hjælpekolonne, f.eks. kolonne D, hvor du i D1 skriver følgende:
=HVIS(SUM(A1:C1)>0;1;0)

Kopier formlen ned, så længe der er data.

I bunden i kolonne D laver du så en SUM-formel, f.eks. =SUM(D1:D999)
Avatar billede janvogt Praktikant
20. februar 2004 - 10:26 #5
Denne sum giver dig tallet for, hvor mange rækker der er tal i større end nul, og hver række bliver kun talt med én gang.
20. februar 2004 - 10:28 #6
=COUNTIF(D8:I25;">0")
Avatar billede hugopedersen Nybegynder
20. februar 2004 - 10:30 #7
janvogt>  det ville jeg helst undgå, men kan det ikke laves uden hjælpekolonner, så må jeg jo krybe til korset.
Avatar billede janvogt Praktikant
20. februar 2004 - 10:31 #8
Flemming, man kan ikke bruge en almindelig tælle-formel, for hver række i området må kun tælles med én gang.
20. februar 2004 - 10:33 #9
Har vist misforstået noget.......
Avatar billede janvogt Praktikant
20. februar 2004 - 10:33 #10
Hugo, du kan jo altid skjule hjælpekolonnen igen.
Avatar billede hugopedersen Nybegynder
20. februar 2004 - 10:37 #11
janvogt>  det har du selvfølgelig ret i men da det drejer sig om 12 seperate områder, ville jeg gerne undgå det :-)
20. februar 2004 - 10:38 #12
Indsæt følgende makro i et almindeligt kodemodul:

Public Function CountSpecial(ByVal rCells As Range) As Long
    Dim rCell As Range
    Dim colRow As New Collection
   
    On Error Resume Next
    For Each rCell In rCells
        If rCell.Value Then colRow.Add rCell.Row, CStr(rCell.Row)
    Next rCell
    On Error GoTo 0
   
    CountSpecial = colRow.Count
End Function

i en celle skriver du f.eks.
=countspecial(D6:F12)
Avatar billede janvogt Praktikant
20. februar 2004 - 10:41 #13
Hvis du har ét eller andet, som kendetegner om rækken skal tælles med eller ej, kunne du udvide HVIS-formlen, f.eks. sådan

=HVIS(A1="";"";HVIS(SUM(B1:D1)>0;1;0))

Så kunne du måske tage højde for, at der er flere områder.
Avatar billede janvogt Praktikant
20. februar 2004 - 10:43 #14
Flemming, hvad hvis der er flere områder?
20. februar 2004 - 10:45 #15
Ikke noget problem, bare der ikke er rækkeoverlap
20. februar 2004 - 10:46 #16
Men det kan vel lige laves *gg*
Avatar billede b_hansen Novice
20. februar 2004 - 10:47 #17
jeg ville nu osse bruge janvogts løsning med en hjælpekolonne. Og så skjule den efterfølgende.

Men er der også negative tal, skal du nok gribe formlen lidt anderledes an:
=HVIS(OG(ER.TOM(celle1);ER.TOM(celle2);ER.TOM(celle3));0;1)

min formel undersøger, om alle cellerne er tomme. Hvis de er, bliver værdien nul, ellers 1.
Avatar billede janvogt Praktikant
20. februar 2004 - 10:55 #18
Godt set med de negative tal B_hansen :-)
Avatar billede janvogt Praktikant
20. februar 2004 - 10:58 #19
Det tager Flemmings funktion nu også højde for.
20. februar 2004 - 11:00 #20
Public Function CountSpecial(ByVal sCells As String) As Long
    Application.Volatile
    Dim lRetVal As Long
    Dim rCell As Range
    Dim colRow As Collection
    Dim sSplit() As String
    Dim lSplit As Long
   
    lRetVal = 0
    sCells = Replace(sCells, ",", ";")
    sSplit() = Split(sCells, ";")
   
    For lSplit = 0 To UBound(sSplit)
        On Error Resume Next
       
        Set colRow = New Collection
       
        For Each rCell In Range(sSplit(lSplit))
            If rCell.Value Then colRow.Add rCell.Row, CStr(rCell.Row)
        Next rCell
       
        lRetVal = lRetVal + colRow.Count
       
        On Error GoTo 0
    Next lSplit
   
    CountSpecial = lRetVal
End Function
20. februar 2004 - 11:01 #21
I cellen  =CountSpecial("D7:F15;I11:L19")  (noter at det er en string og ikke et direkte område...!
Avatar billede janvogt Praktikant
20. februar 2004 - 11:05 #22
Flot Flemming ;-)
Avatar billede hugopedersen Nybegynder
20. februar 2004 - 11:06 #23
flemmingdahl> din funktion er 'købt' - it does the trick

Det skal bruges til en kalender til beregning af kørselsfradrag hvor jeg indtaster km i rækkerne og skal tælle antal dage hvor der er kørt for at kunne regne videre.
20. februar 2004 - 11:10 #24
god fornøjelse Hugo og tak Jan :-)
20. februar 2004 - 11:29 #25
Skal det være godt, så skal det være rigtig godt

Public Function CountSpecial( _
    ByVal sCells As String, _
    ByVal bAsOneArea As Boolean _
    ) As Long
   
    Application.Volatile
    Dim lRetVal As Long
    Dim rCell As Range
    Dim colRow As New Collection
    Dim sSplit() As String
    Dim lSplit As Long
   
    lRetVal = 0
    sCells = Replace(sCells, ",", ";")
    sSplit() = Split(sCells, ";")
   
    If Not (bAsOneArea) Then Set colRow = New Collection
    For lSplit = 0 To UBound(sSplit)
        On Error Resume Next
       
        If bAsOneArea Then Set colRow = New Collection
       
        For Each rCell In Range(sSplit(lSplit))
            If rCell.Value Then colRow.Add rCell.Row, CStr(rCell.Row)
        Next rCell
       
        If bAsOneArea Then lRetVal = lRetVal + colRow.Count
       
        On Error GoTo 0
    Next lSplit
   
    If Not (bAsOneArea) Then lRetVal = colRow.Count
   
    CountSpecial = lRetVal
End Function
20. februar 2004 - 11:32 #26
Alle de forskellige områder som et område:
=countspecial("E10:G18;I14:K22";TRUE)
som flere områder:
=countspecial("E10:G18;I14:K22";FALSE)

Det skulle lige vendes rundt - her er den helt rigtige

Public Function CountSpecial( _
    ByVal sCells As String, _
    ByVal bAsOneArea As Boolean _
    ) As Long
   
    Application.Volatile
    Dim lRetVal As Long
    Dim rCell As Range
    Dim colRow As New Collection
    Dim sSplit() As String
    Dim lSplit As Long
   
    lRetVal = 0
    sCells = Replace(sCells, ",", ";")
    sSplit() = Split(sCells, ";")
   
    If bAsOneArea Then Set colRow = New Collection
    For lSplit = 0 To UBound(sSplit)
        On Error Resume Next
       
        If Not (bAsOneArea) Then Set colRow = New Collection
       
        For Each rCell In Range(sSplit(lSplit))
            If rCell.Value Then colRow.Add rCell.Row, CStr(rCell.Row)
        Next rCell
       
        If Not (bAsOneArea) Then lRetVal = lRetVal + colRow.Count
       
        On Error GoTo 0
    Next lSplit
   
    If bAsOneArea Then lRetVal = colRow.Count
   
    CountSpecial = lRetVal
End Function
Avatar billede janvogt Praktikant
20. februar 2004 - 11:43 #27
Flemming, hvori består forskellen, om det behandles som ét eller flere områder?
20. februar 2004 - 12:18 #28
bAsOneArea = True
Hvis der er flere områder, med overlappende rækkenr, så tælles rækken kun med EN gang

bAsOneArea = False
En række kan tælles med flere gange, hvis den optræder i flere områder
Avatar billede bak Forsker
20. februar 2004 - 13:06 #29
en lille array formel kan måske også gøre det:

=SUM(IF(SUMIF(OFFSET(B1:E1;ROW(1:100)-1;;;);"<>0")>0;1))

tæller i kolonne B:E række 1:100

Jeg kan også godt lide flemmings model og helt specielt brugen af Collection for at sikre at kun unikke rækker tælles :-)
Avatar billede janvogt Praktikant
20. februar 2004 - 13:31 #30
Bak, den brugte jeg ½ time på at "opfinde" - uden held :-)

Der er dog et minus - den tager ikke højde for negative værdier.
Avatar billede bak Forsker
20. februar 2004 - 13:40 #31
antal kørte km kan vel ikke være negativ :-)
Avatar billede bak Forsker
20. februar 2004 - 13:40 #32
med mindre du er brugtvognsforhandler....
Avatar billede bak Forsker
20. februar 2004 - 13:42 #33
Med en mindre korrektion ser det ud til at gå fint
=SUM(IF(SUMIF(OFFSET(B1:AA1;ROW(1:100)-1;;;);"<>0")<>0;1))
Avatar billede janvogt Praktikant
20. februar 2004 - 13:53 #34
Hehe, ja, det har du ret i.
Når man studerer et problem glemmer man ofte den oprindelige problemstilling :-)

Jeg ved ikke rigtigt, om jeg kan lide din sidste løsning. Du fjernede problemet, men skabte et nyt :-)
Avatar billede bak Forsker
20. februar 2004 - 14:14 #35
jeps, du har ret Jan, den oprindelige er bedst.
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