Avatar billede hjald8 Nybegynder
12. januar 2014 - 11:46 Der er 8 kommentarer og
1 løsning

Tæl hvis kriterier for værdier i kolonne - samt værdier i 2 andre kolonner er opfyldt VBA

Hej Alle

Jeg skal have lavet en vba-kode, som skal tælle antallet af forekomster i en kolonne (priser) -  (i en større tabel) - indenfor følgende tal: 1) 0-999, 2) 1000-2999 og 3) 3000-4999

Ovennævnte er betinget af at kriterier i kolonne A (sæson) og B (Kategori) også er opfyldt. Man skal vælge én sæson og man skal løbe alle kategorierne igennem.

Samtidig skal man bruge maksimum- og minimumsværdi pr. kategori.

Jeg synes, at jeg har en vis viden om VBA, men jeg kan dog ikke rigtig få hul på bylden på denne.

Håber at det er forståeligt - og at nogen kan hjælpe på vej.

På forhånd tusind tak.
12. januar 2014 - 19:46 #1
Hvis jeg forstår ovenstående rigtigt, så vil du gerne have et output fra din store tabel, som måske kunne se således ud:

Sæson    Kategori  Pris 1  Pris 2  Pris 3
Forår    Jakke      20      17      8
Forår    Kjole      18      12      6

Er dette korrekt forstået?
12. januar 2014 - 20:47 #2
Jeg har lagt et eksempel op, som du kan hente.

<div>http://www.smartoffice.dk/Tips/Eksperten/Index.asp

&#9726; Spm. 990210 - Consolidate Season and Category - VBA</div>
Avatar billede hjald8 Nybegynder
13. januar 2014 - 08:41 #3
Tusind tak. Ser ud til at være en super og effektiv kode. Jeg skal lige forstå den - så vender jeg tilbage.

Jeg skal bruge et udtræk, som giver én valgt sæson - fx Vinter. Så antallet af priser på hvert interval for én sæson fordelt på de forskellige kategorier. Dernæst mangler jeg min og maxprisen pr. kategori - men det må jeg kunne udlede af koden - hvordan jeg gør.
Avatar billede hjald8 Nybegynder
13. januar 2014 - 09:49 #4
Kikket på det. Det er jo en supersmart kode - og særdeles hurtig og effektiv.

Hvis jeg skal lære lidt mere om fx Lbound/Ubound, New collection, brug af indsættelse af resultater i arrays osv. - hvor kan jeg lære noget mere om dette.

Min vba-kodning er pt nok mere basic som if/then, basale definering af områder og værdier.
Avatar billede hjald8 Nybegynder
13. januar 2014 - 11:38 #5
Jeg har fået kikket på din kode. Den virker jo som tidligere nævnt meget fornemt - med de specifikationer du har arbejdet ud fra.

Jeg har fået styr på en del af koden - men noget er jeg meget usikker på - og vil gerne forstå (så jeg kan genbruge det senere). Jeg har forsøgt at vise og spørge til 3 områder. Håber ikke at det står al for klumpet.

På forhånd tusind tak for hjælpen

Kodeområde 1:
    'Categories
    For lRow = LBound(aData, 1) + 1 To UBound(aData, 1)
        If Not InCollection(cSeasonCategory, aData(lRow, 1) & "|" & aData(lRow, 2)) Then
            iArrayRows = iArrayRows + 1
            cSeasonCategory.Add iArrayRows, CStr(aData(lRow, 1) & "|" & aData(lRow, 2))         
        End If
    Next lRow
Spørgsmål 1:
Som jeg forstår det, tilføjes der i collectionen: cSeasonCategory de UNIKKE kombinationer af sæson og kategori. Der dannes ny række i collectionen via "iArrayRow = iArrayRows +1" - eller tælles antallet af rækker for kombinationen? Hvad gør udtrykket 'Cstr'?

Kodeområde 2:
    'Result
    ReDim aResult(1 To cSeasonCategory.Count, 1 To 5) 'Row,Columns
    For lRow = LBound(aData, 1) + 1 To UBound(aData, 1)
        iArrayRows = cSeasonCategory(aData(lRow, 1) & "|" & aData(lRow, 2))
       
        aResult(iArrayRows, 1) = aData(lRow, 1) 'Season
        aResult(iArrayRows, 2) = aData(lRow, 2) 'Category
       
        Select Case aData(lRow, 3)              'Price
            Case Is < 1000
                aResult(iArrayRows, 3) = aResult(iArrayRows, 3) + 1
            Case Is < 3000
                aResult(iArrayRows, 4) = aResult(iArrayRows, 4) + 1
            Case Else
                aResult(iArrayRows, 5) = aResult(iArrayRows, 5) + 1
        End Select
    Next lRow
Spørgsmål 2:
Forstår at Redim redefinere array-størrelse - således at resten af koden har en ramme. Som jeg forstår genbruges IArrayRows til at gennemløbe indholdet tabellen. Men hvad definere linien: iArrayRows = cSeasonCategory(aData(lRow, 1) & "|" & aData(lRow, 2))?


KOdeområde 3:
  Public Function InCollection(ByVal colObject As Collection,    ByVal keyValue As Variant)
    On Error Resume Next
    colObject keyValue
    If Err.Number = 0 Then InCollection = True
    On Error GoTo 0
  End Function
Spørgsmål 3:
Kan du forklare denne funktion nærmere?
13. januar 2014 - 19:23 #6
Kodeområde 1:
CSeasonCategory indeholder korrekt unikke kombinationer
iArrayRow bliver derfor også tildelt et unikt række nummer til hver kombination, og det bruges i kolonneområde to til at placere alle pris på den rigtige række i resultat området.

Kodeområde 2:
For hver række slåes kombinationen op i collectionen som returnerer kombinationens tildelte rækkenummer - her:
iArrayRows = cSeasonCategory(aData(lRow, 1) & "|" & aData(lRow, 2))
iArryRows får altså en række returneret, som bruges når der skal sættes data ind i aResult arrayet - f.eks. her
aResult(iArrayRows, 3) = aResult(iArrayRows, 3) + 1

Kodeområde 3:
Den bliver brugt i kodeområde 1, og den checker hvorvidt kombinationen allerede er tilføjet til collectionen.
If Not InCollection(cSeasonCategory... benyttes således som sikkerhed for at kombinationen kun tilføjes en gang.
Kombinationen tilføjes jo som en nøgle i collectionen, og nøglerne skal være unikke... nogle styrer det via On Error, jeg gør det med InCollection...

Hjalp det lidt?
13. januar 2014 - 19:24 #7
CStr - convert to string
Avatar billede hjald8 Nybegynder
13. januar 2014 - 22:43 #8
Hej. Tak for svar på spørgsmål.

Jeg er ikke fuldt med - men begynder at få en fornemmelse for det. Men det kræver lidt mere tid...

Læg et svar. Jeg kan komme videre med problemet. Tusind tak.
14. januar 2014 - 12:08 #9
Lidt tanker
Resultatet skal være et celleområde med 5 kolonner
Sæson  Kategori  Pris 1  Pris 2  Pris 3

Ved gennemløb af listen for evaluering af priserne, hvordan får jeg styr på, hvilke Sæson/Kategori kombinationer der findes, og hvor i mit celle område resultatet af evalueringen skal gemmes?

Kodeområde 1 sikre at vi kender alle Sæson/Kategori kombinationer, og cSeasonCategory bliver tildelt et nyt rækkenummer for hver kombination.
Hvis man spørger på cSeasonCategory("Forår|Kjole") vil collectionen returnere et rækkenummer kombinationen er blevet tildelt, hvorfor collectionen kan bruges ved indsættelse af data i kodeområde 3

Kodeområde 2 gennemløber data for at evaluere priserne og tælle op i de tre pris kolonner Pris 1,2,3. Her bruges cSeasonCategory til hele tide at ramme den rigtige række, som nævnt ovenfor.
Efter gennemløb indsættes hele aResult (celleområdet i array variabel)
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