Excel - lowowe wybieranie liczb

Witam

mam problem i szukam odpowiedzi.

Użyłem funkcji Los i wszystko jest ok, ale za każdą zmianą czegokolwiek ponownie następuje losowanie, czy da się to jakoś ograniczyć ? że wartości będą się ponownie losować po jakimś działaniu ?

A inaczej jak to się da zrobić ? Próbowałem ustawić “analizę danych” przy pomocy wtyczki Analysis Toolpak i tam wybrałem opcje Generowanie liczby pseudolosowych, ale nie mam pojęcia co dalej, który rodzaj losowania wybrać itd. chciałbym tak to ustawić aby losował mi liczbę z przedziału 0 do 1, lub wyraz “tak” lub “nie” bo tego w sumie potrzebuje. Ja zrobilem to tak, że liczba wylosowana poniżej 0,5 to było “tak” a powyżej to “nie”. Cały problem w tym, że gdy cokolwiek zmienię w arkuszu od razu losuję mi nowe liczby.

rozwiązaniem byłoby napisanie makra, ale nie jestem w stanie Ci w tym pomóc.

Proste makro mogłoby wyglądać np. tak:

Sub Losowanie()

    Range("I11").Select ' wybranie konkretnej komórki, w której ma znaleźć się wylosowana liczba

    ActiveCell.FormulaR1C1 = Rnd() ' formuła losowania zwracająca do komórki czystą liczbę

End Sub

przy okazji, wersja bardziej ogólna zwracająca liczby całkowite:

Sub LosowanieCalk()

    a = -5 ' dolna granica przedziału losowania (wlącznie)

    b = 10 ' górna granica

    Range("I11").Select

    ActiveCell.FormulaR1C1 = Round(Rnd() * (b - a) + a, 0) ' Round zaokrągla tu do 0 liczb po przecinku (można to zmienić)

End Sub

możesz to w łatwy sposób rozwiązać poprzez skopiowanie zakresu losowanej liczby, potem wklejasz ją specjalnie jako wartości…

a jak chcesz zautomatyzować kopiowanie samych wartości to rejestrujesz proste makro z wklejaniem wartości

Tak jeszcze się pobawiłem i inną opcją jest:

Sub LosowanieTN()

    Range("C11").Select ' wybranie konkretnej komórki, w której ma znaleźć się wylosowana liczba

    i = Rnd()

If i < 0.5 Then ' Jeśli wylosowana liczba poniżej 0,5, to dostajesz w wynikowej komórce NIE

    ActiveCell.FormulaR1C1 = "NIE"

Else

    ActiveCell.FormulaR1C1 = "TAK" ' Jeśli większa lub równa 0,5, to dostajesz TAK

 End If

End Sub

Makro można łatwo przypisać do wykonywania przy kliknięciu na jakiś obiekt w arkuszu.

a jak chce aby więcej niż jedna komórka była w ten sposób losowana ? da się to załatwić za pomocą jednego makra ?

Zależy, czy mają to być konkretne komórki ustawione na sztywno, czy jakiś większy zakres.

Możesz po prostu usunąć z tamtego:

Range("A2").Select

i będzie Ci losowało do aktualnie zaznaczonej komórki. Dla kilku konkretnych komórek możesz zaś powtórzyć losowania:

Sub LosowanieTN()

Range("A2").Select ' wybranie konkretnej komórki, w której ma znaleźć się wylosowane TAK/NIE

Randomize 'resetowanie generatora liczb pseudolosowych

i = Rnd()

If i < 0.5 Then ' Jeśli wylosowana liczba poniżej 0,5, to dostajesz w wynikowej komórce NIE

    ActiveCell.FormulaR1C1 = "NIE"

Else

    ActiveCell.FormulaR1C1 = "TAK" ' Jeśli większa lub równa 0,5, to dostajesz TAK

End If


Range("B5").Select ' wybranie konkretnej komórki, w której ma znaleźć się wylosowana liczba

Randomize 'resetowanie generatora liczb pseudolosowych

i = Rnd()

If i < 0.5 Then ' Jeśli wylosowana liczba poniżej 0,5, to dostajesz w wynikowej komórce NIE

    ActiveCell.FormulaR1C1 = "NIE"

Else

    ActiveCell.FormulaR1C1 = "TAK" ' Jeśli większa lub równa 0,5, to dostajesz TAK

End If


........ (i tak dalej) .........


End Sub

Jeśli ma być jakiś zakres, to można np. tak:

Sub LosowanieTN2()

Range("A2:B5").Select ' wybranie konkretnego zakresu do zapełnienia

' Można też usunąć powyższe i ręcznie zaznaczać zakres przed odpaleniem makra


For Each kom In Selection

    kom.Value = losuj()

Next kom

End Sub


Function losuj()

Randomize 'resetowanie generatora liczb pseudolosowych

i = Rnd()

If i < 0.5 Then ' Jeśli wylosowana liczba poniżej 0,5, to dostajesz w wynikowej komórce NIE

    losuj = "NIE"

Else

    losuj = "TAK" ' Jeśli większa lub równa 0,5, to dostajesz TAK

End If

End Function

Są jeszcze też opcje automatycznego zaznaczania np. co drugiej komórki itp., ale na razie się powstrzymam :wink:

dzięki wielkie :wink: