Как сделать случайные числа в vba

Добавил пользователь Cypher
Обновлено: 04.10.2024

Мне нужно сгенерировать случайное целое число от 1 до n (где n-положительное целое число) для использования для модульного теста. Мне не нужно что - то слишком сложное, чтобы обеспечить истинную случайность-просто старомодное случайное число.

Как бы я это сделал?

чтобы получить случайное целое значение от 1 до N (включительно), вы можете использовать следующее.

как уже неоднократно указывалось, предложение написать такой код проблематично:

причина в том, что конструктор Random класс предоставляет семя по умолчанию на основе часов системы. В большинстве систем это имеет ограниченную степень детализации - где-то около 20 мс. Поэтому, если вы напишете следующий код, вы получите одно и то же число несколько раз подряд:

следующий код решает эту выпуск:

я собрал простую программу, используя оба метода для генерации 25 случайных целых чисел от 1 до 100. Вот результат:

MS сделал их следующий метод () довольно странным. параметр Min-это инклюзивный минимум как один ожидалось бы, но параметр Max является эксклюзивные максимум, как никто не ожидал. другими словами, если вы передадите min=1 и max=5, то ваши случайные числа будут любыми из 1, 2, 3 или 4, но никогда не будут включать 5. Это первая из двух потенциальных ошибок во всем коде, использующем случайный код Microsoft.Следующий метод.

на простой ответ (но все же с другими возможными, но редкими проблемами), тогда вам нужно будет использовать:

(мне нравится использовать Int32 , а не Integer потому что это делает более ясным, насколько велик int, плюс он короче для ввода, но подходит вам.)

Я вижу две потенциальные проблемы с этим методом, но он будет подходящим (и правильным) для большинства применений. Так что, если вы хотите простой решение, я считаю, что это правильно.

только 2 проблемы вижу этой функции: 1: Когда Max = Int32.MaxValue поэтому добавление 1 создает числовое переполнение. хотя, это было бы редкостью, это все еще возможность. 2: когда минута > макс + 1. когда min = 10 и max = 5, следующая функция выдает ошибку. это может быть то, чего ты хочешь. но это может быть и не так. или рассмотрим, когда min = 5 и max = 4. добавляя 1, 5 передается следующему методу, но он не выдает ошибку, когда это действительно ошибка, но Microsoft .NET code, который я тестировал, возвращает 5. таким образом, это действительно не "эксклюзивный" Макс, когда max = min. но когда max

вы можете просто поменять номера, когда min > max, поэтому ошибка не возникает, но это полностью зависит от того, что желательно. если вы хотите ошибку при недопустимых значениях, то, вероятно, лучше также выбросить ошибку, когда эксклюзивный максимум Microsoft (max + 1) в нашем коде равен минимуму, где MS не ошибается в этом случае.

обработка обойти когда max = Int32.MaxValue немного неудобно, но я ожидаю опубликовать тщательную функцию, которая обрабатывает обе эти ситуации. и если вы хотите, чтобы поведение отличалось от того, как я его закодировал, поступайте как хотите. но имейте в виду эти 2 проблемы.

удачи в кодировании!

изменить: Поэтому мне нужен был генератор случайных чисел, и я решил закодировать его "правильно". Поэтому, если кто-то хочет полную функциональность, вот тот, который действительно работает. (Но он не выигрывает самый простой приз только с 2 линиями код. Но это не так уж и сложно.)

Однако Round может вернуть не совсем ожидаемый результат, т.к. функция применяет финансовое округление. По правилам данного округления если за последней к округлению цифрой стоит 5, то округляемую цифру увеличивают в том случае, если она нечетная и уменьшают, если четная.
Математическое же округление всегда округляет цифру в большую сторону, если за ней идет цифра 5 и выше, и отбрасывает остаток если 4 и меньше.
Т.е. если мы выполним такую строку кода

MsgBox Round(2.505, 2)

то результатом будет 2,5 , хотя предполагалось получить 2,51 . Поэтому порой для округления лучше использовать Format :

но в этом случае мы получим не число в чистом виде, а текст. И если нужно именно число, то придется производить дополнительные преобразования:

Так же, для математического округления, можно использовать и такой вариант:

MsgBox Application.Round(2.505, 2)

Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long lMinNum = 1: lMaxNum = 100 Randomize lRundNum = Int(lMinNum + (Rnd() * lMaxNum)) MsgBox lRundNum

В Excel имеется функция СЛУЧМЕЖДУ, она возвращает случайное число в заданных границах. Единственный ее минус в том, что она постоянно пересчитывается, даже при вводе значений, никак не связанных с формулой. Все прекрасно работает если у вас немного вычислений и мощный компьютер. Однако постоянный пересчет формулы иногда снижает продуктивность, приходится ждать когда все вычисления выполнятся. Поэтому в надстройку добавили аналогичную функцию, но которая не пересчитывается постоянно.

Функция =СЛУЧМЕЖДУСТАТ(Нижн_граница; Верхн_граница) имеет два аргумента:

  • - Нижн_граница - Нижнее (минимальное) значение диапазона. По умолчанию данный аргумент равен 0.
  • - Верхн_граница - Верхнее (максимальное) значение диапазона. По умолчанию данный аргумент равен 1.

Данная функция пересчитывается в следующих случаях:

  1. Когда вы повторно вводите функцию;
  2. Когда вы изменяете значения какого-либо аргумента;
  3. Когда вы выполняете пересчет книги или листа.

Продемонстрируем работу на следующих примерах:

Пример 1

Заполнение диапазона случайными значениями от 1 до 1000.

Пример 2

Заполнение диапазона случайными целыми значениями от 1 до 1000

Код на VBA


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

Приведенные ниже математические функции vba позволяют производить тригонометрические вычисления (нахождение sin, cos и так далее), обрабатывать числовые значения на предмет получения целой части от дробного, округления или генерации случайных чисел.

Математические функции VBA

Если переданный параметр для следующих математических функций vba не будет распознан как числовое значение, возникнет ошибка.

ABS ( num) – Функция возвращает значение числа по модулю.

Exp ( num) – Функция позволяет получить значение экспоненты, передаваемый параметр (максимальное значение ровно 709 782712893) является степенью, в которую нужно возвести экспоненту. Соответственно, если параметр равен 1, то мы получить чистое значение экспоненты.

Fix ( num) – Функция возвращает целую часть от переданного дробного значения. Если переданное значение является отрицательным, то возвращается ближайшее отрицательное целое число, большее, либо равное указанному.

Int ( num) – Математическая функция vba возвращает целую часть от переданного дробного значения. Если переданное значение является отрицательным, то возвращается ближайшее отрицательное целое число, меньшее, либо равное указанному.

Rnd (random) – Функция вернет число, входящее в диапазон от 0 до 1 в случайном порядке, при этом, само число 1 не входит в диапазон, а 0 – входит. Перед вызовом функции надо прописывать конструкцию Randomize, которая отвечает за включение генератора случайных чисел.

В зависимости от значения переданного параметра random, данная математическая функция vba работает следующим образом:

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

Round (num, [accr]) - Округление заданного числа (num) до заданной точности (accr).

Sgn (num) – Данная математическая функция vba позволяет узнать знак числа, переданного как аргумент. Функция vba вернет следующие значения:

  • 0 – Число равно 0
  • -1 – Число является отрицательным
  • 1 – Число является положительным.

Sql (num) – Квадратный корень из переданного числового параметра num.

Следующие математические функции vba являются тригонометрическими. В качестве параметра для большинства указывается значение угла в радианах. Для перевода градусов в радианы используется формула:

Угол (в радианах) = угол (в градусах) * pi / 180, где pi = 3.14159265358979

Atn (par) – Арктангенс переданного числа (угол в радианах), функция вернет значение в диапазоне от -pi/2 до pi/2 радиан

Cos (par) - Косинус переданного числа (угол в радианах), функция вернет значение в диапазоне от -1 до 1.

Sin (par) - Синус переданного числа (угол в радианах), функция вернет значение в диапазоне от -1 до 1.

Tan (par) - Тангенс переданного числа (угол в радианах).

Log (par) – Натуральный логарифм переданного числа.

Я не буду приводить примеры для всех приведенных выше математических функций VBA, а приведу только один пример кода для функций sin и cos. Откройте редактор VBA (комбинация клавиш Alt + F11), добавьте в проект новый модуль (меню Insert/Module). В моем случае имя модуля – module3, в редакторе кода для заданного модуля пропишите следующие строки:

Sub Module3() Dim oWord As Object, oDoc As Object, oSel As Object, oFont As Object Dim i As Integer, j As Integer i = 0: j = 0 Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents oDoc.Add Set oSel = oWord.Selection oWord.Visible = True Set oFont = oSel.Font With oFont .Size = 15 .Name = "Times New Roman" .Bold = True .ColorIndex = 2 End With oSel.TypeText "Синус угла: от 0 до 360 с шагом 10" ' математические функции vba With oFont .Size = 12 .Bold = False .Bold = True .ColorIndex = 0 End With oSel.TypeParagraph oSel.TypeParagraph Do While i

Спасибо за внимание. Автор блога Владимир Баталий

Читайте также: