Excel 2010 Losowanie bez powtórzeń

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

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

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

Nie robiłem jeszcze makr w Office.

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ń?

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