У меня есть эта часть кода, которая находит строку 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, так и элемент из списка. Он работает, чтобы удалить элемент из списка, но я также не знаю, как удалить строку.
Решение 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" в запасном столбце справа от каждой строки при прохождении цикла, Затем вы сортируете по этому комментарию и устраняете его
Если ваши строки данных содержат форматирование, вы можете найти конец нового диапазона данных и удалить ранее удаленные строки. Чтобы сохранить размер файла. Обратите внимание, что одно большое удаление в конце процедуры не будет ухудшать производительность вашего кода так же, как удаление отдельных строк
Еще лучше, используйте 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
Таким образом, вам не нужно беспокоиться о сортировке или о том, что происходит внизу.
Измените свою линию
ws.Range(Rand, 1).EntireRow.Delete
to
ws.Cells(Rand, 1).EntireRow.Delete
Что-то вроде этого сделает это:
Rows("12:12").Select
Selection.Delete
Итак, в вашем коде это будет выглядеть примерно так:
Rows(CStr(rand) & ":" & CStr(rand)).Select
Selection.Delete