Avatar billede jens_frederik Nybegynder
04. september 2006 - 10:23 Der er 17 kommentarer og
2 løsninger

Automatisk midling af rådata

Hej

Jeg har en kollone med rådata i et excel regneark - som skal midles.
Rådata skal deles i tre lige store dele - hver del skal midles - og så skal man vurderer om de tre midlede data er stabile nok. Hvis de ikke er, tager man nogle flere data - deler i tre lige store dele, midler ….. osv.
Jeg vil vide hvor mange data jeg skal bruge for at have en midling der er god nok.

Sådan skal det gøres:

Jeg stiller markøren i toppen af kollonen
- tager data fra felt 1-3 og midler dem
- tager data fra felt 4-6 og midler dem
- tager data fra felt 7-9 og midler dem.
Sammenligningen af de tre sæt midlede data skal udregnes i procent efter denne måde:
(Største middelværdi - mindste middelværdi)/middelværdien af alle tre middelværdier * 100
Hvis den procentvise forskel er mindre end 2% - så har jeg en midling der er god - hvis den er større end 2% - skal der nogle flere tal til.

- tager vi data fra felt 1-4 og midler dem
- tager vi data fra felt 5-8 og midler dem
- tager vi data fra felt 9-12 og midler dem
Der laves en sammenligning efter samme formel - hvis forskel er under 2% - fint - ellers…..
    - tager vi data fra felt 1-5 og midler dem
    - tager vi data fra felt 6-10 og midler dem

osv. osv.

Når jeg hra tal nok, så jeg kan lave en passende god midling, vil jeg gerne vide hvor mange data jeg har brugt - og hvad resultatet er blevet til... og hvis det nemt kan lade sig gøre, så se udviklingen af den procentvise forskel - fx. i form af en kurve.

Jeg tror jeg skal op i nærheden af 3 sæt hver bestående af 100 værdier = 300 rækker rådata - inden jeg har en midling der er god nok.

Er der nogen der kan hjælpe mig med noget programmering der kan klare det?

Mvh

Jens Frederik
Avatar billede gider_ikke_mere Nybegynder
04. september 2006 - 14:52 #1
Prøv denne her:


Private Sub CommandButton1_Click()
Dim Antal, Forsoeg
Antal = 3
Dim rankarray() As Integer
ReDim Preserve rankarray(2)

For Forsoeg = 1 To 500
AVG = 0
For i = 1 To Antal
    AVG = AVG + Range("A" & i).Value
Next
rankarray(0) = AVG / Antal * 1000
Range("B" & Antal).Value = rankarray(0) / 1000

AVG = 0
For I2 = Antal + 1 To Antal * 2
    AVG = AVG + Range("A" & I2).Value
    MIDDEL2 = AVG / Antal
Next
rankarray(1) = MIDDEL2 * 1000
Range("B" & Antal * 2).Value = rankarray(1) / 1000

AVG = 0
For I3 = Antal * 2 + 1 To Antal * 3
    AVG = AVG + Range("A" & I3).Value
    MIDDEL3 = AVG / Antal
Next
rankarray(2) = MIDDEL3 * 1000
Range("B" & Antal * 3).Value = rankarray(2) / 1000

N = UBound(rankarray)
swap = True
Do While swap
  swap = False
  For i = 1 To N - 1
      For j = i To N
        If rankarray(i) > rankarray(j) Then
            Temp = rankarray(i)
            rankarray(i) = rankarray(j)
            rankarray(j) = Temp
            swap = True
        End If
    Next
  Next
Loop
Gnsnit = 0
For Z = 0 To 2
    Gnsnit = Gnsnit + rankarray(Z)
Next
Gnsnit = Gnsnit / 3

RESULT = (rankarray(2) - rankarray(0)) / Gnsnit * 100
Range("C" & Forsoeg).Value = RESULT

If RESULT <= 2 And RESULT >= -2 Then
    Range("D" & Forsoeg).Value = RESULT
    MsgBox "Kom frem til resultatet!"
    Exit Sub
End If
Columns("B:B").Select
Selection.ClearContents
Antal = Antal + 1
ReDim rankarray(2)
Next
End Sub
Avatar billede kabbak Professor
04. september 2006 - 18:24 #2
Her får du besked om hvor mange rækker der indgår og forskellen i %

Private Sub CommandButton1_Click()
Dim Data1 As Variant, Data2 As Variant, Data3 As Variant, RW As Long, Gentagelse As Integer, PRC As Double
Dim MI1, MI2, Mi3
Dim Mindste, Største, Gennemsnit
RW = Cells(65536, ActiveCell.Column).End(xlUp).Row
For Gentagelse = 2 To RW / 3
Data1 = Range(Cells(1, ActiveCell.Column), Cells(Gentagelse, ActiveCell.Column))
Data2 = Range(Cells(Gentagelse + 1, ActiveCell.Column), Cells(Gentagelse + Gentagelse, ActiveCell.Column))
Data3 = Range(Cells(Gentagelse + Gentagelse + 1, ActiveCell.Column), Cells(Gentagelse + Gentagelse + Gentagelse, ActiveCell.Column))
MI1 = Application.WorksheetFunction.Average(Data1)
MI2 = Application.WorksheetFunction.Average(Data2)
Mi3 = Application.WorksheetFunction.Average(Data3)
Mindste = Application.WorksheetFunction.Min(MI1, MI2, Mi3)
Største = Application.WorksheetFunction.Max(MI1, MI2, Mi3)
Gennemsnit = Application.WorksheetFunction.Average(MI1, MI2, Mi3)
PRC = ((Største - Mindste) / Gennemsnit) * 100
'(Største middelværdi - mindste middelværdi)/middelværdien af alle tre middelværdier * 100
If PRC <= 2 Then
MsgBox " Midlet ved gennemsnit af " & Gentagelse * 3 & " Forskel = " & PRC & "%"
End If
Next
End Sub
Avatar billede kabbak Professor
04. september 2006 - 18:29 #3
mere overskueligt

Private Sub CommandButton1_Click()
    Dim Data1 As Variant, Data2 As Variant, Data3 As Variant, RW As Long, Gentagelse As Integer, PRC As Double
    Dim MI1, MI2, Mi3
    Dim Mindste, Største, Gennemsnit
    RW = Cells(65536, ActiveCell.Column).End(xlUp).Row
    For Gentagelse = 2 To RW / 3 'ret =2 til = 3, hvis du vil starte med de 3 første række
        Data1 = Range(Cells(1, ActiveCell.Column), Cells(Gentagelse, ActiveCell.Column))
        Data2 = Range(Cells(Gentagelse + 1, ActiveCell.Column), Cells(Gentagelse + Gentagelse, ActiveCell.Column))
        Data3 = Range(Cells(Gentagelse + Gentagelse + 1, ActiveCell.Column), Cells(Gentagelse + Gentagelse + Gentagelse, ActiveCell.Column))
        MI1 = Application.WorksheetFunction.Average(Data1)
        MI2 = Application.WorksheetFunction.Average(Data2)
        Mi3 = Application.WorksheetFunction.Average(Data3)
        Mindste = Application.WorksheetFunction.Min(MI1, MI2, Mi3)
        Største = Application.WorksheetFunction.Max(MI1, MI2, Mi3)
        Gennemsnit = Application.WorksheetFunction.Average(MI1, MI2, Mi3)
        PRC = ((Største - Mindste) / Gennemsnit) * 100
        '(Største middelværdi - mindste middelværdi)/middelværdien af alle tre middelværdier * 100
        If PRC <= 2 Then
            MsgBox " Midlet ved gennemsnit af " & Gentagelse * 3 & " Forskel = " & PRC & "%"
        End If
    Next
End Sub
Avatar billede gider_ikke_mere Nybegynder
04. september 2006 - 23:32 #4
Havde en lille bug i min:

Private Sub CommandButton1_Click()
Dim Antal, Forsoeg
Antal = 3
Dim rankarray() As Integer
ReDim Preserve rankarray(3)

Columns("B:D").Select
Selection.ClearContents

For Forsoeg = 1 To 500
AVG = 0
For I = 1 To Antal
    AVG = AVG + Range("A" & I).Value
Next
rankarray(1) = AVG / Antal * 1000
Range("B" & Antal).Value = rankarray(1) / 1000

AVG = 0
For I2 = Antal + 1 To Antal * 2
    AVG = AVG + Range("A" & I2).Value
    MIDDEL2 = AVG / Antal
Next
rankarray(2) = MIDDEL2 * 1000
Range("B" & Antal * 2).Value = rankarray(2) / 1000

AVG = 0
For I3 = Antal * 2 + 1 To Antal * 3
    AVG = AVG + Range("A" & I3).Value
    MIDDEL3 = AVG / Antal
Next
rankarray(3) = MIDDEL3 * 1000
Range("B" & Antal * 3).Value = rankarray(3) / 1000

N = UBound(rankarray)
swap = True
Do While swap
  swap = False
  For I = 1 To N - 1
      For j = I To N
        If rankarray(I) > rankarray(j) Then
            Temp = rankarray(I)
            rankarray(I) = rankarray(j)
            rankarray(j) = Temp
            swap = True
        End If
    Next
  Next
Loop
Gnsnit = 0
For Z = 1 To 3
    Gnsnit = Gnsnit + rankarray(Z)
Next
Gnsnit = Gnsnit / 3

RESULT = (rankarray(3) - rankarray(1)) / Gnsnit * 100
Range("C" & Forsoeg).Value = RESULT

If RESULT <= 2 And RESULT >= -2 Then
    Range("D" & Forsoeg).Value = RESULT
    MsgBox "Kom frem til resultatet!"
    Exit Sub
End If
Columns("B:B").Select
Selection.ClearContents
Antal = Antal + 1
ReDim rankarray(3)
Next
End Sub
Avatar billede jens_frederik Nybegynder
05. september 2006 - 14:23 #5
Hej Kabbak

Jeg har brugt din kode - det virker fint.

Jeg har to kommentarer.

Første:
Når jeg har det ønskede resultat - er jeg ikke intereseret i flere målinger - så skal rutinen bare stoppe - eller jeg skal have mulighed for at cancle.

Anden:
Kan der tilføjes et eller andet, så at resultater kommer til at stå i regnearket - fx en ny kollone til højre for den kollone med rådata?
Det der gerne må stå er:
MI1
MI2
MI3
Gennemsnit
PRC
Antal rækker.


Du kan skrive det som et svar, så skal du få dine point.

Mvh

Jens Frederik
Avatar billede gider_ikke_mere Nybegynder
05. september 2006 - 14:30 #6
Det gør min version også - med skrivning i celler.
Avatar billede gider_ikke_mere Nybegynder
05. september 2006 - 14:40 #7
Dog har jeg ikke alt det med du beder om!
Avatar billede kabbak Professor
05. september 2006 - 19:23 #8
Akyhne > nu vil jeg jo ikke tage point fra dig, du har gjort et stort arbejde, med at finde ud af det.
Det jeg prøver, er at vise at man kan bruge de indbyggede funktioner, til ar regne det ud.
Envidere læser jeg ind i variabler, det gør koden hurtigere.

Så hvis nogen skal have point er det akyhne.


Her er en rettet kode

Private Sub CommandButton1_Click()
    Dim Data1 As Variant, Data2 As Variant, Data3 As Variant, RW As Long, Gentagelse As Integer, PRC As Double
    Dim MI1, MI2, MI3, Svar
    Dim Mindste, Største, Gennemsnit
    RW = Cells(65536, ActiveCell.Column).End(xlUp).Row
    Range(Cells(1, ActiveCell.Column), Cells(RW, ActiveCell.Column)).Interior.ColorIndex = xlNone
    For Gentagelse = 3 To RW / 3    'ret =2 til = 3, hvis du vil starte med de 3 første række
        Data1 = Range(Cells(1, ActiveCell.Column), Cells(Gentagelse, ActiveCell.Column))
        Data2 = Range(Cells(Gentagelse + 1, ActiveCell.Column), Cells(Gentagelse + Gentagelse, ActiveCell.Column))
        Data3 = Range(Cells(Gentagelse + Gentagelse + 1, ActiveCell.Column), Cells(Gentagelse + Gentagelse + Gentagelse, ActiveCell.Column))
        MI1 = Application.WorksheetFunction.Average(Data1)
        MI2 = Application.WorksheetFunction.Average(Data2)
        MI3 = Application.WorksheetFunction.Average(Data3)
        Mindste = Application.WorksheetFunction.Min(MI1, MI2, MI3)
        Største = Application.WorksheetFunction.Max(MI1, MI2, MI3)
        Gennemsnit = Application.WorksheetFunction.Average(MI1, MI2, MI3)
        PRC = ((Største - Mindste) / Gennemsnit) * 100
        '(Største middelværdi - mindste middelværdi)/middelværdien af alle tre middelværdier * 100
        If PRC <= 2 Then
            Svar = MsgBox(" Midlet ved gennemsnit af " & Gentagelse * 3 & vbCrLf & _
                        " Forskel = " & PRC & "%" & vbCrLf & _
                          "1. middel = " & MI1 & vbCrLf & _
                          "2. middel = " & MI2 & vbCrLf & _
                          "3. middel = " & MI3 & vbCrLf & _
                          "Gennemsnit = " & Gennemsnit & vbCrLf & _
                          vbCrLf & _
                        " Vil du afslutte Ja / nej", vbYesNo)
            If Svar = vbYes Then
                Range(Cells(1, ActiveCell.Column), Cells(Gentagelse, ActiveCell.Column)).Interior.ColorIndex = 6
                Range(Cells(Gentagelse + 1, ActiveCell.Column), Cells(Gentagelse + Gentagelse, ActiveCell.Column)).Interior.ColorIndex = 7
                Range(Cells(Gentagelse + Gentagelse + 1, ActiveCell.Column), Cells(Gentagelse + Gentagelse + Gentagelse, ActiveCell.Column)).Interior.ColorIndex = 8
                Cells(Gentagelse, ActiveCell.Column).Offset(0, 1) = "MI1 =" & MI1
                Cells(Gentagelse, ActiveCell.Column).Offset(1, 1) = "MI2 =" & MI2
                Cells(Gentagelse, ActiveCell.Column).Offset(2, 1) = "MI3 =" & MI3
                Cells(Gentagelse, ActiveCell.Column).Offset(3, 1) = "PRC =" & PRC
                Cells(Gentagelse, ActiveCell.Column).Offset(4, 1) = "Rækker =" & Gentagelse * 3
                Exit Sub
            End If
        End If
    Next
End Sub
Avatar billede kabbak Professor
05. september 2006 - 19:29 #9
NB husk at lave den tomme kollonne til højre for datakollonnen, inden du kører makroen
Avatar billede gider_ikke_mere Nybegynder
05. september 2006 - 23:55 #10
Det er i hvertfald kotume at give point til alle der kommer med en rigtig løsning. Jeg mener endda det engang har stået i reglerne at første rigtige løsning trækker pointene. Men korriger mig, hvis jeg husker forkert. Jeg har dog absolut ikke noget imod at dele med andre.

kabbak: Ja, jeg kender godt funktionerne max, min, og average, men kunne ikke lige finde metoden til at bruge dem i en formel. Min VBA hjælp i Excel var gået død. Da der ikke var nogen af de skrappe hunde der, efter et par timer havde lagt en løsning, valgte jeg at putte koden herind. Den fungerer jo og regner endda rigtigt *SSS* i andet forsøg (bug'en var i sorteringen i middeludregningen)
Avatar billede jens_frederik Nybegynder
06. september 2006 - 10:17 #11
Kære Akyhne & Kabbak

Tak for jeres hjælp med programmering.
Endnu engang har jeg valgt at bruge Kabbaks kode - det er noget jeg kan gennemskue.

Jeg har en kort karriere i Visual Basic programmering - jeg har et to dages kursus i EXCEL VBA (fra lige før sommerferien) - så når jeg har brug for noget kode der skal udføre en bestemt rutine, bruger jeg www.eksperten.dk til at finde en løsning.

Jeg har set og prøvet koder fra jer begge - men med det Kabbaks kode jeg kan forstå - og selv gå ind og justerer i, hvis der er noget jeg gerne vil have på en anden måde.

Akyhnes kode ser også ud til at virke fint - jeg kan bare ikke forstå det output der kommer ud - og endnu sværre ved at gå ind og læse koden, så jeg kan finde ud af hvad for et output der kommer ud.

Så hvis jeg skal give point til den rigtige løsning som JEG kan bruge - så vil jeg give dem til Kabbak.

Hvad siger I til det?

Mvh

Jens Frederik
Avatar billede gider_ikke_mere Nybegynder
06. september 2006 - 11:02 #12
Hvis ikke folk får point for de korrekte løsninger de laver, spredes det hurtigt, og så gider de heller ikke at hjælpe dig. Jeg lavede løsningen efter det du spurgte, og en del af det du ønskede. Som kabbak lavede jeg det ikke helt færdig i første omgang, da jeg ville afvente og se om du kunne bruge det. Det sker ofte at der kommer flere løsninger efter hinanden. Der plejer man at deles ad, eller første får point. Det er dem der har svaret korrekt der aftaler det indbyrdes.
Hvis forslag man bruger må man selv om, men tænk lige på at jeg har siddet og brugt fritid på at hjælpe dig!

Her er i hvertfald et svar, så bestemmer din samvittighed resten.
Avatar billede jens_frederik Nybegynder
06. september 2006 - 11:25 #13
Fint - Jeg vil dele imellem jer - hvordan gør jeg det?

Spørgsmål til Kabbak
Hvordan kan din kode justeres, så at den starter der hvor markøren står - så at den ikke regner med en evt. overskrift?

Mvh

Jens Frederik
Avatar billede gider_ikke_mere Nybegynder
06. september 2006 - 12:08 #14
Generelt: Ved steder som

Data1 = Range(Cells(1
Data2 = Range(Cells(Gentagelse + 1
Data3 = Range(Cells(Gentagelse + Gentagelse + 1,

skal der stå en variabel i stedet for 1
Du finder værdien ved

MinVar = ActiveCell.Row
Avatar billede gider_ikke_mere Nybegynder
06. september 2006 - 12:12 #15
kabbak skal putte et svar først. Du kan ved de optionbuttons der hedder svar- og kommentar nu se en lille table (firkant) med "akyhne". Der kommer kabbak også til at stå når han har svaret. Du markerer begge (blå), og trykker på en knap tæt ved (kan ikke huske hvad den hedder).
Avatar billede kabbak Professor
06. september 2006 - 12:34 #16
OK prøv at teste denne

Private Sub CommandButton1_Click()
    Dim Data1 As Variant, Data2 As Variant, Data3 As Variant, RW As Long, Gentagelse As Integer, PRC As Double
    Dim MI1, MI2, MI3, Svar, COL As Integer, StartRW As Long
    Dim Mindste, Største, Gennemsnit
    COL = ActiveCell.Column
    StartRW = ActiveCell.Row
    RW = Cells(65536, COL).End(xlUp).Row
    Range(Cells(1, COL), Cells(RW, COL)).Interior.ColorIndex = xlNone
    For Gentagelse = 2 To RW / 3
        Data1 = Range(Cells(StartRW, COL), Cells(Gentagelse + StartRW - 1, COL))
        Data2 = Range(Cells(Gentagelse + StartRW, COL), Cells(Gentagelse + Gentagelse + StartRW - 1, COL))
        Data3 = Range(Cells(Gentagelse + Gentagelse + StartRW, COL), Cells(Gentagelse + Gentagelse + Gentagelse + StartRW - 1, COL))
        MI1 = Application.WorksheetFunction.Average(Data1)
        MI2 = Application.WorksheetFunction.Average(Data2)
        MI3 = Application.WorksheetFunction.Average(Data3)
        Mindste = Application.WorksheetFunction.Min(MI1, MI2, MI3)
        Største = Application.WorksheetFunction.Max(MI1, MI2, MI3)
        Gennemsnit = Application.WorksheetFunction.Average(MI1, MI2, MI3)
        PRC = ((Største - Mindste) / Gennemsnit) * 100
        '(Største middelværdi - mindste middelværdi)/middelværdien af alle tre middelværdier * 100
        If PRC <= 2 Then
            Svar = MsgBox(" Midlet ved gennemsnit af " & Gentagelse * 3 & " rækker" & vbCrLf & _
                        " Forskel = " & PRC & "%" & vbCrLf & _
                          "1. middel = " & MI1 & vbCrLf & _
                          "2. middel = " & MI2 & vbCrLf & _
                          "3. middel = " & MI3 & vbCrLf & _
                          "Gennemsnit = " & Gennemsnit & vbCrLf & _
                          vbCrLf & _
                        " Vil du afslutte Ja / nej", vbYesNo)
            If Svar = vbYes Then
                Range(Cells(StartRW, COL), Cells(StartRW + Gentagelse - 1, COL)).Interior.ColorIndex = 6
                Range(Cells(StartRW + Gentagelse, COL), Cells(Gentagelse + Gentagelse + StartRW - 1, COL)).Interior.ColorIndex = 7
                Range(Cells(StartRW + Gentagelse + Gentagelse, COL), Cells(Gentagelse + Gentagelse + Gentagelse + StartRW - 1, COL)).Interior.ColorIndex = 8
                Cells(StartRW + Gentagelse, COL).Offset(0, 1) = "MI1 =" & MI1
                Cells(StartRW + Gentagelse, COL).Offset(1, 1) = "MI2 =" & MI2
                Cells(StartRW + Gentagelse, COL).Offset(2, 1) = "MI3 =" & MI3
                Cells(StartRW + Gentagelse, COL).Offset(3, 1) = "PRC =" & PRC
                Cells(StartRW + Gentagelse, COL).Offset(4, 1) = "Rækker =" & Gentagelse * 3
                Exit Sub
            End If
        End If
    Next
    MsgBox "Der er ikke flere data"
End Sub
Avatar billede gider_ikke_mere Nybegynder
06. september 2006 - 13:28 #17
Undskyld, så misforstod jeg hvad jens_frederik spurgte om.
Avatar billede jens_frederik Nybegynder
06. september 2006 - 13:57 #18
Tak for hjælpen begge to.
Jeg har fordelt point mellem jer.

I har virkelig sparet mig for meget arbejde med denne kode.

Mvh

Jens Frederik
Avatar billede gider_ikke_mere Nybegynder
06. september 2006 - 14:16 #19
Velbekomme!
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