Первый код VBA: ошибка времени выполнения «1004»

Я получаю ошибку во время выполнения, но это может быть наименьшее из моих проблем. Логика имеет смысл в моей голове, но я не могу использовать правильный синтаксис или функции. Мой код ниже с комментариями и «надеждами»:

Sub Random_Points() Dim i As Integer Dim j As Integer Dim Max As Integer Dim RandomNumber As Integer Max = 100 '(Max is being multiplied by the Rnd function to provide a random number between 0-100) For i = 2 To 100 Step 1 RandomNumber = Int(Rnd * Max) ThisWorkbook.Sheets("VBA").Cells(i, 2).Value = RandomNumber '(The for loop above with start assigned cells values starting with Cells(2,2) to Cells(100,2)) '(I DO NOT WANT DUPLICATE VALUES...therefore after the value is assigned above I want the code to compare the newly assigned cell to all the cells above it.) For j = 1 To 98 Step 1 '(...and IF the cell values are the same...) If ThisWorkbook.Sheets("VBA").Cells(i, 2).Value = ThisWorkbook.Sheets("VBA").Cells(i - j, 2).Value Then '(...A new random number will be assigned...) RandomNumber = Int(Rnd * Max) ThisWorkbook.Sheets("VBA").Cells(i, 2).Value = RandomNumber End If '(...and then re-checked vs all the others) Next j '(Next cell is assigned...loop restarts) Next i End Sub 

Ваша проблема в вашем вложенном цикле. Как j приращений, он приближается и, наконец, равен i . Впоследствии, когда вы используете два значения в .Cells(i - j, 2).Value , свойство Range.Cells отсутствует с номером строки меньше 1 .

Решение состоит в том, чтобы изменить ваш вложенный For … Следующий оператор, чтобы j никогда не доходил до i .

 'was ... For j = 1 To 98 Step 1 'should be ... For j = 1 To (i - 1) Step 1 

Вам нужно только проверить значения до i в любом случае.

fwiw, использование объекта WorksheetFunction функции MATCH и функции IsError VBA будет быстрее.

 Sub randomPoints_part_deux() Dim i As Long, mx As Long, randNum As Long mx = 100 '(mx is being multiplied by the Rnd function to provide a random number between 0-100) With ThisWorkbook.Sheets("VBA") 'seed the column of numbers so you have something to check against randNum = Int(Rnd * mx) .Cells(2, 2) = randNum For i = 3 To 100 Step 1 Do While Not IsError(Application.Match(randNum, .Range(.Cells(2, 2), .Cells(i - 1, 2)), 0)) randNum = Int(Rnd * mx) Loop .Cells(i, 2) = randNum Next i 'optional formula to count unique in C2 .Cells(2, 3).Formula = "=SUMPRODUCT(1/COUNTIF(B2:B100, B2:B100))" End With End Sub 

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

 Sub Random100() Dim i As Integer Dim j As Integer Dim Max As Integer Dim RandomNumber As Integer Dim cNum As New Collection Max = 100 '(Max is being multiplied by the Rnd function to provide a random number between 0-100) For i = 0 To Max 'fill collection with 0-100 in order cNum.Add i Next i k = cNum.Count - 1 For j = 0 To k RandomNumber = Int(Rnd * (k - j)) + 1 ThisWorkbook.Sheets("VBA").Cells(j + 2, 2).Value = cNum(RandomNumber) cNum.Remove (RandomNumber) Next j End Sub 

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

 Const MIN = 1 Const MAX = 98 Dim values(MIN To MAX, 0 To 0) As Double, i&, irand& ' generate all the values For i = MIN To MAX values(i, 0) = i Next ' shuffle the values For i = MIN To MAX irand = MIN + Math.Round(Rnd * (MAX - MIN)) value = values(i, 0) values(i, 0) = values(irand, 0) values(irand, 0) = value Next ' copy the values to the sheet ThisWorkbook.Sheets("VBA").Range("A2").Resize(MAX - MIN + 1, 1) = values 
  • Логические операторы в Excel: если нет
  • Application.Evaluate Runtime Ошибка Тип ошибки Несоответствие
  • Попытка удалить все листы в рабочей книге, а затем добавить другие листы с помощью VBA
  • Диапазон автофильтрации в UserForm приводит к преждевременному отключению функции без ошибок
  • Аргумент VBA не является необязательной ошибкой userfrom listbox
  • Выбор последней ячейки в столбце - Ошибка 424?
  • Ошибка времени выполнения VBA 91 на второй итерации
  • Временное решение 1004 - Защитить / Снять защиту в Worksheet_Change
  • Метод сортировки VBA класса Range не удался
  • Создание листов в двух разных книгах и ихменование после списка в этой книге
  • Ошибка времени выполнения 1004 над надстройкой Excel: Неизвестный путь к файлу
  • Interesting Posts

    Ошибка Excel 1004 «Ячейки не найдены»

    Адаптировать закодированную функцию к моему коду

    Как запустить макрос vba на конкретном листе, не выходя из текущей рабочей таблицы

    Как написать форматированные числа как числа в JExcel (jxl)

    Разделение не соседних ячеек с использованием VBA

    Копировать диапазон из столбца A и записать в столбец B

    Добавление ссылки на веб-страницу для каждой точки данных или метки данных на диаграмме рассеяния Excel

    AlphaFS Преодоление ограничений на использование символов в 260 символов

    Сводная таблица с именами страниц в виде заголовков столбцов

    Excel VBA, чтобы получить UNC из ячейки и открыть его в explorer.exe

    Возврат каретки в блокнот

    провайдер не найден для oracle OraOLEDB

    VBA для открытия / редактирования / копирования отчетов? – Изменить / Исправить

    Кодировка символов в электронной таблице Excel (и то, что Java charset использовать для декодирования)

    Вставить строку без смещения формул вниз

    Давайте будем гением компьютера.