Avatar billede lunddata Nybegynder
13. januar 2006 - 18:57 Der er 25 kommentarer og
1 løsning

Automatisk fjerne dublerede værdier

Da Excel åbenbart ikke kan køre slumpfunktionen uden tilbagelægning har jeg fået den ide at man via en omvej burde kunne frembringe tilfældige tal med forskellige udfald.
Jeg har kigget lidt på http://www.eksperten.dk/spm/459663
hvor der køres en makro til fjernelse af dubletter.

Hvis jeg får alle slumptal i kolonne c, vil det så være muligt automatisk og uden manuelt at skulle køre en makro på baggrund af kolonne c at frembringe forskellige værdier i næste kolonne d?

Jeg tilføjer lige at jeg ikke er nogen ørn hverken til vba eller makroer.....

Måske kan ovenstående også løses uden makro, men hvordan?

Da jeg meget ønsker en løsning sætter jeg med glæde 200 point på spil.
Avatar billede kabbak Professor
13. januar 2006 - 21:07 #1
hvad ønsker du, en slump funktion, der ikke bruger samme tal 2 gange, ellers forstår jeg ikke spørgsmålet.

Man kan sagtens lave en brugerdefineret funktion, der ikke retunerer tal der er brugt.
Avatar billede lunddata Nybegynder
13. januar 2006 - 23:11 #2
Ja, korrekt.
Se tidligere spørgsmål:
http://www.eksperten.dk/spm/674220
Er der alligevel en løsning?
Avatar billede kabbak Professor
14. januar 2006 - 00:34 #3
Test denne, du skal have udfyldt celle I6 og  G6 (J6 angiver antallet af decimaler)
Den er nem at lave større til flere celler.



Public Sub TilfældigTal()
    Dim A As Long, AntalTal As Long
    Randomize    ' starter randomize generatoren
    Dim Tal() As Variant
    AntalTal = 3    'der er her plads til 3 værdier 0 bruges ikke,
                    'hvis der skal laves flere værdier, rettes 3 tallet
    Mindste = [I6]  'Mindste i celle I6 og
    Storste = [G6]  'Storste i celle G6
    Decimaler = [J6] 'J6 angiver antallet af decimaler
    ReDim Tal(AntalTal)
    A = 0
    Do
        A = A + 1
        Tal(A) = Round((Rnd() * (Storste - Mindste + 1) + Mindste), Decimaler)
        For I = 0 To A - 1
            If Tal(I) = Tal(A) Then A = A - 1    ' hvis tallet er brugt, laves en ny
        Next
    Loop Until A = AntalTal

    'de fundne værdier skrives til cellerne
    [B14] = Tal(1)    'b14, b15, b16 osv.
    [B15] = Tal(2)
    [B16] = Tal(3)

    ' her fortsættes eventuelt med flere celler, men husk at rette 3 tallet, ved AntalTal
End Sub
Avatar billede lunddata Nybegynder
14. januar 2006 - 07:52 #4
Det ser ud til at være den rette løsning når jeg får randomize generatoren med.
Jeg har forsøgt løsnigen men når jeg i b14 skriver = Tal(1) bliver resultatet altid bare tallet 1
Avatar billede lunddata Nybegynder
14. januar 2006 - 08:07 #5
Var lidt hurtig. Generatoren virker når jeg i b14 skriver:
=AFRUND((SLUMP()*(I6-G6)+G6);J6)
men udfaldene i [B14], [B15], [B16] er ikke altid forskellige.
Din programkode er indføjet.
Avatar billede lunddata Nybegynder
14. januar 2006 - 09:40 #6
Men jeg skal vel netop skrive  [B14] = Tal(1)(altså udelukkende bruge din kode) og ikke bruge det jeg skrev 14/01-2006 08:07:11?
Avatar billede kabbak Professor
14. januar 2006 - 10:03 #7
du skal kun bruge koden, jeg kan godt forbedre den, så arrayet tal har 2 kolonner, første som den er nu, og anden med minus tal, og lave tjek på om om 2 tal der er over for hinanden giver >= 0
Avatar billede lunddata Nybegynder
14. januar 2006 - 10:42 #8
Jeg forsøger kun at bruge koden, men jeg kan ikke se at random kører.
Udfaldene:

B14 bliver hvergang 1   
B15 bliver 2   
B16 bliver 3
Avatar billede kabbak Professor
14. januar 2006 - 10:50 #9
Det er jo en makro, den skal køres, den skriver selv i cellerne, henvisningen til cellerne er dem nederst i koden.

Tryk ALT +F8 vælg
TilfældigTal
tryk afspil
Avatar billede lunddata Nybegynder
14. januar 2006 - 10:57 #10
AHA!!!
Så var den der. Genialt!!!
Som jeg indledningsvist skrev har jeg ikke ret meget begreb om makroer.
Kan makroen aktiveres uden at skulle trykke på ALT +F8, vælge
TilfældigTal og trykke afspil.
Avatar billede kabbak Professor
14. januar 2006 - 10:58 #11
man kan lave en knap på arket til det
Avatar billede lunddata Nybegynder
14. januar 2006 - 10:58 #12
Jeg tænker på at i lighed med at slumpfunktionen kører ved blot et tryk på F9
Avatar billede lunddata Nybegynder
14. januar 2006 - 11:02 #13
Lidt ud over det egentlige spm. ... har du henvisninger til hvordan man kan gøre dette? Jeg har ikke tidligere arbejdet med knapper.
Avatar billede kabbak Professor
14. januar 2006 - 11:02 #14
Man kan lave en genvej via CTRL+ en  tast
Tryk ALT +F8 vælg
TilfældigTal
Tryk Indstillinger

sæt så et bogstav på der f.eks. t

så kører makroen når du trykker CTRL+t
Avatar billede lunddata Nybegynder
14. januar 2006 - 11:12 #15
Flot!
Du tilbød noget 14/01-2006 10:03:54.
Står dette stadig ved magt?
Avatar billede kabbak Professor
14. januar 2006 - 11:16 #16
Avatar billede kabbak Professor
14. januar 2006 - 11:18 #17
Det betyder at den laver både minus og plus tal, inden for området mindste og største, så de skal altid være posigtive tal.
Avatar billede kabbak Professor
14. januar 2006 - 11:19 #18
jeg smider lige koden også

Public Sub TilfældigTal()
    Dim A As Long, AntalTal As Long, X As Long
    Randomize    ' starter randomize generatoren
    Dim Tal() As Variant
    AntalTal = 3    'der er her plads til 3 værdier 0 bruges ikke,
    'hvis der skal laves flere værdier, rettes 3 tallet
    Mindste = [I6]  'Mindste i celle I6 og
    Storste = [G6]  'Storste i celle G6
    Decimaler = [J6]    'J6 angiver antallet af decimaler
    ReDim Tal(AntalTal, 1)
   
    For X = 0 To 1 ' to kolonner posigtive tal i første (0) og negative i den anden(1)
        A = 0
        Do
            A = A + 1
            Tal(A, X) = Round((Rnd() * (Storste - Mindste + 1) + Mindste), Decimaler)
            If X = 1 Then Tal(A, X) = Tal(A, X) * -1
            For I = 0 To A - 1
                If Tal(I, X) = Tal(A, X) Then A = A - 1  ' hvis tallet er brugt, laves en ny
            Next
            If Tal(I, 0) + Tal(I, 1) < 0 Then A = A - 1 'Tjekker om resultatet er nindre end 0, hvis sand laves en ny
        Loop Until A = AntalTal
    Next
    'de fundne værdier skrives til cellerne
    [B14] = Tal(1, 0): [C14] = Tal(1, 1) 'b14, b15, b16 osv.
    [B15] = Tal(2, 0): [C15] = Tal(2, 1)
    [B16] = Tal(3, 0): [C16] = Tal(3, 1)

    ' her fortsættes eventuelt med flere celler, men husk at rette 3 tallet, ved AntalTal
End Sub
Avatar billede lunddata Nybegynder
14. januar 2006 - 11:24 #19
Herligt!
Det var lige hvad jeg havde brug for?
Er det rigtigt, at hvis jeg i intervallet sætter største og mindste til at være samme værdi at så vil regnearket låse sig fast og køre i løkke?
Avatar billede kabbak Professor
14. januar 2006 - 11:25 #20
Ja, så kan den jo ikke finde 3 forskellige, der skal være plads til det antal forskellige den skal finde.
Avatar billede kabbak Professor
14. januar 2006 - 11:36 #21
Jeg har rettet i koden, og i demo arket var der byttet om på cellerne med største og mindste

du kan downloade det igen

Public Sub TilfældigTal()
    Dim A As Long, AntalTal As Long, X As Long
    Randomize    ' starter randomize generatoren
    Dim Tal() As Variant
    AntalTal = 3    'der er her plads til 3 værdier 0 bruges ikke,
    'hvis der skal laves flere værdier, rettes 3 tallet
    Mindste = [I6]  'Mindste i celle I6 og
    Storste = [G6]  'Storste i celle G6
    If (Mindste = Storste) Or (Mindste > Storste) Then
        MsgBox "Mindste og største må ikke have samme værdi og" & vbCrLf & "Største skal altid være større end mindste"
    End If
    Decimaler = [J6]    'J6 angiver antallet af decimaler
    ReDim Tal(AntalTal, 1)

    For X = 0 To 1    ' to kolonner posigtive tal i første (0) og negative i den anden(1)
        A = 0
        Do
            A = A + 1
            Tal(A, X) = Round((Rnd() * (Storste - Mindste + 1) + Mindste), Decimaler)
            If X = 1 Then Tal(A, X) = Tal(A, X) * -1
            For I = 0 To A - 1
                If Tal(I, X) = Tal(A, X) Then A = A - 1  ' hvis tallet er brugt, laves en ny
            Next
            If Tal(I, 0) + Tal(I, 1) < 0 Then A = A - 1    'Tjekker om resultatet er mindre end 0, hvis sand laves en ny
        Loop Until A = AntalTal
    Next
    'de fundne værdier skrives til cellerne
    [B14] = Tal(1, 0): [C14] = Tal(1, 1)    'b14, b15, b16 osv.
    [B15] = Tal(2, 0): [C15] = Tal(2, 1)
    [B16] = Tal(3, 0): [C16] = Tal(3, 1)

    ' her fortsættes eventuelt med flere celler, men husk at rette 3 tallet, ved AntalTal
End Sub
Avatar billede lunddata Nybegynder
14. januar 2006 - 11:39 #22
jeg havde set ombytningen.
..med hensyn til at køre i løkke:
... det er selvfølgelig logisk nok, men jeg tænker bare på den evt. stakkels kollega som måske ikke lige har hovedet med og gerne vil generere opgaver..
Avatar billede lunddata Nybegynder
14. januar 2006 - 11:49 #23
Ok jeg har set at der kommer fejlmeddelelse når mindste og største værdi er den samme.
Det var lige løsningen eller løsningerne jeg længe havde eftersøgt.
Vil du lægge et svar så du kan få dine meget vefortjente point?
Avatar billede kabbak Professor
14. januar 2006 - 12:09 #24
et svar ;-))
Avatar billede kabbak Professor
14. januar 2006 - 12:13 #25
tak for point ;-))
Avatar billede lunddata Nybegynder
14. januar 2006 - 12:14 #26
Koden er bare rigtig god. Jeg kan bruge den til at generere mange typer opgaver.
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