Avatar billede arentoft Nybegynder
08. maj 2007 - 14:34 Der er 14 kommentarer og
1 løsning

En meget lang formel - må kunne laves nemmere

Jeg har et problem med en alt for lang formel, faktisk så lang at Excel ikke kan tage flere tegn. Derfor må den kunne laves nemmere og pænere - bare ikke af mig! :-(

I nedenstående eksempel har jeg forsøgt at skitsere min problemstilling. Kort fortalt har jeg nogle fortløbende ugesierier af data, der skal sammenlignes. Dog kan jeg ikke være sikker på at der data for hver kolonner i hver uge - derfor skal der kun sammenligned hvis der er valid data i samme uge med et års mellemrum.

Uge    B  C ... Q Indeks
01.06 10 10      -
02.06  9      10 -
03.06    10    10 -
...
01.07 11 11    10 110 (kolonne B,C)
02.07 10 11    10 105 (kolonne B,Q)
03.07    11    10 105 (kolonne C,Q)

Jeg benytter denne simplificerede formel:

=SUM(HVIS(OG(ER.TAL(B55);ER.TAL(B3));(B55/B3)*100;0)+HVIS(OG(ER.TAL(C55);ER.TAL(C3));(C55/C3)*100;0)+ ... )

Problemet er når den skal getages for hver kolonne - over 20 stk.

Det må kunne gøres på en lettere måde - så håber nogen kan hjælpe mig?

/arentoft/

PS Sender meget gerne et rigtigt eksempel i Excel!
Avatar billede excelent Ekspert
08. maj 2007 - 15:12 #1
prøv send et eks.
pm@madsen.tdcadsl.dk
Avatar billede excelent Ekspert
08. maj 2007 - 16:55 #2
Ja der bliver for mange HVIS sætninger i formlen så
jeg vil foreslå en brugerdefineret Funktion:
Indsæt i et alm modul og andvend den i arket sådan:

=mySum(3;26)

hvor 3 representerer kolonne C og 26 kolonne Z
3-26 ændres efter behov

Function mySum(kol1, kol2)
Dim x, t
Application.Volatile
For t = kol1 To kol2
If Cells(55, t) > 0 And Cells(3, t) > 0 Then
x = x + (Cells(55, t) / Cells(3, t)) * 100
End If
Next
mySum = x
End Function

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

eller indsæt en formel nederst i hver kolonne:
=HVIS(ER.FEJL(C55/C3*100);0;C55/C3*100)
og kopier den ud til højre og lav en sum her
Avatar billede arentoft Nybegynder
08. maj 2007 - 21:29 #3
Hvordan får jeg den så til automatisk at tilpasse sig de fremtidige nye rækker. som jeg ser det er række 55 og 3 kodet fast ind i denne Funktion?
Avatar billede excelent Ekspert
08. maj 2007 - 22:09 #4
ok så udvider vi funktionen lidt

Function xSum(kol1, kol2, rk1, rk2)
Dim x, t
Application.Volatile
For t = kol1 To kol2
If Cells(rk2, t) > 0 And Cells(rk1, t) > 0 Then
x = x + (Cells(rk2, t) / Cells(rk1, t)) * 100
End If
Next
xSum = x
End Function


i arket skriver du så
=xsum(3;26;RÆKKE(3:3);RÆKKE(55:55))

hvor 3 er første kolonne (C) og 26 sidste kolonne (Z)
og RÆKKE(3:3) indikerer at der skal summeres fra række 3
og RÆKKE(55:55) indikerer der skal summeres til række 55

indsæt formel og kopier ned
Avatar billede excelent Ekspert
08. maj 2007 - 22:21 #5
jeg gætter på du indsætter formel i AF3 og kopierer ned
formel i AF4 skal så beregne kolonnerne i række 4 til 56
og i AF5 række 5 til 57
hvis jeg har forstået dig ret ?
Avatar billede arentoft Nybegynder
08. maj 2007 - 22:23 #6
Jeg tester lige - men lige nu ser det lovende ud :-)
Avatar billede arentoft Nybegynder
08. maj 2007 - 23:07 #7
Har fået det til at spille nu min endelige Funktion ser således ud:

Function MyIndeks(kol1, kol2, row)
Dim t, indeks, antalCeller
Application.Volatile
For t = kol1 To kol2
If Cells(row, t) > 0 And Cells(row - 52, t) > 0 Then
indeks = indeks + (Cells(row, t) / Cells(row - 52, t)) * 100
antalCeller = antalCeller + 1
End If
Next
If antalCeller = 0 Then
MyIndeks = 0
Else
MyIndeks = indeks / antalCeller
End If
End Function

og den kaldes således i eks. række 55:

=MyIndeks(KOLONNE(C55);KOLONNE(Z55);RÆKKE())

Lægger du ikke et svar så du kan få dine point?
Avatar billede bak Seniormester
09. maj 2007 - 00:44 #8
Det burde også kunne laver uden VBA

=SUM(IF((C55:Z55>0);(C3:Z3)/(C55:Z55);0))

Indsættes som en arrayformel, dvs indtastning af formlen afsluttes med ctrl-shift-enter istedet for bare enter, således at formlen får tuborgklammer omkring {}
Avatar billede bak Seniormester
09. maj 2007 - 01:15 #9
Sorry, så lige at den skulle vendes og du skulle have et snit

=SUM(IF((C3:Z3>0);(C55:Z55)*100/(C3:Z3);0))/COUNT(C3:Z3)
eller på dansk
=SUM(HVIS((C3:Z3>0);(C55:Z55)*100/(C3:Z3);0))/TÆL(C3:Z3)
Avatar billede arentoft Nybegynder
09. maj 2007 - 08:10 #10
Tager den højde for hvis der er tomme felte i datarækkend for 2007, altså rækken C55? Når jeg indsætter den i mit ark siger den : #VÆRDI! ?? (indsætter den danske)
Avatar billede excelent Ekspert
09. maj 2007 - 10:13 #11
nej det gør den ikke, men måske bak har et bud på det !
jeg valgte den lette løsning så forløbig et svar fra mig :-)
Avatar billede bak Seniormester
09. maj 2007 - 10:14 #12
=SUM(IF((C3:Z3>0);(C55:Z55)*100/(C3:Z3);0))/SUM((C3:Z3<>0)*(C55:Z55<>0))
Avatar billede arentoft Nybegynder
09. maj 2007 - 10:28 #13
Bak: Får stadig #VÆRDI! fejlen i mit ark, kan ikke helt se hvad der går galt. Hvis du kan få det til at spille får du selvfølgelig også point. Jeg accepterer excelents svar.
Avatar billede bak Seniormester
09. maj 2007 - 11:43 #14
Er ikke interesseret i pointene :-)
http://www.tbdl.dk/excel/langformel.xls

Jeg tror du har glemt at afslutte indtastning med ctrl-shift enter
Avatar billede arentoft Nybegynder
09. maj 2007 - 11:53 #15
Fair nok :-) Men nu spiller det bare max! Fedt! - kan du kort forklare mig hvad ctrl-shift enter gør?
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