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

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

36 голосов
/ 21 октября 2011

У меня есть этот фрагмент кода, который находит строку 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, так и элемент из списка. Он работает для удаления элемента из списка, но я также не знаю, как удалить строку

Ответы [ 4 ]

56 голосов
/ 22 октября 2011

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

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' в запасной столбец справа от каждой строки, пока вы просматриваете цикл. , Затем вы сортируете этот комментарий и удаляете его

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

4 голосов
/ 28 сентября 2015

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

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

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

3 голосов
/ 22 октября 2011

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

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

на

ws.Cells(Rand, 1).EntireRow.Delete 
0 голосов
/ 21 октября 2011

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

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

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

Rows(CStr(rand) & ":" & CStr(rand)).Select
Selection.Delete
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...