Avatar billede lineriber Praktikant
29. oktober 2013 - 16:10 Der er 9 kommentarer og
1 løsning

Sum med flere kriterier

Hej Eksperter

jeg har brug for noget formel hjælp.
Jeg har en datatabel i sheet1 med med 21 kolonner og 7.094 rækker (A1:U7094) som jeg gerne vil have lavet en dynamisk rapport til i sheet2. Jeg er normalt fan a PIVOT men i dette tilfælde dur det ikke for brugeren at det er lavet via en PIVOT.

Det jeg mangler er en formel der kan summere alle værdier i kolonne U i sheet1 der opfylder følgende betingelser:
Kolonne K i sheet1 = celle A2 i sheet2
Kolonne A i sheet 1 = celle B2:B20 i sheet2
Kolonne T i sheet 1 = celle C2:C20 i sheet2
Kolonne p i sheet 1 = celle D2

Jeg har forsøgt mig med SUMIFS, men der kan jeg ikke se at jeg kan sætte criterierne til at være et range.
Så har jeg forsøgt mig med DSUM men der syntes jeg ikke at jeg kan angive flere kriterier med et range
Jeg har også forsøgt mig med SUMPRODUCT, igen er ranget et problem.

Er der nogen der har en idé til hvordan jeg kan løse ovenstående problematik?

mvh
Line
29. oktober 2013 - 16:22 #1
Hvad mener du med disse 2:

Kolonne A i sheet 1 = celle B2:B20 i sheet2
Kolonne T i sheet 1 = celle C2:C20 i sheet2

lig med en af cellerne i området eller......?
Avatar billede lineriber Praktikant
29. oktober 2013 - 16:39 #2
I celle B2:B20 i sheet2 har jeg en række projektnumre stående.
Jeg ønsker at jeg få en samlet sum på alle de nævnte projetnumre i cell B2:B20

I celle C2:C20 i sheet2 har jeg en række datoer stående.
Jeg ønsker at jeg få en samlet sum på alle de nævnte datoer i cell C2:C20

Eksempel: en samlet sum for fx projekt 00035, 00036 og 00037 for månederne jan-13, feb-13 og mar-13.

Forstår du hvad jeg mener nu?
29. oktober 2013 - 20:54 #3
Jeg er ikke verdensmester i array formler, og der findes muligvis en array formel som kan løse problematikken. Derfor ville jeg nok skrive en makro, som kan gøre dette.
For at kunne skrive lidt kode, så skal jeg vide noget mere om kolonnerne i resultat arket 'sheet2'.
Skal du blot have en sum i E2 - E20  ?
Avatar billede lineriber Praktikant
30. oktober 2013 - 08:53 #4
Email er sendt til dig Smartoffice_dk
Avatar billede lineriber Praktikant
30. oktober 2013 - 08:54 #5
UPS, #4 skulle selvfølgelig ikke have været et "Svar"!!
30. oktober 2013 - 17:59 #6
Der er oprettet to namedranges 'report_criteria_1', 'report_criteria_2' og 'report_sums'
Kriterie områderne indlæses i collections, som benyttes til at validere data op imod.
Data løbes igennem for validering og evt. summering før data skrives til 'report_sums'

Public Sub report_YearToDate()
    'Constants
    Const colCOST_TEXT  As Long = 17 'Q
    Const colPOST_TYPE  As Long = 11 'K
    Const colWBS_TYPE  As Long = 1  'A
    Const colDATES      As Long = 20 'T
    Const colWBS_Level  As Long = 16 'P
    Const colSUM        As Long = 21 'U
   
    'Variables
    Dim cPostType As New Collection, cWBS_Type As New Collection, cDates As New Collection, cWBS_Level As New Collection, cCostText As New Collection
    Dim aCosts As Variant, aSum() As Variant
    Dim lRow As Long
       
    'Fill variables
    Set cPostType = report_FillFilterCollectons(wsReport.Range("report_criteria_1").Columns(1))
    Set cWBS_Type = report_FillFilterCollectons(wsReport.Range("report_criteria_1").Columns(2))
    Set cDates = report_FillFilterCollectons(wsReport.Range("report_criteria_1").Columns(3))
    Set cWBS_Level = report_FillFilterCollectons(wsReport.Range("report_criteria_1").Columns(4))
    Set cCostText = report_FillFilterCollectons(wsReport.Range("report_criteria_2"))
    aCosts = wsCosts.Range("A1").CurrentRegion
    ReDim aSum(1 To cCostText.Count, 1 To 1) As Variant
   
    'Run through cost data to evaluate
    For lRow = LBound(aCosts, 1) To UBound(aCosts, 1)
        If InCollection(cCostText, aCosts(lRow, colCOST_TEXT)) Then 'is the current row within the selected external costs then SUM
            If InCollection(cPostType, aCosts(lRow, colPOST_TYPE)) Then
                If InCollection(cWBS_Type, aCosts(lRow, colWBS_TYPE)) Then
                    If InCollection(cDates, CStr(aCosts(lRow, colDATES))) Then
                        If InCollection(cWBS_Level, aCosts(lRow, colWBS_Level)) Then
                            aSum(cCostText(aCosts(lRow, colCOST_TEXT)), 1) = aSum(cCostText(aCosts(lRow, colCOST_TEXT)), 1) + aCosts(lRow, colSUM)
                        End If
                    End If
                End If
            End If
        End If
    Next lRow
   
    'Insert data
    wsReport.Range("report_sums").ClearContents
    wsReport.Range("report_sums").Value = aSum
