Avatar billede helver Nybegynder
06. juli 2009 - 22:54 Der er 13 kommentarer og
1 løsning

gange tal fra to forskellige tabeller med flere kriterier - hjælp!

Jeg har brug for en formel der ud fra min. 2 kriterier kan finde dem tallene i en tabel og gange med tallene i en anden tabel der opfylde samme kriterier.

Jeg har konstrueret en meget simplificeret udgave af mit problem:

Der er 2 tabeller ved siden af hinanden med fælles y-akse (afdeling 1,2 og 3) hvor tabel 1 repræsenterer salget med x-aksen Jan, Feb og Mar. Tabel 2 repræsenterer produkt splittet og har produkterne på x-aksen aa, bb og cc.

          Salget i DKK          Produkt split i %
afdeling  Jan  Feb  Mar      aa  bb  cc
1       
2
3
osv
...

Hvordan skal formlerne se ud i tabellen nedenfor når kriterierne f.eks. er afdeling 1 og 3?. Resultatet viser salget for de enkelte produkt. I skal forestille jer at der i virkeligheden er flere afdelinger og produkter.

Produkt\Periode    Jan    Feb    Mar
aa
bb
cc

Kriterie: afdeling 1 og 3

Håber I kan løse gåden, på forhånd tak!
Avatar billede Den Store Stygge ;0) Seniormester
07. juli 2009 - 07:17 #1
Jeg er ikke helt med på hvor du vil hen, skal resultattabellen indeholde Jan_AA=(Jan_1*AA_1) +(Jan_3*AA_3)?

eller skal der laves en resultattabel for hver afdeling?
Avatar billede helver Nybegynder
07. juli 2009 - 08:20 #2
Hej StoreStygge,

Det er fuldstændig korrekt forstået som du skriver allerførst.

Mvh
Lasse
Avatar billede helver Nybegynder
07. juli 2009 - 16:53 #3
Det skal lige tilføjes at formlerne skal kunne tage højde for at kriterierne kan ændre sig, f.eks. til afdeling 2+3 osv.
Avatar billede Den Store Stygge ;0) Seniormester
08. juli 2009 - 12:35 #4
Nu er jeg ikke klar over hvilken version af Excel du bruger (sprog og version), her har jeg prøvet at lave formlen som du kan anvende.

Det er lidt svært at beskrive med tekst, men jeg prøver ;0)

Antager vi at du har listet som først beskrevet i spsm, og måneder starter i B1, Produkter starter i E1, og afdelinger starter i A2, data ligger i cellerne B2:G6, og yderligere at afdelingerne du vil hente data til står i cellerne B9 og B10 (en afd i hver):
Følgende er en lang formel vist på 4 linier
UK:
=HLOOKUP(B$12;$B$1:$D$6;MATCH($B$9;$A$1:$A$6;0);FALSE)*
HLOOKUP($A13;$E$1:$G$6;MATCH($B$9;$A$1:$A$6;0);FALSE)+
HLOOKUP(B$12;$B$1:$D$6;MATCH($B$10;$A$1:$A$6;0);FALSE)*
HLOOKUP($A13;$E$1:$G$6;MATCH($B$10;$A$1:$A$6;0);FALSE)

DK:
=VOPSLAG(B$12;$B$1:$D$6;SAMMENLIGN($B$9;$A$1:$A$6;0);FALSK)*
VOPSLAG($A13;$E$1:$G$6;SAMMENLIGN($B$9;$A$1:$A$6;0);FALSK)+
VOPSLAG(B$12;$B$1:$D$6;SAMMENLIGN($B$10;$A$1:$A$6;0);FALSK)*
VOPSLAG($A13;$E$1:$G$6;SAMMENLIGN($B$10;$A$1:$A$6;0);FALSK)

(Linieskift skal fjernes)

Basis formlen for at finde en afdelings resultat:

HLOOKUP(C$12;$B$1:$D$6;MATCH($B$9;$A$1:$A$6;0);FALSE)*
HLOOKUP($B13;$E$1:$G$6;MATCH($B$9;$A$1:$A$6;0);FALSE)

eller på dansk:

VOPSLAG(C$12;$B$1:$D$6;SAMMENLIGN($B$9;$A$1:$A$6;0);FALSE)*
VOPSLAG($B13;$E$1:$G$6;SAMMENLIGN($B$9;$A$1:$A$6;0);FALSE)

skal der flere på, skal referencen til $B$9 redigeres til efterfølgende afdeling, og hele basisformlen indsættes efter +

Idet jeg tillader mig at gå ud fra du har en ide om låste referencer ($-tegn), ellers må du sende en kommentar igen ;0)
Avatar billede helver Nybegynder
08. juli 2009 - 22:03 #5
Det er super smart det du foreslår og det kan jeg helt sikkert bruge. Før jeg så dit svar havde jeg en ide om at vi skulle ud i en matrix formel med tryk på shift+ctrl+enter.

Et lille tillægsspørgsmål; hvis vi forestiller os at kriterierne øges fra 2 to f.eks. 10 eller flere så ville formlen blive meget lang. Findes der en løsning hvor referencen til $B$9 og $B$10 sker via funktionen "søg" eller en anden funktion hvor hele kriterieområdet markeres?
Avatar billede helver Nybegynder
09. juli 2009 - 20:37 #6
StoreStygge: Jeg har faktisk lige opdaget at når jeg lader en afdeling forekomme mere end 1 gang i kolonnen med afdelinger kan formlen ikke finde ud af at lægge dem sammen :-\ Jeg har selv forsøg at ændre vopslag med sum.hvis men det fungerer ikke.

Det er selvfølgelig min fejl da jeg ikke har forklaret det ordentligt fra starten men det er faktisk ret afgørende i min problemstilling da afdelingerne faktisk kan forekommer mere en end gang.

Håber du stadig har mod på at kigge på det når du får tid.

På forhånd tak!

PS: Jeg har Excel 2003 og dansk version.
Avatar billede Den Store Stygge ;0) Seniormester
10. juli 2009 - 05:25 #7
Well

Det VIL kunne laves, men da du har mange afdelinger og endda mulige gentagelser, kan jeg ikke se det kan lade sig gøre med "simple" formler.

Jeg ville gribe til at programmere en funktion som løser opgaven.

Er det noget du kan?

ellers skal jeg gerne hjælpe ;0)
Avatar billede helver Nybegynder
10. juli 2009 - 11:34 #8
OK, det har jeg kun gjort meget lidt i, men ville meget gerne lære mer, så hvis du har tid og lyst må du meget gerne skrive nogen koder jeg kan lege med.

Jeg vil kunne spare mange arbejdstimer hvis dette kommer til at virke :o)
Avatar billede Den Store Stygge ;0) Seniormester
11. juli 2009 - 09:29 #9
OK - Here we go ;0)

Koden skal kopieres ind i et modul.

Antager vi at du har listet som beskrevet:
Måneder starter i B1,
Fordeling starter i G1, og
Afdelinger starter i A2,
Data ligger i cellerne B2:L15, og yderligere at
Afdelingerne du vil samle står i cellerne B25:B28(en afd i hver)

Resultatområdet har:
Måneder vandret startende i B17
Fordeling lodret startende i A18

Funktionen indsættes i celle B18 således:

=GetProductData($A$1:$L$15;B$17;$A18;$B$25:$B$28)

og efterfølgende kopieres formlen til alle øvrige resultatceller


KODEN:


Function GetProductData(DataKildeMedOverskrifter As Range, _
                        SalgPeriode As Range, FordelingKode As Range, _
                        AfdelingKriterier As Range)
'*************************************************************************
' Kode udarbejdet på forespørgsel under EKSPERTEN.DK
' af Store Stygge
' DataKildeMedOverskrifter : område med data og række/kolonneoverskrifter
' SalgPeriode : overskrift måned i resultattabellen
' FordelingKode : overskrift Fordelingskode i resultattabellen
' AfdelingKriterier : område indeholdende afdelinger der skal summeres
'*************************************************************************

