Vba excel случайное число в диапазоне от

Генератор случайных чисел в VBA Excel. Функция Rnd, оператор Randomize, функция рабочего листа RandBetween. Синтаксис, параметры, примеры кода.

Rnd – это функция, которая возвращает значение типа Single, содержащее псевдослучайное число меньшее 1, но большее или равное нулю.

Псевдослучайное число отличается от случайного тем, что оно получено с помощью алгоритма, который, в любом случае, подчиняется какой-либо закономерности. Для решения большинства, а возможно и всех, задач в VBA Excel псевдослучайное число можно считать случайным.

Синтаксис

Rnd[(Число)]

Число – необязательный параметр, определяющий алгоритм вычисления псевдослучайного числа. Зависимость случайного числа от этого параметра:

Число Возвращаемое значение
Меньше нуля Одно и то же псевдослучайное число каждый раз, как результат использования параметра Число в качестве начального значения для алгоритма
Больше нуля Каждое следующее число в псевдослучайном порядке
Равно нулю Самое последнее псевдослучайное число, созданное функцией Rnd
По умолчанию Каждое следующее число в псевдослучайном порядке

Для любого параметра Число создается одна и та же последовательность чисел, так как каждый последующий вызов функции Rnd использует предыдущее значение в качестве начального для следующего псевдослучайного числа в последовательности.

Функция Rnd – это и есть простейший генератор случайных чисел в VBA Excel, возвращающий значения в интервале 0<=Rnd<1.

Чтобы повысить «случайность» псевдослучайных чисел, возвращаемых функцией Rnd, используется оператор Randomize.

Оператор Randomize

Randomize – это оператор, который инициализирует генератор случайных чисел функции Rnd, задавая начальное число для генерации первого псевдослучайного числа.

Синтаксис

Randomize[Число]

Число – необязательный параметр, задающий начальное число для генерации. Если параметр Число опущен, используется значение, возвращенное системным таймером.

При повторном использовании в VBA Excel оператора Randomize с тем же значением аргумента Число предыдущая последовательность не повторяется.

Для повторения предыдущей последовательности случайных чисел необходимо непосредственно перед оператором Randomize с тем же значением аргумента Число вызвать функцию Rnd с отрицательным аргументом.

WorksheetFunction.RandBetween

RandBetween – функция рабочего листа, возвращающая целое случайное число в пределах заданного диапазона значений.

Синтаксис

WorksheetFunction.RandBetween(Arg1, Arg2)

  • Arg1 – наименьшее целое число, которое возвращает функция рабочего листа RandBetween (обязательный параметр);
  • Arg2 – наибольшее целое число, которое возвращает функция рабочего листа RandBetween (обязательный параметр).

Примеры записи строк с WorksheetFunction.RandBetween в VBA Excel (присвоение случайного числа переменной):

a = WorksheetFunction.RandBetween(65, 15)

a = WorksheetFunction.RandBetween(5, 145)

Если данную функцию вставить в ячейку рабочего листа, например: =СЛУЧМЕЖДУ(25;55), случайное число будет обновляться при каждом пересчете листа.

Примеры с Rnd и Randomize

Пример 1
Запускаем генератор случайных чисел функции Rnd с разными параметрами и выводим результаты на рабочий лист Excel:

Sub Primer1()

Dim i As Byte

  Cells(1, 1) = «Rnd(-5)»

    For i = 2 To 5

      Cells(i, 1) = Rnd(5)

    Next

  Cells(1, 2) = «Rnd(3)»

    For i = 2 To 5

      Cells(i, 2) = Rnd(3)

    Next

  Cells(1, 3) = «Rnd(0)»

    For i = 2 To 5

      Cells(i, 3) = Rnd(0)

    Next

End Sub

Получаем следующий результат:

Случайные числа, возвращаемые функцией Rnd с разными аргументами

Пример 2
Повторное использование оператора Randomize с тем же значением аргумента Число:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Sub Primer2()