End Sub

Private Function report_FillFilterCollectons(ByVal headerRange As Range) As Collection
    'Function to fill data into a collection
    Dim cRetVal As New Collection
    Dim lRow As Long
   
    On Error Resume Next 'cRetVal.Add will fail if to of the same keys is added to the collection
    For lRow = 2 To headerRange.Rows.Count
        If Not headerRange.Cells(lRow, 1).Value = "" Then
            cRetVal.Add lRow - 1, CStr(headerRange.Cells(lRow, 1).Value) 'Counter as value and content as key
        Else
            Exit For
        End If
    Next lRow
    On Error GoTo 0
   
    Set report_FillFilterCollectons = cRetVal
End Function

Public Function InCollection(ByVal colObject As Collection, ByVal keyValue As Variant)
    'Function to evaluate if a value is in a collection
    On Error Resume Next
    colObject keyValue
    If Err.Number = 0 Then InCollection = True
    On Error GoTo 0
End Function
Avatar billede lineriber Praktikant
11. november 2013 - 16:27 #7
Hej Smartoffice_dk

Tak for koden, jeg har fået den testet og den virker som jeg ønskede.
Tak for hjælpen :-)
Avatar billede leifl Nybegynder
14. november 2013 - 09:16 #8
Hej

Ønsker du at løse det med en formel kan du bruge denne array formel:

=SUM(Sheet1!U:U*(Sheet1!K:K=Sheet2!A2)*(SUM(FREQUENCY(Sheet1!T:T;Sheet2!$B$2:$B$20))>0)*(SUM(FREQUENCY(Sheet1!A:A;Sheet2!$C$2:$C$20))>0)*(Sheet1!P:P=Sheet2!$D$2))

Bemærk: Da det er en array-formel skal du trykke CTRL+SHIFT+ENTER når du afslutter formlen

Vh Leif
Avatar billede lineriber Praktikant
15. november 2013 - 14:05 #9
Hej Leif
Jeg vil utrolig gerne kunne bruge din formel, men jeg kan ikke få den til at virke. Jeg får fejlen #value med forklaringen "a value is of a wrong data type".

Og ja, jeg har brugt CTRL+SHIFT+ENTER og min excel er engelsk, så det kan ikke være det.

Jeg syntes det er meget svært at fejlsøge på formlen, så kan jeg evt. sende dig filen?

Har det noget at sige at der er overskrifter på kolonnerne i sheet1?
Avatar billede leifl Nybegynder
18. november 2013 - 13:24 #10
Hej

Jeg har opdaget jeg var lidt for hurtig da Frequency formlen ikke altid vil virke for problemet.

Prøv derfor i stedet med denne formel:

=SUM(Sheet1!U:U*(Sheet1!K:K=Sheet2!A2)*(IFERROR((MATCH(Sheet1!A:A;Sheet2!$C$2:$C$20;0)>0);0)*(IFERROR((MATCH(Sheet1!T:T;Sheet2!$B$2:$B$20;0)>0);0)*(Sheet1!P:P=Sheet2!$D$2))))

Derudover har du ret, hvis der er headings i Sheet1 kan du ikke vælge hele søjerne men i stedet for T:T skriver du så T2:T2000 osv - rigeligt til at dække dit dataområde samtidig med at heading ikke er med i range'en.

Se om det virker, ellers er du velkommen til at skrive til mig separat
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

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