Dim curResult As Currency ' resultat variabel
Dim rngItemAfdeling As Range ' cellereference som anvendes til gennemløb af afdelinger
Dim colPeriode As Long ' periode kolonnenummer i datakilde
Dim colFordeling As Long ' fordelingskolonne i datakilde
Dim rowAfdeling As Long ' række for aktuel afdeling ved gennemløb
Dim rngCurrent As Range ' cellereference som anvendes til at sammenligne indhold
' fejl håndtering
On Error GoTo errHandling

' indstiller startcelle og startværdi
Set rngCurrent = DataKildeMedOverskrifter.Cells(1)
colPeriode = 1

' find periodekolonne
Do Until rngCurrent.Value = SalgPeriode.Value
    Set rngCurrent = rngCurrent.Offset(0, 1)
    colPeriode = colPeriode + 1
Loop

' indstiller startcelle og startværdi (kunne fortsættes, men bedre at genstarte)
Set rngCurrent = DataKildeMedOverskrifter.Cells(1)
colFordeling = 1

' find fordelingskolonne
Do Until rngCurrent.Value = FordelingKode.Value
    Set rngCurrent = rngCurrent.Offset(0, 1)
    colFordeling = colFordeling + 1
Loop

' gennemløb for hver afdeling der skal samles data for
For Each rngItemAfdeling In AfdelingKriterier
    rowAfdeling = 0
    ' checker hver række i datakilde kolonne 1
    For Each rngCurrent In DataKildeMedOverskrifter.Columns(1).Cells
        rowAfdeling = rowAfdeling + 1
        ' hvis række afdeling = aktuel afdeling fra listen
        If rngCurrent.Value = rngItemAfdeling.Value Then
            ' summer produktet med allerede summerede
            curResult = curResult + _
                        DataKildeMedOverskrifter.Cells(rowAfdeling, colPeriode) * _
                        DataKildeMedOverskrifter.Cells(rowAfdeling, colFordeling)
        End If
    Next
Next

' returnerer resultatet til cellen
GetProductData = curResult

' hvis fejl returneres #I/T til cellen
errHandling:
If Err.Number <> 0 Then
    'MsgBox "Der er desværre opstået en fejl med kode og beskrivelse:" & vbCr & _
            Err.Number & vbCr & _
            Err.Description & _
            "#I/T Returneres til cellen", vbCritical, "Funktions fejl"
    GetProductData = CVErr(xlErrNA)
End If

End Function
Avatar billede Den Store Stygge ;0) Seniormester
11. juli 2009 - 09:31 #10
skriv hvis du har brug for at kunne downloade et eksempel ;0)
m.v.h.

Store Stygge......
Avatar billede helver Nybegynder
12. juli 2009 - 22:57 #11
Det ser godt nok smart ud! Jeg har nu gjort som du siger men felterne i resultattabellen siger "#navn?"

Jeg har højreklikket på arket og klikket på "Vis programkode". Herefter "Insert" og "Module" og kopieret KODEN ind. Hvad har jeg mon gjort galt? Vil du sende mig en kopi af regnearket på lasse@helver.dk
Avatar billede helver Nybegynder
13. juli 2009 - 21:49 #12
Jeg fik det alligevel til at virke! :o) Håber du fortsat vil overvåge denne tråd hvis jeg lige har et par hurtige spørgsmål vedr koderne.

1000 tak for hjælpen
Avatar billede helver Nybegynder
13. juli 2009 - 23:55 #13
Sidder og eksperimentere lidt med koderne og forsøger at indsætte en kolonne B lige ved siden af afdelingerne som indikerer enten Produktion eller Udvikling for den enkelte afdeling. Kriteriet P eller U vil jeg definere i $C$25.

Din formel vil jeg ændre til:
=GetProductData($A$1:$L$15;B$17;$A18;$B$25:$B$28;$C$25) og jeg tilføjer følgende i koden: ProUdv as Range

Kan du fortælle mig hvordan jeg skal udvide dit lille program for at den tager højde denne ekstra kolonne med Produktion eller Udvikling?
Avatar billede helver Nybegynder
29. juli 2009 - 00:01 #14
Er der andre der evt kan bidrage? Hvis jeg på nogen måde kan betale med point gør jeg gerne det...men hvordan gøres det?

/L
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