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.
Annonceindlæg fra Admin By Request
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
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.
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)
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")
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.
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.......
20. februar 2004 - 10:33
#10
Hugo, du kan jo altid skjule hjælpekolonnen igen.
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)
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.
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*
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.
20. februar 2004 - 10:55
#18
Godt set med de negative tal B_hansen :-)
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...!
20. februar 2004 - 11:05
#22
Flot Flemming ;-)
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
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
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 :-)
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.
20. februar 2004 - 13:40
#31
antal kørte km kan vel ikke være negativ :-)
20. februar 2004 - 13:40
#32
med mindre du er brugtvognsforhandler....
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))
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 :-)
20. februar 2004 - 14:14
#35
jeps, du har ret Jan, den oprindelige er bedst.
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig