VBA For Each ... L oop пропуская ячейки при очистке строки - PullRequest
0 голосов
/ 13 февраля 2020

Я знаю, что это обычная проблема, с которой сталкиваются люди при попытке удаления строк при циклическом переключении диапазонов, но здесь это не так. Вместо того чтобы удалять строки, я обрезаю всю строку и вставляю ее в другой лист, оставляя пустую строку. Проблема в том, что For Each ... L oop действует так, как будто я удалил строку и пропускает следующую ячейку в l oop. Ниже приведен фрагмент кода.

last_row = 100

Set search_rng = n_ws.Range(n_ws.Range("L2"), n_ws.Cells(last_row, 12))

    For Each cell In search_rng
        find_amt = cell.Value * -1
        Set s_cell = search_rng.Find(find_amt, LookIn:=xlFormulas)

        If Not s_cell Is Nothing Then
            ' do stuff
        Else
            'No matching value found, move row to o_ws
            paste_row = o_ws.UsedRange.Rows.Count + 1
            n_ws.Rows(cell.Row).Cut o_ws.Cells(paste_row, 1).EntireRow  
        End If
    Next

Кто-нибудь знает, что я здесь не так делаю? Я полагаю, что могу это исправить, изменив For For ... L oop на For i в диапазоне l oop, но мне более любопытно, почему это происходит.

1 Ответ

3 голосов
/ 13 февраля 2020

Обрезка строки по-прежнему удаляет ее на практике. Вы можете убедиться в этом, просто сделав это вручную на электронной таблице. Вы увидите сдвиг в диапазоне, который означает, что это та же проблема, что и удаление строк в al oop. Обычный способ избежать этой проблемы - переключиться на For i l oop и l oop в обратном направлении.

Поскольку здесь вы на самом деле не удаляете строки, вы также можете попробовать следующее ...

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

   Else
        paste_row = o_ws.UsedRange.Rows.Count + 1
        n_ws.Rows(Cell.Row).Copy o_ws.Cells(paste_row, 1)
        n_ws.Rows(Cell.Row).ClearContents
    End If

Next cell

Примечание

Лучшим способом сделать это будет l oop через ваш диапазон и создать Union ( коллекцию ячеек ) которые соответствуют вашим критериям. Как только l oop будет готов, вы можете скопировать, вставить и очистить Union сразу. Это означает, что у вас есть один экземпляр действий, выполненных на листе, довольно много

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...