Avatar billede xjln Juniormester
08. december 2003 - 13:22 Der er 20 kommentarer og
2 løsninger

Hjælp til formel med avanceret HVIS funktion.

I en række f.eks. (6) har jeg værdier mellem 0 og 100 stående.
Jeg mangler her lidt hjælp til en, for mig avanceret HVIS funktion.

I en anden række (7) skal ovenstående værdier beregnes som følgende:
Værdien i A6 skal ganges med 3,333, det skal de øvrige værdier (B6, C6, D6…osv.) også hvis ellers værdien er større end 0, så langt så godt.
Hvis en eller flere på hinanden følgende cellers værdi er 0 skal den først kommende celle med værdien større end 0 fratrækkes 1 som deles ud på de ”foranstående” celler med værdien 0 samt cellen selv som også tillægges den resterende værdi.

Dette kræver vist et eksempel:

A6= 1,    B6=2,    C6=0,    D6=0,    E6=0, F6=4……

A7=3,333 – 1x3,333
B7=6,666 – 2x3,333
C7=0,833 – (1x3,333)/4
D7=0,833 – (1x3,333)/4
E7=0,833 – (1x3,333)/4
F7=3,833 – ((1x3,333)/4)+3
….

Mængden af celler med værdien 0 kan varigere mellem 1 og 60 inden der kommer en celle med værdi større end 0.

Er der nogen der har et forslag til at løse dette?
Avatar billede kabbak Professor
08. december 2003 - 22:39 #1
Prøv at teste denne brugerdefinerede funktion

Public Function ADVHvis(VærdiCelle As Range) As Double
Dim Pværdi As Integer, Oværdi As Integer, Temp As Double, C As Integer, I As Integer
Dim Nuller As Integer
Nuller = 0
C = VærdiCelle.Column
If VærdiCelle > 0 Then
Pværdi = VærdiCelle
Temp = Pværdi * 3.333
For I = 1 To C - 1
If VærdiCelle.Offset(0, -I) = 0 Then
Nuller = Nuller + 1
Else
GoTo SlutRegning:
End If
Next
Else
Oværdi = VærdiCelle
Temp = (1 * 3.333) / 4
End If
SlutRegning:
If Nuller > 0 Then
Temp = ((1 * 3.333) / 4) + Nuller
End If
ADVHvis = Temp
End Function
Avatar billede kabbak Professor
09. december 2003 - 08:25 #2
eller skal den være sådan.

Bemærk at den kun kan bruges i vandret retning

Public Function ADVHvis(VærdiCelle As Range) As Double
Dim Pværdi As Integer, Oværdi As Integer, Temp As Double, C As Integer, I As Integer
Dim Nuller As Integer
Nuller = 0
C = VærdiCelle.Column
If VærdiCelle > 0 Then
Pværdi = VærdiCelle
Temp = Pværdi * 3.333
For I = 1 To C - 1
If VærdiCelle.Offset(0, -I) = 0 Then
Nuller = Nuller + 1
Else
GoTo SlutRegning:
End If
Next
Else
Oværdi = VærdiCelle
Temp = (1 * 3.333) / 4
End If
SlutRegning:
If Nuller > 0 Then
Temp = ((1 * 3.333) / 4) + (VærdiCelle - 1)
End If
ADVHvis = Temp
End Function
Avatar billede xjln Juniormester
10. december 2003 - 21:20 #3
Hej Kabbak

Det ser umiddelbart fint ud til det eksempel jeg har lavet, men meningen var at 4 tallet >>Temp = (1 * 3.333) / 4<< skulle være variabel ud fra hvor mange celle der indeholdt 0.
I mit eksempel var der 3 hvilket giver 4 celler, men der kan være mellem 0 og 60 celler indeholdende værdien 0, derfor skulle denne også gerne være variabel.

Nogle forslag?
Avatar billede kabbak Professor
10. december 2003 - 22:22 #4
du vil altså have alle celler med 0 talt først eller er det kun celler med 0 imellem 2 celler hvor værdien er større end 0
Avatar billede xjln Juniormester
11. december 2003 - 08:40 #5
Kun cellerne med 0 mellem 2 celler hvor værdien er større end 0.
Avatar billede xjln Juniormester
11. december 2003 - 10:56 #6
Og jeg kan se det ville være en fordel hvis det var med kolonner og ikke rækker som jeg har beskrevet.
Avatar billede dambe Nybegynder
11. december 2003 - 16:11 #7
Er 1 formel et krav?
Avatar billede xjln Juniormester
11. december 2003 - 21:19 #8
Nej ikke hvis det kan laves med flere.
Avatar billede dambe Nybegynder
11. december 2003 - 21:30 #9
Sender et forslag om lidt.
Avatar billede dambe Nybegynder
11. december 2003 - 21:43 #10
Start i A2.

Kolonne A:
3,333
3,333
etc.

Kolonne B:
Værdier 1-100 valgfri

Kolonne C:
=HVIS(OG(B2>0;B1>0);A2*B2;HVIS(ELLER(B1=0;B2>0);0;HVIS(B2=0;1;0)))+HVIS(OG(B1=0;B2=0);C1+1;0)+HVIS(OG(B1=0;B2>0);A2*1/B2+B2-1;0)

