Проблема со случайной функцией VBA - не работает при закрытии рабочего файла - PullRequest
1 голос
/ 28 октября 2019

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

  1. открыть файл Excel, сгенерировано: 1111, сгенерировано: 2222, закрыть
  2. открыть файл с макросом, сгенерировано: 1111, сгенерировано 2222, сгенерировано 3333закрыть лист
  3. Открыть файл, сгенерированный: 1111

      For i = 15 To 38
      ws2.Cells(i, 2) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 3) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 4) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 5) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 6) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 7) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 8) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 9) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 10) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 11) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 12) = Int((9999 - 0 + 1) * Rnd + 0)
      ws2.Cells(i, 13) = Int((9999 - 0 + 1) * Rnd + 0)
    
      Next i
    

Ожидаемый результат (пример):

  1. открыть файл,сгенерировать: 1111, сгенерировать: 2222, закрыть
  2. открыть файл с макором, сгенерировано: 3333, сгенерировано 4444, сгенерировано 5555 закрыть лист
  3. открыть файл, сгенерировано: 6666

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Добавить Рандомизировать перед циклом. - BrakNicku

Вам не нужно иметь 12 (почти) одинаковых строк кода, вы можете просто обернуть ws2.Cells (i, j) = Int ((9999 - 0 + 1) * Rnd + 0) в цикле For: для j = 2 до 13. Также: я мог бы что-то упустить, но - 0 и + 0 ничего не достигают, насколько я могу судить. - М.Щалк

Randomize
For i = 15 To 38
    For j = 2 To 13
        ws2.Cells(i, j) = Int(10000 * Rnd)
    Next j
Next i
1 голос
/ 28 октября 2019

Функция VBA Rnd не возвращает истинное случайное число , поскольку рандомизация основана на последовательности начальных чисел, которая может повторяться при каждом открытии файла, как вы уже видели. Согласно комментариям, WorksheetFunction.RandBetween не имеет такого недостатка, и в этом случае будет работать в качестве замены. Также, как Excel знает об этом, была добавлена ​​функция Randomize, чтобы рандомизировать начальное число, чтобы получить более случайное число.

Вы уже узнали об этом из комментариев, однако я все еще отправляю свой ответ, так как ваш код крайне неэффективен и может занять много времени для запуска (мне потребовалось полминуты, чтобы открыть файлпри тестировании). И я просто не мог игнорировать это. Поэтому я изменил его, чтобы вместо этого генерировать все ваши числа в массиве и вставлять их на свой лист после. Это делает код почти мгновенным:

Private Sub workbook_Open()
Dim i As Integer, j As Integer
Dim arr(0 To 24, 0 To 12) As Variant
For i = 0 To 24
    For j = 0 To 12
        Randomize
        arr(i, j) = Int(10000 * Rnd) 'WorksheetFunction.RandBetween(1, 10000)
    Next j
Next i
Range("B15:M38") = arr

End Sub
...