19. januar 2007 - 11:03Der er
60 kommentarer og 1 løsning
Generering af tilfældige tal ud fra en kendt stikprøve
Hvilken funktion skal jeg bruge, hvis jeg ønsker at udtrække tilfældige tal fra en kendt stikprøve? Jeg har forsøgt med funktionen ”Randbetween” og ”slump”, men disse kan kun bruges når man ønsker tilfældige tal mellem et interval. Jeg har også brugt den funktion der hedder ”stikprøve” i dataanalyse. Men det er ikke denne funktion jeg er ude efter. Jeg er ude efter en funktion der kan skrives og kopiers direkte i regnearket.
Så vidt jeg ved kan det ikke gøres fra en funktion i regnearket. Du skal om i VBA (Visual Basic for Applications), hvor opgaven kan løses rimelig nemt.
Lav en kommandoknap fra værktøjslinjen "kontrolelementer". højreklik på knappen, og vælg vis "programkode". slet det der vises, og sæt følgende ind.
Private Sub CommandButton1_Click() Randomize Dim myRange As Range Dim rTal As Integer Dim LuckyNumber As Integer Dim LuckyMan As String Sheets(1).Cells(1, 1).Select Set myRange = Selection.CurrentRegion rTal = myRange.Rows.Count LuckyNumber = Int((rTal - 1) * Rnd + 2) LuckyMan = Cells(LuckyNumber, 1) MsgBox "Vinderen af lodtrækningen er " & LuckyMan & "!", , "UDTRÆKNING" End Sub
Luk Visual Basic Editor for at komme tilbage til Excel. i værktøjslinjen kontrolelementer, klik på den lille trekant og lineal (øverst knap til venstre) for at komme ude af designmode. Luk værktøjslinjen kontrolelementer.
Klik på kommandoknappen. En tilfældig værdi fra din liste dukker op i en MessageBox!
Der skal lige tilføjes, at for ovenstående kan virke må dine værdier stå i kolonne A, med den første værdi i A1. Der må ikke være tomme rækker inden for din værdi liste.
Tak for dit svar. Problemet er bare at jeg skal udføre denne opgave mange gange hvis jeg skal gøre det efter den metode du anbefaler. Det jeg har behov for er at udføre Bootstrapping i Excel. Det betyder at jeg skal tage en værdi fra en stikprøve rigtig mange gange. Vi snakker for eksempel 10 000 gange. Jeg ved det kan lade sig gøre i den Engelske version af Excel ved hjælp af den formel der hedder ”Rand” hvor man så kan bare kan kopier formlen ned af i regnearket, alt efter hvor mange værdier du har brug for.
Ja desværre, jeg kan ikke få den formel på engelsk til at virke. Problemet er hvilken dansk formel der svare til ”rand”. Det er en lidt underlig problemstilling. Der må have været andre end mig der har siddet med samme problem.
Man kan jo også lave koden om, så det dumper værdierne på en ny ark, eller i en anden kolonne. Så kunne det spørg først hvor mange gange at det skal udfør proceduren (fx 10 000) i en formular, så det kunne tage høde for udskiftning af stikprøvemængde osv. Se her:
Private Sub CommandButton1_Click() Dim myInt as Integer myInt=InputBox("Hvor mange stikprøver skal du tage?", "Hvor mange?", 1) Dim counter as integer Do until counter = myInt + 1 Randomize Dim myRange As Range Dim rTal As Integer Dim LuckyNumber As Integer Dim LuckyMan As String Sheets(1).Cells(1, 1).Select Set myRange = Selection.CurrentRegion rTal = myRange.Rows.Count LuckyNumber = Int((rTal - 1) * Rnd + 2) LuckyMan = Cells(LuckyNumber, 1) Cells(Counter, 5) = LuckyMan Next End Sub
Det læser alle værdierne ind i kolonne E af den aktiv ark. Koden kan skrives om til at sætte det hvor du vil.
Forresten, når du "svarer" mig, skal du ikke klikke på radio button "Svar", men "Kommentar". "Svar" er beregnet til dem som tror at de har det rigtig svar på dit oprindelig spørgsmål!
Nu har jeg startet en dansk Excel op. SLUMP() er faktisk det sammen som RAND(). Du vil ikke kunne lave en formular som dumper dine værdier i en kolonne på denne måde, tror jeg. Jeg har forsøgt før, men blev træt af de evige fejl beskeder, og lavet det i VBA.
Undskyld, jeg har lavet en fejl i ovenstående kode, da jeg skrev den om. Det skulle være:
Private Sub CommandButton1_Click() Dim myInt as Integer myInt=InputBox("Hvor mange stikprøver skal du tage?", "Hvor mange?", 1) Dim counter as integer For counter = 1 to myInt Randomize Dim myRange As Range Dim rTal As Integer Dim LuckyNumber As Integer Dim LuckyMan As String Sheets(1).Cells(1, 1).Select Set myRange = Selection.CurrentRegion rTal = myRange.Rows.Count LuckyNumber = Int((rTal - 1) * Rnd + 2) LuckyMan = Cells(LuckyNumber, 1) Cells(Counter, 5) = LuckyMan Next End Sub
Hej Adian Nu kan jeg få den første kode til at virke men ikke den anden. Hvordan kan jeg få data arrangeret så de ikke kun står i en kolonne, men for eksempel i rækkefølge i 5 kolonner? du skal nok få flere point. :-)
Nu virker den sidste kode også. Smukt.:-) Men jeg skulle gerne have data arrangeret så de ikke kun figurer i en kolonne, da det gør det videre arbejde meget besværligt. Skal jeg bare taste accepter for at du får dine point?
Point er ikke alt! Det er sjovt at hjælpe med at løse et problem!
Hvordan har du fået det første kode til at virke? Der er en grundlæggende fejl i det! DET ER VIGTIGT AT KODEN VIRKER EFTER MENING, ELLERS KAN DU ENDE MED FEJLAGTIG DATA! Sæt lige en kopi af koden, så jeg kan sikre mig at det ikke er fejlbelagt.
Hvordan vil du have din data til at stå? Hvilken kolonner vil du bruge, og hvilken række vil du start i? Skal du bruge en nye ark til det, eller skal det stå på samme ark? Det er hurtigt nok at skrive koden om til at tage højde for det.
Jeg bruger kun den sidste kode du sendte til mig nu, så det problem skulle være løst nu. Jeg vil gerne have data således at de første 10 data eksempelvis går fra A1 til A10 og de næste går fra B1 til B10. osv… der ned af. Grunden til dette er at jeg eksempelvis skal bruge gennemsnittet af de 10 første værdier og så af de næste 10 værdier osv…
Du skal være opmærksom på en ting: når en stikprøve vælges med det kode her, bliver det ikke fjernet fra listen. Der er risiko/chance for at det bliver valgt mere end een gang. Er det mening, eller skal den valgte stikprøve fjernes fra listen efter det er valgt?
Det at dataene kan vælges mere end en gang er lige præcist det der skal ske når man laver bootstrapping. Så det er helt perfekt det som din ”lille” kode laver. Men jeg vil gerne have data præsenteret anderledes. Eksempelvis som jeg skrev i den sidste kommentar. Endvidere, hvad nu hvis mine data ligger anderledes i regnearket for eksempel hvis de ligger A1:O10. og jeg så vil bruge den kode du har sendt til mig?
Jeg har løst vores lille problem på en anden måde. Jeg har defineret en række tal som sample og har derefter lavet følgende formel=INDEKS(sample;RÆKKER(sample)*SLUMP()+1;KOLONNER(sample)*SLUMP()+1)så virker det sgu. Men jeg er meget Interesseret i at se den kode du arbejder med. Det kan jo også bruges til andre ting
Det smarte ved din kode er jo også at man bare kan skrive hvor mange udtræk man vil have, hvor den formel jeg lige har lavet skal trækkes ned af i regnearket, hviklet godt kan være krævende
Det tilføjer en ark foran den hvor du har dine prøver, og sætter det hele op i de første fem kolonner som du ønsker. OBS! Du skal have functionen med, ellers virker den ikke.
Private Sub CommandButton1_Click() Dim myInt As Integer Dim myRange As Range Dim rTal As Integer Dim cTal As Integer Dim LuckyNumber As Integer Dim aLuckyNumber As Integer Dim LuckyMan As String Dim Counter As Integer Dim OutputRow As Integer Dim OutputCol As Integer Dim SpecSheet As Worksheet Dim OutputSheet As Worksheet
Set SpecSheet = ActiveSheet
myInt = InputBox("Hvor mange stikprøver skal du tage?", "Hvor mange?", 1)
ThisWorkbook.Sheets.Add Set OutputSheet = ActiveSheet
Hej Marc Har fundet problemet. Prøv at klikke på en af de tal som du har, som har mange decimaler. Så kig op i formellinjen, så vil du se at dit nummer har i virkelighed mange flere decimaler end dem vist i arken. Er de brøkdel der er regnet om til decimaler?
Mit program fungerer perfekt, men vi skal have en måde hvor vi kan begrænse antal af decimaler. Hvor mange skal du bruge. Eller skal det være nøjagtigt som vist i arken - så må vi finde ude af hvorfor det vises som det vises, og angive den samme form for formatering i den nye ark.
Det kunne rettes op i programmet, så jeg tager de nøjagtige værdier som de står i arken. Her er den nye kode. Der er kun ændret et ord, men det gør det hel så det virker. (jeg var forresten ikke klar over, at du havde tom celler, eller minus tal) Dette program virker ikke hvis du har en tom celle i celle A1 på stikprøve arken.
Private Sub CommandButton1_Click() Dim myInt As Integer Dim myRange As Range Dim rTal As Integer Dim cTal As Integer Dim LuckyNumber As Integer Dim aLuckyNumber As Integer Dim LuckyMan As String Dim Counter As Integer Dim OutputRow As Integer Dim OutputCol As Integer Dim SpecSheet As Worksheet Dim OutputSheet As Worksheet
Set SpecSheet = ActiveSheet
myInt = InputBox("Hvor mange stikprøver skal du tage?", "Hvor mange?", 1)
ThisWorkbook.Sheets.Add Set OutputSheet = ActiveSheet
Hej aidan. Jeg tror ikke helt jeg forstår hvad du siger. Det jeg mener er at imellem de tal dit program vælger ud på baggrund af stikprøven er der nogle rigtige store tal imellem. eksempelvis 760.952.380.952.365 dette tal er ikke i stikprøven.
Jeg har prøvet at tage 600 prøver med den nye kode, og det virker fint. Jeg tror at grunden til at det er gået galt er fordi Excel er en amerikansk program, hvor et punktum bruges for at betegne decimaler, i stedet for en komma, og omvendt for at bryde et langt tal op, så det gøres mere forståeligt. Jeg tror at det forvirre Excel når der er mere end een punktum i et tal. Jeg har tidligere haft (og har endnu) problemer med datoer af og til, hvor programmet vil helst forstå en dato som mm-dd-åå, i stedet for dd-mm-åå, og det kan give hovedbrud for at tæmme det!
Prøv den nye kode af. Det virker på min maskine, og den kører en engelsk Excel - dog med dansk tegnsætning. Vi snakkes i morgen. :-)
Jeg må have været lidt træt i går, da jeg ikke så, at Excel laver også om på numrene med det sidste stykke kode. Nu har jeg lavet noget kode, hvor numrene bliver ikke direkte sat ind i det nye ark, men henviser til en celle fra det oprindelig ark. Du kan stadigvæk lave beregninger med dem, og fordi der laves en henvisning til de oprindelig celler, så er der ingen risiko for at de laves om.
Private Sub CommandButton1_Click() Dim myInt As Integer Dim myRange As Range Dim rTal As Integer Dim cTal As Integer Dim LuckyNumber As Integer Dim aLuckyNumber As Integer 'Dim LuckyMan As String Dim Counter As Integer Dim OutputRow As Integer Dim OutputCol As Integer Dim SpecSheet As Worksheet Dim OutputSheet As Worksheet
Set SpecSheet = ActiveSheet
myInt = InputBox("Hvor mange stikprøver skal du tage?", "Hvor mange?", 1)
ThisWorkbook.Sheets.Add Set OutputSheet = ActiveSheet
Der ser ud til at virke fint(flot :-)). Problemet er bare at jeg i et par af cellerne har en lille grøn trekant i Øverst venstre hjørne. Jeg har af erfaring haft problemer med at behandle data når der den lille trekant er oppe i venstre hjørne. Ved du hvorfor den er kommet? Når jeg trykker på trekanten, siger den at der en modstridende formel. Det skal lige sige at din kode virker fint og at tallene kommer fint frem. Jeg har bare prøvet at der er problemer med at behandle data når den lille grønne trekant er i cellens venstre hjørne
Der står bare hvor den har tallet fra. Altså henvises der til hvilken celle i ark 1 hvor netop det tal står. Der er kun i nogle af cellerne at der er en grøn trekant. Koden gør jo faktisk det den skal, for jeg får jo de tal jeg skal bruge. Problemet er bare efterbehandling af disse tal. Der kan godt opstå nogle problemer når der er en grøn trekant i hjørnet.Hvis jeg klikker på det gule ikon der kommer frem, når jeg fører markøren hen til den celle hvor der eksempelvis er en grøn trekant, siger den at der er en modstridende formel?
Jeg prøver at viderbehandle tallene. Men opgaven ser jo ud til at være løst. Jeg takker rigtig mange gange for din hjælp. Den har være perfekt. Håber jeg kan hjælpe dig engang i fremtiden. Håber du får en god weekend.
Lige en lille rettelse, som muligvis ikke har noget indflydelse nu, men kunne have en indflydelse hvis du skulle bruge ovenstående kode i en anden sammenhæng. Den lille funktion skal se sådan her ud. Så er det helt skudsikkert!
Function RndUp(ByVal myNumber As Double) RndUp = Application.WorksheetFunction.RoundUp(myNumber, 0) End Function
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.