Решение Криса Нильсена простое и будет хорошо работать. Немного более короткий вариант будет ...
ws.Rows(Rand).Delete
... заметьте, что нет необходимости указывать Shift при удалении строки, так как по определению невозможно сместить влево
Кстати, мой предпочтительный метод удаления строк - использовать ...
ws.Rows(Rand) = ""
... в начальном цикле. Затем я использую функцию сортировки, чтобы перенести эти строки в конец данных. Основная причина этого заключается в том, что удаление отдельных строк может быть очень медленной процедурой (если вы удаляете> 100). Это также гарантирует, что ничто не будет пропущено согласно комментарию Роберта Ильбринка
Вы можете узнать код для сортировки, записав макрос и уменьшив код, как показано в этом экспертном видео Excel * . У меня есть подозрение, что самый удобный метод (Range ("A1: Z10"). Sort Key1: = Range ("A1"), Order1: = xlSortAscending / Descending, Header: = xlYes / No) может быть обнаружен только в Версии Excel 2007 ... но вы всегда можете уменьшить эквивалентный код 2007/2010
Соедините еще несколько пунктов ... если ваш список еще не отсортирован по столбцу и вы хотите сохранить порядок, вы можете вставить номер строки 'Rand' в запасной столбец справа от каждой строки, пока вы просматриваете цикл. , Затем вы сортируете этот комментарий и удаляете его
Если ваши строки данных содержат форматирование, вы можете найти конец нового диапазона данных и удалить строки, которые вы очистили ранее. Это чтобы уменьшить размер файла. Обратите внимание, что одно большое удаление в конце процедуры не повлияет на производительность вашего кода так же, как удаление отдельных строк