Ошибка метода удаления диапазона

#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:

  1. Rows() предполагается, что вы хотите ActiveSheet . Вы столкнетесь с проблемами, если не укажете, какой Sheet именно, поскольку ActiveSheet он может отличаться от того, в котором находится ваша база данных. Всегда будьте конкретны, используйте:

    Sheet1.Rows(Y).Delete Shift:=xlUp

  2. Если вы разрешаете выбирать несколько строк, когда вы начинаете удалять строки, ваши данные сдвигаются вверх, и в конечном итоге вы пропускаете следующую строку при удалении одной. Простой способ исправить это — считать в обратном направлении, чтобы вы не влияли на данные при удалении.

    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. Спасибо! Это сработало, и даже больше благодаря дополнительной информации, полезно знать, что есть много других методов, которые также работают.