Excel 2010 Losowanie bez powtórzeń


(adamo000) #1

Witam,

Czy jest możliwość wprowadzeniu w Excelu formuły losowania liczb z przedziały w ten sposób aby wartość powtórzyła się maksymalnie 2x?

Pozdrawiam


(Tomek Matz) #2

Formuły, która to umożliwi, nie ma. Musiałbyś napisać makro.


(adamo000) #3

Mógłbyś opisać jak to zrobić aby ów wartości powtarzały sie maksymalnie 2x?

Nie robiłem jeszcze makr w Office.


(Tomek Matz) #4

Testowane przy użyciu Excel 2007 !

  1. Włącz kartę Deweloper: Kółko w lewym górnym rogu -> Opcje programu Excel -> Popularne -> Pokaż kartę Deweloper na wstążce

  2. Wklej kod makra: Karta Deweloper -> Visual Basic (w sekcji Kod) -> Menu Insert -> Module ->

    Private Type RandomNumber

    Number As Integer
    
    OccurrenceCount As Integer

    End Type

    Public Function LosNumbers(min As Integer, max As Integer, resultCount As Integer, Optional allowedOccurrenceCount As Integer = 1, Optional resultHorizontal As Boolean = True) As Variant

    Dim result() As Variant

    Dim elementsCount As Integer

    Dim temp, maxRows, maxColumns As Integer

    Dim randomNumbers() As RandomNumber

    If resultHorizontal Then

    maxRows = 1
    
    maxColumns = resultCount
    
    
    ReDim result(1 To 1, 1 To resultCount)

    Else

    maxRows = resultCount
    
    maxColumns = 1
    
    
    ReDim result(1 To resultCount, 1 To 1)

    End If

    elementsCount = max - min + 1

    ReDim randomNumbers(1 To elementsCount)

    temp = min

    randomNumbers(1).Number = temp

    For i = 2 To elementsCount

    temp = temp + 1
    
    randomNumbers(i).Number = temp

    Next i

    For i = 1 To maxRows

    For j = 1 To maxColumns
    
        result(i, j) = LosNumbersHelper(randomNumbers, elementsCount, allowedOccurrenceCount)
    
    Next j

    Next i

    LosNumbers = result

    End Function

    Private Function LosNumbersHelper(ByRef randomNumbers() As RandomNumber, ByRef elementsCount As Integer, allowedOccurrenceCount As Integer) As Integer

    Dim randomIndex As Integer

    randomIndex = Int(elementsCount * Rnd + 1) ' http://www.techonthenet.com/excel/formulas/rnd.php

    If randomNumbers(randomIndex).OccurrenceCount < allowedOccurrenceCount Then

    randomNumbers(randomIndex).OccurrenceCount = randomNumbers(randomIndex).OccurrenceCount + 1
    
    LosNumbersHelper = randomNumbers(randomIndex).Number

    Else

    LosNumbersHelper = LosNumbersHelper(randomNumbers, elementsCount, allowedOccurrenceCount)

    End If

    End Function

-> Zamknij okno Microsoft Visual Basic

  1. Enjoy!

Nagłówek funkcji wygląda następująco:

LosNumbers(min As Integer, max As Integer, resultCount As Integer, Optional allowedOccurrenceCount As Integer = 1, Optional resultHorizontal As Boolean = True) As Variant

min -> dolna wartość przedziału, z którego mają być losowane liczby

max -> górna wartość przedziału, z którego mają być losowane liczby

resultCount -> ile liczb ma zostać wylosowane

allowedOccurrenceCount -> parametr opcjonalny; domyślna wartość to 1; mówi o tym jaka jest maksymalna dopuszczalna ilość powtórzeń danej liczby

resultHorizontal -> parametr opcjonalny; domyślna wartość to True; jeśli True to wyniki będą wyświetlone w poziomie (wszystkie w jednym wierszu), a jeśli False to wyniki będą wyświetlone w pionie (wszystkie w jednej kolumnie)

Przykładowe użycie funkcji:

=LosNumbers(1;49;6)

Losuje 6 liczb z przedziału od 1 do 49. Dana liczba może być wylosowana tylko jeden raz. Wyniki wyświetlone będą w poziomie.

=LosNumbers(-3;75;5;2)

Losuje 5 liczb z przedziału od -3 do 75. Dana liczba może być wylosowana maksymalnie 2 razy. Wyniki będą w poziomie.

Przykładowy arkusz (plik RandomNumbers.xlsm):

https://skydrive.live.com/?cid=B4BBB812D47442DE&id=B4BBB812D47442DE!130

PS Możesz zmienić tytuł tematu na Excel 2010 Losowanie bez powtórzeń?


(adamo000) #5

Dzięki wielkie!! Właśnie o to mi chodziło. Niesamowity jesteś!