Вопрос или проблема
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
Объяснение кода:
-
Определение первой ячейки архивирования:
- Мы устанавливаем
archiveCell
равнымM1
.
- Мы устанавливаем
-
Проверка на пустоту:
- Если
M1
пусто, просто копируем значение изA2
вM1
.
- Если
-
Поиск первой пустой ячейки:
- Если
M1
не пусто, мы используемEnd(xlDown)
для перехода к последней заполненной ячейке. Затем мы смещаемся вниз на одну ячейку. - Мы добавили условие для проверки, является ли следующая ячейка
archiveCell
пустой, и если она не пустая, используем циклDo While
для продвижения к следующей пустой ячейке.
- Если
-
Копирование данных:
- Мы копируем данные из
A2
в первую пустую ячейку, найденную по вышеописанным методам.
- Мы копируем данные из
- Установка режима вырезания в False:
- Это просто очищает буфер обмена после выполнения операции.
Таким образом, этот код будет работать даже в случае, если лист архивирования пуст или содержит менее двух строк данных, избегая ошибок времени выполнения.