13. januar 2006 - 18:57Der 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.
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
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
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.
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
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.
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
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?
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
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..
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?
Koden er bare rigtig god. Jeg kan bruge den til at generere mange typer opgaver. GOD WEEKEND!
Synes godt om
Ny brugerNybegynder
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.