Dim i As Byte

  Cells(1, 1) = «Последовательность 1»

  Rnd (1)

  Randomize 4

    For i = 2 To 5

      Cells(i, 1) = Rnd

    Next

  Cells(1, 2) = «Последовательность 2»

  Randomize 4

    For i = 2 To 5

      Cells(i, 2) = Rnd

    Next

  Cells(1, 3) = «Последовательность 3»

  Rnd (1)

  Randomize 4

    For i = 2 To 5

      Cells(i, 3) = Rnd

    Next

End Sub

Строка кода Rnd (-1) обеспечивает генерацию последовательности случайных чисел сначала при повторных использованиях оператора Randomize.

Повторное использование оператора Randomize при генерации случайных чисел

Строка кода Randomize 4 перед заполнением второго столбца не влияет на работу функции Rnd, а заполнение последовательности для третьего столбца начинается заново благодаря строке Rnd (-1) перед оператором Randomize.

Пример 3
Создание генераторов случайных чисел для разных диапазонов. Исходим из того, что функция Rnd генерирует псевдослучайную последовательность из чисел меньше 1, но больше или равным 0.

Примеры с положительными случайными числами:

‘От 0 (включительно) до 10

  10 * Rnd

‘От 6 (включительно) до 7

  Rnd + 6

‘От 5 (включительно) до 10

  5 * Rnd + 5

Примеры с отрицательными случайными числами:

‘От -10 до 0 (включительно)

  10 * Rnd

‘От -10 до 10 (включительно)

  20 * Rnd + 10

‘От -10 до -5 (включительно)

  (5 * Rnd + 5)

Пример заполнения ячеек положительными и отрицательными случайными числами на листе Excel:

Sub Primer3()

Dim i As Byte

  Cells(1, 1) = «От 1 до 3»

    For i = 2 To 9

      Cells(i, 1) = 2 * Rnd + 1

    Next

  Cells(1, 2) = «От -5 до 5»

    For i = 2 To 9

      Cells(i, 2) = 10 * Rnd + 5

    Next

  Cells(1, 3) = «От -5 до -2»

    For i = 2 To 9

      Cells(i, 3) = 3 * Rnd 2

    Next

End Sub

Результат выполнения кода VBA Excel третьего примера:

Примеры положительных и отрицательных случайных чисел

Home / VBA / How to Generate Random Numbers in VBA

In VBA, there are different ways that you can use to generate a random number in Excel, and in this post, we will look at all of them one by one.

RND Function

To generate a random number, in VBA, there is a function called RND. This function stands for random and when you use this function in code it returns a random number between 0 to 1. In RND, you don’t need to specify any argument.

Range("A1") = Rnd()

The above code uses it to get a random number in the A1 and it has returned 0.705547521.

But when you use it for an entire range it returns the same random number in the entire range and that makes it void for use to generate random numbers more than once.

Now here it doesn’t make sense to use it, right? But there’s a solution that you can use, FOR NEXT LOOP.

In the above code, you have a loop that loops through 10 cells (one by one) from the selected cell and adds a random number.

Here’s the full code:

Sub vba_random_number()
Dim i As Long
i = 10
For i = 1 To i
    ActiveCell.Value = Rnd()
    ActiveCell.Offset(1, 0).Select
Next i
End Sub

Random Number Between Two Numbers

If you want to generate a random number between two defined numbers, in that case, you need to write code by using two VBA Functions (RND + INT). The code for this formula would be like below.

Sub vba_random_number()
Dim myRnd As Integer
myRnd = Int(2 + Rnd * (45 - 10 + 1))
Range("A1") = myRnd
End Sub

When you run this macro, RND uses the max number and the min number that you have defined to generate the random number and INT removes the decimal from that.

Using Worksheet Functions in a VBA Code to Generate a Random Number

In VBA, you can access worksheet functions and use them to get a result by specifying the arguments. There are two functions from the worksheet that can help you to get a random number in the result.

  • RandBetween
  • RandArray

Before you use these functions make sure to understand the arguments that you need to define. Now in the below code, you have RANDBETWEEN which generates a random number between two numbers.

Range("A1") = WorksheetFunction.RandBetween(1000, 2000)

Here the max number is 2000 and the min number is 1000. In the same way, you can use the RANDARRAY which is dynamic arrays function.

Here’s the code.

Range("A1:B10") = WorksheetFunction.RandArray(10, 2, 1000, 2000, True)

If you look at the syntax of the RANDARRAY, you will find that you can enter random numbers in an entire range which is not possible with all the methods that we have discussed above.

Technically there is no such thing as random numbers with no repetition. What you are asking for is actually a random permutation of a set of values, like the ordering of a shuffled deck of cards or lottery ball picks. Random permutation of a range of vlaues can be achieved in Excel VBA succinctly.

Assign your button’s macro to RangeValue():

Public Sub RangeValue()
    Dim i As Long
    Static n As Long, s As String
    Const MIN = 1, MAX = 100, OUT = "A1", DEL = "."
    Randomize
    Do
        i = Rnd * (MAX - MIN) + MIN
        If 0 = InStr(s, i & DEL) Then
            n = n + 1: s = s & i & DEL
            Range(OUT) = i
            If n > MAX - MIN Then n = 0: s = ""
            Exit Do
        End If: DoEvents
    Loop
End Sub

That’s it. The above code is all that is required to answer your question as posed.

You can use the Const line near the top to edit the MIN and MAX range of values that will be spun through randomly. You can also adjust the OUTput cell.

Once all of the values have been output (i.e. 100 button clicks), the code resets and spins through the range again in a new, random order. This continues forever. You can disable multiple spins-through by deleting this line: If n > MAX - MIN Then n = 0: s = ""

How does this work?

The routine maintains a string of previously output values. Each time the procedure is run, it selects a new random value from the range and checks if that value is already logged in the string. If it is it picks a new value and looks again. This continues in a loop until a value not currently logged in the string is randomly selected; that value is logged and output to the cell.

EDIT #1

To address your new question about how to set this up so that it works in more than one cell with different value ranges, assign your button’s macro to ButtonClick():

Public Sub ButtonClick()
    Static n1 As Long, s1 As String, n2 As Long, s2 As String
    RangeValue 1, 100, "A1", n1, s1
    RangeValue 1, 150, "B1", n2, s2
End Sub

Private Sub RangeValue(MIN As Long, MAX As Long, OUT As String, n As Long, s As String)
    Dim i As Long
    Const DEL = "."
    Randomize
    Do
        i = Rnd * (MAX - MIN) + MIN
        If 0 = InStr(s, i & DEL) Then
            n = n + 1: s = s & i & DEL
            Range(OUT) = i
            If n > MAX - MIN Then n = 0: s = ""
            Exit Do
        End If: DoEvents
    Loop
End Sub

EDIT #2

While the above methods are concise, we can be more efficient by permuting the set of values in an array, and by avoiding the selection of values that have already been output. Here is a version that uses Durstenfeld’s implementation of the Fisher–Yates shuffle algorithm:

Public Sub ButtonClick()
    Static n As Long, a
    Const MIN = 1, MAX = 100, OUT = "A1"
    If n = 0 Then a = Evaluate("transpose(row(" & MIN & ":" & MAX & "))"): n = UBound(a)
    PermuteArray a, n: Range(OUT) = a(n): n = n - 1
End Sub
Private Sub PermuteArray(a, n As Long)
    Dim j As Long, t
    Randomize
    j = Rnd * (n - 1) + 1
    If j <> n Then t = a(j): a(j) = a(n): a(n) = t
End Sub

Fisher–Yates has the advantage that it can be stopped and started as needed and so I am using it on the fly to permute the next value to display on each button click.

And to round this out with a version to use with your scenario of two output cells that use different value ranges:

