Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel - próba losowa. Jak to zrobić?

24 Mar 2009 20:50 8520 7
  • Poziom 2  
    Witajcie,

    Mam problem. W bazie danych (arkusz excelowski) mam ponad 10.000 uczestnikow. Musze z nich wylosowac 500. Jak to zrobic? Wiem, ze moge uzyc funkcji
    =LOS()*100
    lub
    =LOS()*(b-a)+a
    ale to nie rozwiazuje problemu, bo te funkcie daja mi JEDNEGO uczestnika, a ja mam wylosowac 500 uczestnikow...
    Jak zrobic, aby wszystkich na raz wylosowac?

    Z gory wielkie dzieki za pomoc.
  • Poziom 1  
    Helo!

    Rozumiem, że chcesz wylosować 500 liczb całkowitych bez powtórzeń z puli 10 000?

    Można to łatwo zrobić skryptem w VBA.
    Robisz tak:
    1. W Excelu klikasz menu Widok/Paski narzędzi i zaznaczasz Visual Basic
    2. Na pasku, który się pojawi klikasz Edytor Visual Basic
    3. W edytorze VB dwa razy klikasz na arkusz, w którym chciałbyś, żeby były wyniki; niech będzie Arkusz2
    4. W pustym polu z prawej strony wklejasz poniższy kod:

    Code:

    Sub RandomNumber()
    Dim i As Integer, ii As Integer
    Range("A1:A500").Clear
    Randomize ' Initialize random-number generator.

    For i = 1 To 500
    Cells(i, 1) = Int((10000 * Rnd) + 1)
    Do Until WorksheetFunction.CountIf _
    (Range("A1:A500"), Cells(i, 1)) = 1
    Cells(i, 1) = Int((10000 * Rnd) + 1)
    Loop
    Next i

    End Sub


    5. Odpalasz toto klikając przycisk Run Sub/User Form (niebieski trójkąt)
    6. W Arkuszu2 w kalumnie A powinno być 500 losowych liczb - reszta mam nadzieję, że nie sprawi problemu?

    Oczywiście zamiast 10000 wpisz dokładną ilość uczestników

    Oryginalny skrypt wytrzasnąłem stąd:
    www.mrexcel.com/archive/Formulas/9254.html
  • Poziom 40  
    Skopiuj tę funkcję (los() ) w dół do 500 komórek.
    Następnie wciskając klawisz F9 będziesz miał nowe losy w tych 500 komórkach.

    Możesz później po przez funkcję indeks powiązać nazwisko uczestnika z wylosowaną wartością Przy czym wtedy funkcję los () należało by zaokrąglić np do 4 miejsc po przecinku a potem pomnożyć przez 10.000

    Z tym że każde obliczenie dodatkowe na tym arkuszu zmieni wylosowane liczby.

    Chyba że to "zamknąć" w makro.

    Dodano po 18 [minuty]:

    :arrow: Kolego 1257 czy możesz wytłumaczyć co zabezpiecza ta warunkowa pętla? Że jeżeli wynikiem losowania jest 1 to powtórz losowanie?

    1257 napisał:

    Code:

    Do Until WorksheetFunction.CountIf (Range("A1:A500"), Cells(i, 1)) = 1
    Cells(i, 1) = Int((10000 * Rnd) + 1)
    Loop



    Ja bym to wyrzucił, bo na samej pętli For tak jak podałeś będzie to działać (trochę ją uporządkowałem):

    Code:
    Sub Losuj() 
    
    Dim i As Integer

    For i = 1 To 500
    Cells(i, 1) = Int((10000 * Rnd) + 1)
    Next i

    End Sub

    Dodawanie 1 na końcu zabezpiecza to by mogło się pojawić w losowaniu liczba 10.000

    Osobiście umieścił bym takie makro w module, zrobił przycisk i powiązał go z makrem Losuj.
    Wyniki będą w kolumnie pierwszej jeżeli mają być w drugiej trzeba zmienić 1 na 2 [Cells(i,1)... na cells(i,2)...] itd
  • Moderator Programowanie
    Tak się wtrącę...
    Ta pętla powoduje to, że nie ma powtórzeń wylosowanych liczb. Najlepiej wypróbować obie wersje i po otrzymaniu wyników wybrać Dane>Usuń duplikaty. Duplikaty pojawią się także przy kopiowaniu funkcji LOS().
    Tyle ode mnie :)
  • Poziom 40  
    A rzeczywiście - o duplikatach nie pomyślałem.

    Więc już poprawiam (na marginesie bez Randomize też działa)

    Code:
    Sub Losuj() 
    
    Dim i As Integer

    For i = 1 To 500
    Cells(i, 1) = Int((10000 * Rnd) + 1)
    Do Until WorksheetFunction.CountIf (Range("A1:A500"), Cells(i, 1)) = 1
    Cells(i, 1) = Int((10000 * Rnd) + 1)
    Loop
    Next i
    End Sub
  • Moderator Programowanie
    Tak się jeszcze raz wtrącę :)
    Randomize włącza generator liczb losowych VB. Wszystko będzie OK dopóki to makro działa w Excelu (nawet deklaracja zmiennej i nie jest tu konieczna)
  • Poziom 40  
    :) Dzięki za wyjaśnienia - i ja coś przy okazji skorzystałem. :)
  • Poziom 2  
    Dzieki wielke :D
    Zaraz bede probowala Waszych sztuczek :D

    Jeszcze raz stokrotne dzieki!!!