Удалить строку в Excel VBA

31

У меня есть эта часть кода, которая находит строку excel из списка и удаляет элементы из списка. Я хочу... также удалить строку Excel.

Код здесь

Private Sub imperecheaza_Click()
Dim ws As Worksheet
Dim Rand As Long
Set ws = Worksheets("BD_IR")    
Rand = 3
Do While ws.Cells(Rand, 4).Value <> "" And Rand < 65000
   If ws.Cells(Rand, 4).Value = gksluri.Value * 1 And ws.Cells(Rand, 5).Value = gksluri.List(gksluri.ListIndex, 1) * 1 Then
            ws.Range(Rand, 1).EntireRow.Delete '(here I want to delete the entire row that meets the criteria from the If statement)
            gksluri.RemoveItem gksluri.ListIndex
            Exit Do
    End If
Rand = Rand + 1
Loop
End Sub

Где я добавил ws.Range(Rand, 1).EntireRow.Delete - это то, где я хочу удалить всю строку, но я не знаю, как это сделать. Я хочу... если он найдет то же значение в ячейке, что и в некоторых выбранных элементах моего списка, чтобы иметь возможность удалять как целую строку в excel, так и элемент из списка. Он работает, чтобы удалить элемент из списка, но я также не знаю, как удалить строку.

  • 1
    Предупреждение. Если вы удаляете более одной строки в цикле (работает сверху вниз), убедитесь, что вы перевернули цикл, переходя снизу вверх. В противном случае ваш цикл пропустит строку сразу после той, которую вы удалили. Изменяя цикл снизу вверх, вы предотвратите это (за счет двойной проверки после каждой удаленной строки).
  • 0
    Этого пропуска также можно избежать, установив в свой оператор if только приращение, когда строка не удаляется.
Показать ещё 1 комментарий
Теги:
excel

4 ответа

47
Лучший ответ

Решение Chris Nielsen прост и будет хорошо работать. Немного более короткий вариант будет...

ws.Rows(Rand).Delete

... обратите внимание: нет необходимости указывать Shift при удалении строки, поскольку по определению невозможно сдвинуть влево

Кстати, мой предпочтительный метод для удаления строк - использовать...

ws.Rows(Rand) = ""

... в исходном цикле. Затем я использую функцию сортировки, чтобы подтолкнуть эти строки к нижней части данных. Основная причина этого заключается в том, что удаление отдельных строк может быть очень медленной процедурой (если вы удаляете > 100). Это также гарантирует, что ничто не будет пропущено согласно комментарию Роберта Ильбринка.

Вы можете узнать код для сортировки, записав макрос и уменьшив код, как показано в этом экспертном видео Excel. У меня есть подозрение, что самый аккуратный метод (Range ( "A1: Z10" ). Sort Key1: = Range ( "A1" ), Order1: = xlSortAscending/Descending, Header: = xlYes/No) может быть обнаружен только на предварительном этапе, 2007 версии Excel... но вы всегда можете уменьшить эквивалентный код 2007/2010

Еще пару очков... если ваш список еще не отсортирован по столбцу, и вы хотите сохранить заказ, вы можете вставить номер строки "Rand" в запасном столбце справа от каждой строки при прохождении цикла, Затем вы сортируете по этому комментарию и устраняете его

Если ваши строки данных содержат форматирование, вы можете найти конец нового диапазона данных и удалить ранее удаленные строки. Чтобы сохранить размер файла. Обратите внимание, что одно большое удаление в конце процедуры не будет ухудшать производительность вашего кода так же, как удаление отдельных строк

4

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

dim rng as range
dim rDel as range

for each rng in {the range you're searching}
   if {Conditions to be met} = true then
      if not rng is nothing then
         set rDel = union(rng,rDel)
      else
         set rDel = rng
      end if
   end if
 next

 rDel.entirerow.delete

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

2

Измените свою линию

ws.Range(Rand, 1).EntireRow.Delete

to

ws.Cells(Rand, 1).EntireRow.Delete 
0

Что-то вроде этого сделает это:

Rows("12:12").Select
Selection.Delete

Итак, в вашем коде это будет выглядеть примерно так:

Rows(CStr(rand) & ":" & CStr(rand)).Select
Selection.Delete
  • 0
    Спасибо ... Я получаю сообщение об ошибке (ожидается: конец оператора) для Shift: = xlUp
  • 0
    @andrei Вы можете просто удалить Shift: = xlUp. - и я отредактировал код, чтобы он был дружественным к VBA (благодаря анонимному downvoter)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню