Avatar billede tvc Seniormester
06. januar 2007 - 00:05 Der er 10 kommentarer og
1 løsning

Sumfunktion med flere opslag og sum over flere ark

Hej

Jeg har tidligere fået nedenstående funktion men skal nu bruge en funktion der kan lidt mere.

------------------

Function SumSpecial(Lookup_value As String, col_index_num As Byte)
Dim t, rk, ws, mySum, Fra, Til

Application.Volatile

Fra = Sheets("Output").Range("Monthfrom").Value + 1: Til = Sheets("Output").Range("Monthto").Value + 1

For ws = Fra To Til
    For t = 1 To Sheets(ws).Range("A200").End(xlUp).Row
        If Sheets(ws).Cells(t, 1).Value = Lookup_value Then mySum = mySum + Sheets(ws).Cells(t, col_index_num)
    Next
Next

SumSpecial = mySum

End Function


Funktionen finder rækken der skal summeres fra på baggrund af en opslagsværdi (kontotekst) og summerer kolonnerne angivet ved den fundne række og en fra kolonne og en til kolonne (der indsættes i funktionen) i alle de underliggende ark (der kommer hele tiden flere ark til som skal indgå i summen).

Den ny funktion skal kunne lidt mere.

Funktionen skal kunne:
- finde rækken der skal summeres fra på baggrund af en opslagsværdi (kontotekst)
- skal kunne summere over alle de underliggende ark (alle ark der ikke indeholder funktionen selv).
- Skal kunne summere de seneste 12 måneders tal (12 kolonner fra hvert afdelingsark – de un-derliggende ark) fra en given dato og 12 måneder tilbage.
- Hvert afdelingsark indeholder mere end et års tal og der kommer hver måned en ny kolonne til.

Projektmappen indeholder:
- 1 sumark
- Et uendeligt antal afdelingsark

Hvert afdelingsark indeholder:
- En kolonne A der indeholder kontonavn
- Kolonne B til ? der indeholder hver måneds tal
- En række hvor der i kolonne A står Date og hvor der fra kolonne B til ? en angivet måned og år (måned og år har ikke nødvendigvis samme udgangspunkt i alle afdelingsarkene – marts 2006 står i rækken benævnt Date men kan være indsat i forskellige kolonner i afdelingsarkene).


Er der en der kan hjælpe mig med et ombygge ovenstående funktion så den kan ovenstående?

Med venlig hilsen

TVC
Avatar billede excelent Ekspert
06. januar 2007 - 10:53 #1
Denne forudsætter dine måned/år er indsat som tekst fx. jan06

Function TotalSum(Konto, Måned, År)
Application.Volatile
Dim ws
Dim t, Drk, Krk, FraKol, TilKol, ArkSum
For ws = 2 To Sheets.Count

For t = 1 To Sheets(ws).Cells(65500, 1).End(xlUp).Row
If Sheets(ws).Cells(t, 1) = "Date" Then Drk = t: Exit For
Next

For t = 1 To Sheets(ws).Cells(65500, 1).End(xlUp).Row
If Sheets(ws).Cells(t, 1) = Konto Then Krk = t: Exit For
Next

For t = 2 To Sheets(ws).Cells(Drk, 256).End(xlToLeft).Column
If Left(Sheets(ws).Cells(Drk, t), 3) = Måned And Right(Sheets(ws).Cells(Drk, t), 2) = År Then
FraKol = t: TilKol = FraKol + 11
End If
Next

For t = FraKol To TilKol
ArkSum = ArkSum + Sheets(ws).Cells(Krk, t)
Next

Next
TotalSum = ArkSum

End Function
Avatar billede excelent Ekspert
06. januar 2007 - 10:57 #2
Sum af konto Indkøb fra december 2006 og 11 måneder frem i alle afd.ark
=TotalSum("Indkøb";"dec";"06")
Avatar billede tvc Seniormester
07. januar 2007 - 15:05 #3
Jeg har rettet lidt i funktionen, men kun navne og den virker næsten som jeg havde tænkt mig, men der er en lille ting som går galt.

Hvis et ark ikke indeholder den dato, der skal summeres fra (FraKol) skal funktionen søge efter den måned der kommer efter og så kun summerer de 11 måneder o.s.v.

Eksempelvis hvis jeg vil have summeret fra jan 06 til dec 06 og nogle af mine underliggende ark ikke indeholder jan 06 (afdelingen er startet senere), så skal funktionen kun summerer dette afdelingsark fra Feb 06 og til Dec 06 (11 måneder) ligeledes hvis en afdeling først er startet i Jul 06 summeres kun 6 måneder.

Kan det indbygges i den nuværende funktion?

Her er den jeg har rettet lidt i:

Function TotalSum(Account, Month, Year)
Application.Volatile
Dim ws
Dim t, Drk, Krk, FraKol, TilKol, ArkSum