Kolonne D:
=HVIS(OG(B2=0;D3>0);D3;HVIS(OG(B3>0;B2=0);((C2/C2)/(C2+1))*A2;0))

Lidt primitivt men det virker her.
Avatar billede kabbak Professor
12. december 2003 - 00:06 #11
Her er en til kolonner

Function V_ADVHvis(VærdiCelle As Range) As Double
Dim Nuller As Integer
Nuller = 0
R = VærdiCelle.Row
If VærdiCelle = 0 Or VærdiCelle.Offset(-1, 0) = 0 Then
  For I = 1 To R - 1
    If VærdiCelle.Offset(-I, 0) = 0 Then
        Nuller = Nuller + 1
      Else
      Exit For
    End If
    Next
I = -1
  Do
    I = I + 1
      If VærdiCelle.Offset(I, 0) = 0 Then
          Nuller = Nuller + 1
      End If
    Loop Until VærdiCelle.Offset(I, 0) > 0 Or VærdiCelle.Offset(I, 0) = ""
End If
If VærdiCelle.Offset(I, 0) = "" Then
If Nuller > 0 Then Nuller = Nuller - 1
Else
If Nuller > 0 Then Nuller = Nuller + 1
End If
A = Nuller
If A > 0 And VærdiCelle = 0 Then V_ADVHvis = 1 * 3.333 / A
If A = 0 And VærdiCelle > 0 Then V_ADVHvis = VærdiCelle * 3.333
If A > 0 And VærdiCelle > 0 Then V_ADVHvis = (1 * 3.333 / A) + A - 1
Application.Volatile
End Function
Avatar billede kabbak Professor
12. december 2003 - 08:07 #12
Du skal nok udskifte

If A > 0 And VærdiCelle > 0 Then V_ADVHvis = (1 * 3.333 / A) + A - 1

med

If A > 0 And VærdiCelle > 0 Then V_ADVHvis = (1 * 3.333 / A) + VærdiCelle - 1
Avatar billede xjln Juniormester
12. december 2003 - 08:29 #13
Kabbak

Det hjalp lidt men der er stadig lige lidt med den første celle.

Her er et eksempel jeg har lavet:

    "Din" udregning      Skulle have været
1    1,6665              3,333
0    0,5555              0,5555
0    0,5555              0,5555
0    0,5555              0,5555
0    0,5555              0,5555
0    0,5555              0,5555
6    5,5555              5,5555
0    0,416625      0,416625
0    0,416625      0,416625
0    0,416625      0,416625
0    0,416625      0,416625
0    0,416625      0,416625
0    0,416625      0,416625
0    0,416625      0,416625
2    1,416625      1,416625
Avatar billede xjln Juniormester
12. december 2003 - 08:35 #14
Dambe

Dit forslag virker nogenlunde, men ved den første og den sidste celle går det galt.
Man skal godt nok "sortere" mellem de 2 kolonner for at få de rigtige data men den har jeg luret.
Avatar billede dambe Nybegynder
12. december 2003 - 10:12 #15
Celle B1 må ikke være tom, brug evt. tekst.

Hvilken fejl får du i sidste celle?
Avatar billede kabbak Professor
12. december 2003 - 10:20 #16
Xjln

Den første celle med værdier skal starte i række 2
række 1 er til overskrifter, den må ikke være tom og ikke et tal
Avatar billede xjln Juniormester
12. december 2003 - 10:38 #17
Kabbak

Bingo så virker det
Avatar billede xjln Juniormester
12. december 2003 - 10:43 #18
dambe

Det hjalp på første celle.

Det er ikke kun sidste celle det er galt med, hver gang der står en værdi regnes der forkert, cellerne ovenover indeholdende 0 får den rigtige værdi, mens cellen med værdien ikke fratrækkes 1 og tillægges den andel 0 cellerne får.
Avatar billede dambe Nybegynder
12. december 2003 - 11:24 #19
Kolonne C:

=HVIS(OG(B2>0;B1>0);A2*B2;HVIS(ELLER(B1=0;B2>0);0;HVIS(B2=0;1;0)))+HVIS(OG(B1=0;B2=0);C1+1;0)+HVIS(OG(B1=0;B2>0);(A2/(C1+1))+B2-1;0)
Avatar billede kabbak Professor
12. december 2003 - 11:30 #20
Jeg smider lige et svar, hvis du nu kom i tanke om at jeg skulle have points.

;-))
Avatar billede dambe Nybegynder
12. december 2003 - 12:27 #21
Når det regner på præsten drypper det på degnen,eller tager jeg fejl.

;o)
Avatar billede xjln Juniormester
12. december 2003 - 15:55 #22
Hejsa I to

Jeg vil fordele poitene lidt da begge løsningsmodeller er ok.

Dog vil jeg sige at kabbak´s løsning er mest brugervenlig selv om dambe´s løsning nok er den jeg bedst selv kan gennemskue ;-)

dambe:35p
kabbak:100p

Tak for indsatsen og god weekend
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