05. november 2005 - 01:27Der er
14 kommentarer og 1 løsning
Antal forskellige i en liste
Hej Jeg har ca. 10000 fakturatransaktioner i en liste. Listen indeholder kundenavn, fakturanummer,beløb og måned(nummer). Listen bruges til en pivottabel.
Med DSUM finder jeg nemt hvor meget der er faktureret for i en bestemt måned, men jeg har brug for at finde hvor mange forskellige kunder der er blevet faktureret i denne måned da jeg skal kunne udregne gemmensnits omsætning per måned. Hver kunde har en eller flere fakturaer i en måned og derfor kan jeg ikke bare bruge DCOUNT.
Det første link peger helt klart i den rigtige retning. Der er bare lige det at min sammentælling skal laves på en liste som ændrer sig hele tiden (ex. forskellige måneder, kunder eller lign.) Vil det være muligt at gøre noget tilsvarende, med DFUNKTIONER. Jeg kan ikke lige konvertere det da der ikke eksisterer en DSUMPRODUCT funktion.
En pivottabel kan godt lave unike grupper, men den kan ikke tælle hvor mange forskellige der er. Iøvrigt er alt organiseret i en pivottabel. At fjerne fakturanumrene bare fordi de ikke er relevante for netop dette spørgsmål synes mig unødvendigt.
sorry, så ikke lige at det jo netop var det der stod i flemmings liks. Den formel bliver nu nok alligel for langsom på 10000 rækker :-)
Denne funktion er hurtigere
Function CountUniq(Omraade As Range) Dim AllCells As Variant, cell As Variant Dim Uniqs As New Collection Dim strCheck As String
Set AllCells = Omraade On Error Resume Next For Each cell In AllCells Uniqs.Add cell.Value, CStr(cell.Value) Next cell CountUniq = Uniqs.Count Set Uniqs = Nothing Set AllCells = Nothing End Function
Fint BAK - jeg har jo selvfølgelig som så ofte før lavet funtionen, så jeg synes den er pæn :-)
Her er to forskellige udgaver. -fælles for dem begge er Application.Volatile, hvilket får funktionen til at genberegne sig hvergang regnearket beregnes (vigtig lille detalje - men måske vild for meget store områder) -den første er lavet med For Each og den sidste med en For Next - tidligere udgaver af Excel har problemer med funktioner, som indeholder For Each løkker.
Public Function CountUniqueCells(ByVal Area As Range) Dim rCell As Range Dim colUniques As New Collection Application.Volatile
On Error Resume Next For Each rCell In Area.Cells colUniques.Add rCell.Value, CStr(rCell.Value) Next rCell On Error GoTo 0
CountUniqueCells = colUniques.Count Set colUniques = Nothing End Function
Public Function CountUniqueCells(ByVal Area As Range) Dim lRow As Long Dim lCol As Long Dim colUniques As New Collection Application.Volatile
On Error Resume Next For lCol = 1 To Area.Columns.Count For lRow = 1 To Area.Rows.Count colUniques.Add Area.Cells(lRow, lCol).Value, CStr(Area.Cells(lRow, lCol).Value) Next lRow Next lCol On Error GoTo 0
CountUniqueCells = colUniques.Count Set colUniques = Nothing End Function
Her er en lidt kortere model til pivottabeller rgPT er en tilfældig celle i pivottabellen vFieldName er Headeren/overskriften på det felt der ønskes talt (enten som celle eller som tekst. Tekst skal have apostroffer om
Public Function PivotCount(ByRef rgPT As Range, ByVal vFieldName As Variant) As Long PivotCount = rgPT.PivotTable.PivotFields(CStr(vFieldName)).PivotItems.Count End Function
bruges =PivotCount(A4; "Kundenavn") eller PivotCount(A4; A6) hvor A6 indeholder overskrifter Kundenavn
Hej flemming, velkommen til overfladen :-) Jeps, det er en pæn og hurtig funktion og det er netop pga. beregningstiden jeg ikke har taget volatile med.
Jeg kan mærke at det er et par garvede gutter jeg her har fået på opgaven. Hvad gør en mindre garvet som mig? Jeg er rimeligt habil til excel men har aldrig lært en linie VB og jeg aner ikke hvordan man aktiverer sådan en programstump. Så spørgsmålet er: Kan det kort forklares hvordan jeg implementerer det, eller findes der en måde at få denne kode omsat i en formel?
Smiler - aktivering af en vba funktion for dummies :-)
Kopier funktionen her fra siden Start Excel Åben dit regneark (går det for hurtigt? *gg*) Tryk Alt+F11 (nu starter der et helt nyt program) I menuen vælger du "Insert->Module" (en hvid "side" åbnes) Paste funktionen ind på denne "hvide side" (også kaldet et modul eller kodemodul) Husk navnet på funktionen f.eks. CountUniqueCells Luk dette "Microsoft Visual Basic" med krydset i højre hjørne. I excel stille du dig i en celle og skriver =CountUniqueCells(område) hvor område f.eks. er A1:F20 (eller netop det område du vil have talt for unique celler
Denne formel løser mit problem uden at skulle VBAe. Hvis du sender mig et svar så skal du få pointene for din inspiration og det første skridt i retningen af at gøre mig til VBA mand. Tak for hjælpen begge to.
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.