#excel #vba #listbox
#excel #vba #список
Вопрос:
У меня есть «база данных» в Excel vba, но когда я пытаюсь удалить строку из своего источника, которая выбирается по идентификационному номеру, и нажимаю «Удалить», она застревает Rows(Y).Delete Shift:=xlUp
, я не уверен, почему, раньше это работало, но я как-то что-то сломал?
Все данные отображаются в списке. Сообщение об ошибке Run-Time error '1004': Delete method of Range failed
Dim X As Long
Dim Y As Long
X = Sheet1.Range("A" amp; Rows.Count).End(xlUp).Row
For Y = 2 To X
If Sheet1.Cells(Y, 1).Value = Searchtxt.Text Then
Rows(Y).Delete Shift:=xlUp
End If
Next Y
Unload Me
MyUserForm.show
End Sub
Я также оставляю эту ссылку на Google Диск:
https://drive.google.com/file/d/1_VBhBYqNal_U5YphICTH9UQsulEajOrM/view?usp=sharing
Ответ №1:
-
Rows()
предполагается, что вы хотитеActiveSheet
. Вы столкнетесь с проблемами, если не укажете, какойSheet
именно, посколькуActiveSheet
он может отличаться от того, в котором находится ваша база данных. Всегда будьте конкретны, используйте:Sheet1.Rows(Y).Delete Shift:=xlUp
-
Если вы разрешаете выбирать несколько строк, когда вы начинаете удалять строки, ваши данные сдвигаются вверх, и в конечном итоге вы пропускаете следующую строку при удалении одной. Простой способ исправить это — считать в обратном направлении, чтобы вы не влияли на данные при удалении.
For Y = X To 2 Step -1
Или, что еще лучше, для скорости, объедините его в диапазон и удалите все в конце. Не имеет значения, считаете ли вы вверх или вниз, используя этот метод.
Dim DeleteRows as Range
For Y = 2 To X
If Sheet1.Cells(Y, 1).Value = Searchtxt.Text Then
Set DeleteRows = MakeUnion(DeleteRows,Sheet1.Rows(Y))
End IF
Next Y
If Not DeleteRows is Nothing Then DeleteRows.Delete Shift:=xlUp
Где я использовал следующую функцию, чтобы код выглядел чистым.
Public Function MakeUnion(Arg1 As Range, Arg2 As Range) As Range
If Arg1 Is Nothing Then
Set MakeUnion = Arg2
ElseIf Arg2 Is Nothing Then
Set MakeUnion = Arg1
Else
Set MakeUnion = Union(Arg1, Arg2)
End If
End Function
Комментарии:
1. Спасибо! Это сработало, и даже больше благодаря дополнительной информации, полезно знать, что есть много других методов, которые также работают.