For ws = 2 To Sheets.Count

    For t = 1 To Sheets(ws).Cells(65500, 1).End(xlUp).Row
        If Sheets(ws).Cells(t, 1) = "Month name" Then Drk = t: Exit For
    Next

    For t = 1 To Sheets(ws).Cells(65500, 1).End(xlUp).Row
        If Sheets(ws).Cells(t, 1) = Account Then Krk = t: Exit For
    Next

    For t = 2 To Sheets(ws).Cells(Drk, 256).End(xlToLeft).Column
        If Left(Sheets(ws).Cells(Drk, t), 3) = Month And Right(Sheets(ws).Cells(Drk, t), 2) = Year Then
            FraKol = t: TilKol = FraKol + 11
        End If
    Next

    For t = FraKol To TilKol
        ArkSum = ArkSum + Sheets(ws).Cells(Krk, t)
    Next

Next

TotalSum = ArkSum

End Function
Avatar billede excelent Ekspert
07. januar 2007 - 16:08 #4
er det ok hvis den regner bagud som i dit første indlæg?
Avatar billede tvc Seniormester
07. januar 2007 - 16:21 #5
Det er helt i orden. Er der mulighed for at sikre, at den ikke kan gå længere tilbage end kolonne 2 (bliver i sidste ende nok kolonne 3)?
Avatar billede excelent Ekspert
07. januar 2007 - 16:23 #6
ja kolonne 2, så kan du bare rette til 3 når det blir aktuel

jeg ser om jeg kan finde en løsning på det andet.
Avatar billede tvc Seniormester
07. januar 2007 - 16:32 #7
Hvis du kan løse det vil jeg blive meget glad :-)
Avatar billede excelent Ekspert
07. januar 2007 - 18:26 #8
Prøv om denne dur, blev nødt til at ændre input som du kan se
=Tsum("C";"jan";"dec";"06")

Function TSum(Konto, FraMåned, TilMåned, År)
Application.Volatile
Dim ws, t, Drk, Krk, FraKol, TilKol, ArkSum

For ws = 2 To Sheets.Count

For t = 1 To Sheets(ws).Cells(65500, 1).End(xlUp).Row
If Sheets(ws).Cells(t, 1) = "Date" Then Drk = t: Exit For
Next

For t = 1 To Sheets(ws).Cells(65500, 1).End(xlUp).Row
If Sheets(ws).Cells(t, 1) = Konto Then Krk = t: Exit For
Next

For t = 2 To Sheets(ws).Cells(Drk, 256).End(xlToLeft).Column
If Left(Sheets(ws).Cells(Drk, t), 3) = FraMåned And Right(Sheets(ws).Cells(Drk, t), 2) = År Then
FraKol = t: Exit For
End If
Next
If FraKol = "" Then FraKol = 2

For t = 2 To Sheets(ws).Cells(Drk, 256).End(xlToLeft).Column
If Left(Sheets(ws).Cells(Drk, t), 3) = TilMåned And Right(Sheets(ws).Cells(Drk, t), 2) = År Then
TilKol = t: Exit For
End If
Next
If TilKol = "" Then TilKol = Sheets(ws).Cells(Drk, 256).End(xlToLeft).Column

If TilKol < 2 Then TilKol = 2
ArkSum = ArkSum + Application.Sum(Sheets(ws).Range(Chr(FraKol + 64) & Krk & ":" & Chr(TilKol + 64) & Krk))

Next
TSum = ArkSum

End Function
Avatar billede tvc Seniormester
07. januar 2007 - 19:10 #9
Tak Excelent

Det virker perfekt - jeg har ændret en lille ting og indsat FraÅr og TilÅr. Dermed kan den også gå over kalenderåret hvis det skulle blive aktuelt.

Tak for hjælpen lægger du et svar?
Avatar billede tvc Seniormester
07. januar 2007 - 19:10 #10
Således kom den til at se ud:

Function TSum(Konto, FraMåned, FraÅr, TilMåned, TilÅr)
Application.Volatile
Dim ws, t, Drk, Krk, FraKol, TilKol, ArkSum

For ws = 2 To Sheets.Count

For t = 1 To Sheets(ws).Cells(65500, 1).End(xlUp).Row
If Sheets(ws).Cells(t, 1) = "Date" Then Drk = t: Exit For
Next

For t = 1 To Sheets(ws).Cells(65500, 1).End(xlUp).Row
If Sheets(ws).Cells(t, 1) = Konto Then Krk = t: Exit For
Next

For t = 2 To Sheets(ws).Cells(Drk, 256).End(xlToLeft).Column
If Left(Sheets(ws).Cells(Drk, t), 3) = FraMåned And Right(Sheets(ws).Cells(Drk, t), 2) = FraÅr Then
FraKol = t: Exit For
End If
Next
If FraKol = "" Then FraKol = 2

For t = 2 To Sheets(ws).Cells(Drk, 256).End(xlToLeft).Column
If Left(Sheets(ws).Cells(Drk, t), 3) = TilMåned And Right(Sheets(ws).Cells(Drk, t), 2) = TilÅr Then
TilKol = t: Exit For
End If
Next
If TilKol = "" Then TilKol = Sheets(ws).Cells(Drk, 256).End(xlToLeft).Column

If TilKol < 2 Then TilKol = 2
ArkSum = ArkSum + Application.Sum(Sheets(ws).Range(Chr(FraKol + 64) & Krk & ":" & Chr(TilKol + 64) & Krk))

Next
TSum = ArkSum

End Function
Avatar billede excelent Ekspert
07. januar 2007 - 19:14 #11
ok velbekom
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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