Public Sub ButtonClick()
    Static n1 As Long, n2 As Long, a1, a2
    Const MIN1 = 1, MAX1 = 100, OUT1 = "A1"
    Const MIN2 = 1, MAX2 = 150, OUT2 = "B1"
    If n1 = 0 Then Reset a1, n1, MIN1, MAX1
    If n2 = 0 Then Reset a2, n2, MIN2, MAX2
    PermuteArray a1, n1: Range(OUT1) = a1(n1): n1 = n1 - 1
    PermuteArray a2, n2: Range(OUT2) = a2(n2): n2 = n2 - 1
End Sub
Private Sub PermuteArray(a, n As Long)
    Dim j As Long, t
    Randomize
    j = Rnd * (n - 1) + 1
    If j <> n Then t = a(j): a(j) = a(n): a(n) = t
End Sub
Private Sub Reset(a, n As Long, MIN As Long, MAX As Long)
    a = Evaluate("transpose(row(" & MIN & ":" & MAX & "))"): n = UBound(a)
End Sub

EDIT #3

I decided to create a version of this that utilizes the «inside-out» variation of Fisher–Yates. This allows us to specify the array of range values and shuffle it at the same time, an elegant and even more efficient enhancement:

Public Sub ButtonClick()
    Const MIN = 1, MAX = 100, OUT = "A1"
    Static a, n&
    If n = 0 Then Reset a, n, MIN, MAX
    Range(OUT) = a(n): n = n - 1
End Sub
Private Sub Reset(a, n&, MIN&, MAX&)
    Dim i&, j&
    Randomize: n = MAX - MIN + 1: ReDim a(1 To n)
    For i = 1 To n
        j = Rnd * (i - 1) + 1: a(i) = a(j): a(j) = i - 1 + MIN
    Next
End Sub

And to expand on your requirement of two different output cells that each use different value ranges, I decided to craft a generalized solution that can be used for an arbitrary number of independent output cells each tied to its own value range:

Public Sub ButtonClick()
    Dim MIN, MAX, OUT, i
    Static a, n, z
    MIN = Array(1, 11, 200): MAX = Array(100, 20, 205): OUT = Array("A1", "B2", "C3")
    z = UBound(MIN)
    If Not IsArray(n) Then ReDim a(z): ReDim n(z)
    For i = 0 To z
        If n(i) = 0 Then Reset a(i), n(i), MIN(i), MAX(i)
        Range(OUT(i)) = a(i)(n(i)): n(i) = n(i) - 1
    Next
End Sub
Private Sub Reset(a, n, MIN, MAX)
    Dim i, j
    Randomize: n = MAX - MIN + 1: ReDim a(1 To n)
    For i = 1 To n
        j = Rnd * (i - 1) + 1: a(i) = a(j): a(j) = i - 1 + MIN
    Next
End Sub

While the above is setup for three outputs, simply adjust the MIN, MAX, and OUT arrays near the top to suit your needs.

В этом учебном материале вы узнаете, как использовать Excel функцию RND с синтаксисом и примерами.

Описание

Microsoft Excel функция RND возвращает случайное число, которое больше или равно 0 и меньше 1. Вы можете использовать функцию RND в формуле для генерации случайного числа в диапазоне значений.
Функция RND — это встроенная функция Excel, относящаяся к категории математических / тригонометрических функций. Её можно использовать как функцию VBA в Excel.
В качестве функции VBA вы можете использовать эту функцию в коде макроса, который вводится через редактор Microsoft Visual Basic Editor.

Синтаксис

Синтаксис функции RND в Microsoft Excel:

Rnd ( [number] )

Аргументы или параметры

number
Необязательно. Он указывает, какое случайное число нужно вернуть (см. Возвращаемое значение ниже).

Возвращаемое значение

