Мой код VBA "Вставить скопированные ячейки" продолжает падать? - PullRequest
0 голосов
/ 06 марта 2019

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

Это еженедельная задача, в которой я открываю новый лист, вставляю в него новую информацию, затем запускаю код, чтобы скопировать лист предыдущих недель и вставить скопированные ячейки в новый лист.

`ActiveSheet.Previous.Select
Range("A2:K2").Select
Range(Selection, Selection.End(xlDown)).Copy
ActiveSheet.Next.Select
ActiveSheet.Cells(2, 1).Select
Selection.Insert Shift:=xlDown`

По какой-то причине команда Selection.Insert Shift:=xlDown вылетает у меня в Excel. Я много читал о том, как решить эту проблему, но большинство решений вращаются вокруг запуска кода на одном листе. Но так как это новый лист каждую неделю, я не могу установить для него определенный релевантный лист. то есть я пытаюсь избежать использования Dim, Set и With для определения листа.

1 Ответ

1 голос
/ 07 марта 2019

Есть несколько причин, по которым Range.Insert может потерпеть неудачу, в зависимости от того, что находится на этом листе ... и невозможно понять почему, просто взглянув на этот фрагмент.

Нет никаких причин хотетьчтобы избежать объявления и использования переменных, хотя.Предполагая, что лист, который активен при запуске макроса (при условии, что Sub ... не слишком далеко над началом этого фрагмента), является пункт назначения лист ...

Dim destSheet As Worksheet
Set destSheet = ActiveSheet
Debug.Assert destSheet.Index > 1 ' if code breaks here, assumption was wrong

Dim sourceSheet As Worksheet
Set sourceSheet = destSheet.Previous

Dim sourceStart As Range
Set sourceStart = sourceSheet.Range("A2:K2")

sourceSheet.Range(sourceStart, sourceStart.End(xlDown)).Copy
destSheet.Range("A2:K2").Insert Shift:=xlDown

Есливышеприведенный код аналогичным образом завершается сбоем, тогда я бы предложил попытаться сделать ту же самую вещь вручную и посмотреть, дает ли Excel более подробное сообщение об ошибке, как это часто бывает, когда весь его API сообщает VBA «1004, ошибка, определяемая приложением».

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

sourceSheet.Range(sourceStart, sourceSheet.Range("A" & Rows.Count & ":K" & Rows.Count).End(xlUp)).Copy

Если на листе назначения есть ListObject, убедитесь, что вы не вставляете большестолбцы, чем таблица - если вы делаете это вручную, вы получите следующее сообщение:

enter image description here

Если вы делаете это программно, это все, что вы получите:

error 1004

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