Подтвердить что ты не робот

Удаление строки в Excel VBA

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

4b9b3361

Ответ 1

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

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

Ответ 2

Еще лучше, используйте 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

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

Ответ 3

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

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

to

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

Ответ 4

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

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

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

Rows(CStr(rand) & ":" & CStr(rand)).Select
Selection.Delete