12. januar 2014 - 11:46Der 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.
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.
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.
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))
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?
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...
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)
Synes godt om
Ny brugerNybegynder
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.