Функция RND возвращает случайное число, которое больше или равно 0 и меньше 1. Если предоставленное number больше 0 или параметр number опущен, функция RND вернет следующее случайное число в последовательности с использованием ранее сгенерированного случайного числа в качестве начального числа. Если number меньше 0, функция RND вернет случайное число, используя number в качестве начального числа. Если number равно 0, функция RND вернет случайное число, которое было создано последним.

Случайный целочисленный диапазон

Чтобы создать случайное целое число между двумя значениями (диапазоном), вы можете использовать следующую формулу:

Int ((upperbound lowerbound + 1) * Rnd + lowerbound)

Где lowerbound — это наименьшее число, а upperbound — наибольшее число, для которого вы хотите создать случайное число.

Int ((2510+1) * Rnd + 10)

Приведенная выше формула сгенерирует целое случайное число от 10 до 25.

Применение

  • Excel для Office 365, Excel 2019, Excel 2016, Excel 2013, Excel 2011 для Mac, Excel 2010, Excel 2007, Excel 2003, Excel XP, Excel 2000

Тип функции

  • Функция VBA

Пример (как функция VBA)

Функцию RND можно использовать только в коде VBA в Microsoft Excel.
Давайте взглянем на некоторые примеры Excel функции RND, чтобы понять, как использовать Excel функцию RND в коде Excel VBA:

Int ((6 1 + 1) * Rnd + 1)

Результат: случайное число между 1 и 6

Int ((200 150 + 1) * Rnd + 150)

Результат: случайное число между 150 и 200

Int ((999 100 + 1) * Rnd + 100)

Результат: случайное число между 100 и 999

Например:

Dim LRandomNumber As Integer

LRandomNumber = Int ((300 200 + 1) * Rnd + 200)

В этом примере переменная с именем LRandomNumber теперь будет содержать случайное число от 200 до 300.

Добавить функцию Randomize

Если вы обнаружите, что вы не получаете действительно случайное число при вызове функции RND, вы можете использовать функцию RANDOMIZE, чтобы изменить начальное значение для генератора случайных чисел функции RND. Вызов функции RANDOMIZE должен предшествовать вызову функции RND. Например,

Sub Macro1

  Dim LRandomNumber As Integer

  Randomize

  LRandomNumber = Int ((300 200 + 1) * Rnd + 200)

End Sub

В этом примере переменная с именем LRandomNumber теперь будет содержать случайное число от 200 до 300.
Функция Randomize будет гарантировать, что сгенерированное число действительно случайное, путем инициализации генератора случайных чисел начальным значением, которое эквивалентно системному таймеру.

Предупреждение: Если вы не вызываете функцию Randomize перед вызовом функции Rnd, функция Rnd может каждый раз возвращать одно и то же значение случайного числа. И поэтому вы не можете получить действительно случайное число.

Return to VBA Code Examples

This tutorial will demonstrate how to work with random numbers in VBA.

RND Function

The RND Function generates a number that is between 0 and 1. The syntax of the RND Function is:

Rnd([Number]) where:

  • Number (Optional) – This is optional and if <0, the function returns the same random number on each call using [Number] as the seed, if =0, the function returns the most recent random number, if >0 the function returns the next generated random number. If blank the default >0, is used.
Sub RndNum()
    MsgBox Rnd()
End Sub

Generating a Random Number in VBA

In order to generate a random number between two values, you have to use the RND Function in combination with the INT Function  (Integer Function) using the following general formula:

  • Int(lowerbound + Rnd * ( upperbound – lowerbound + 1 ) )

So, in order to generate a random number between 2 and 30, you would use the following code:

Sub GeneratingARandomNumber()

Dim randomNumber As Integer

randomNumber = Int(2 + Rnd * (30 - 2 + 1))
Debug.Print randomNumber

End Sub

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

vba-free-addin

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(No installation required!)

Free Download

Понравилась статья? Поделить с друзьями:
  • Vba excel сложение чисел
  • Vba excel снять фильтр если есть
  • Vba excel сложение диапазонов
  • Vba excel снять пароль с файла excel
  • Vba excel словарь словарей