Есть ли другой способ поиска пустой ячейки и смещения, когда существует только одна строка данных?

Вопрос или проблема

Sub Archive()
    ' Это архивирует данные в мастер-список.
    Range("A2").Copy  
    Range("M1").Select
        If Range("M1") = "" Then
            ActiveSheet.Paste
            Application.CutCopyMode = False
        Else: Range("M1").End(xlDown).Offset(1, 0).Select
        ActiveSheet.Paste
       Application.CutCopyMode = False
   End If
End Sub

Проблема, с которой я сталкиваюсь, связана с offset. Когда вызывается пустой архивный лист, возникает ошибка времени выполнения 1004. Когда у меня есть 2 строки данных, код работает идеально. Мне просто нужен другой способ переместить (offset) одну строку вниз с одной строкой данных, не создавая/вызывая процедуру для первой строки.

Я знаю, что это содержит select

Ответ или решение

Конечно! Давайте решим вашу проблему с ошибкой времени выполнения 1004, когда вы попытаетесь использовать Offset, если в листе архивирования присутствует только одна строка данных.

Прежде всего, важно заметить, что ошибка возникает из-за того, что метод End(xlDown) ищет первую пустую ячейку в столбце, и если вы начинаете с единственной заполненной ячейки, он может не сработать должным образом. Для решения этой проблемы вы можете использовать другие методы для определения следующей пустой ячейки.

Вот исправленный код:

Sub Archive()
    ' Этот код архивирует данные в главный список.
    Dim archiveCell As Range
    Set archiveCell = Range("M1")

    ' Если ячейка M1 пуста, просто вставляем в нее значение.
    If archiveCell.Value = "" Then
        Range("A2").Copy archiveCell
    Else
        ' Ищем первую пустую ячейку в столбце M.
        Set archiveCell = archiveCell.End(xlDown).Offset(1, 0)

        ' Проверка на случай, если столбец M не заполнен полностью
        If IsEmpty(archiveCell) Then
            Range("A2").Copy archiveCell
        Else
            ' Переход к следующей пустой ячейке в случае, если есть данные до конца столбца.
            Do While Not IsEmpty(archiveCell)
                Set archiveCell = archiveCell.Offset(1, 0)
            Loop
            Range("A2").Copy archiveCell
        End If
    End If

    Application.CutCopyMode = False
End Sub

Объяснение кода:

  1. Определение первой ячейки архивирования:

    • Мы устанавливаем archiveCell равным M1.
  2. Проверка на пустоту:

    • Если M1 пусто, просто копируем значение из A2 в M1.
  3. Поиск первой пустой ячейки:

    • Если M1 не пусто, мы используем End(xlDown) для перехода к последней заполненной ячейке. Затем мы смещаемся вниз на одну ячейку.
    • Мы добавили условие для проверки, является ли следующая ячейка archiveCell пустой, и если она не пустая, используем цикл Do While для продвижения к следующей пустой ячейке.
  4. Копирование данных:

    • Мы копируем данные из A2 в первую пустую ячейку, найденную по вышеописанным методам.
  5. Установка режима вырезания в False:
    • Это просто очищает буфер обмена после выполнения операции.

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

Оцените материал
Добавить комментарий

Капча загружается...