Вставка Excel VBA завершается неудачно после удаления строк на листе - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь создать простую вспомогательную функцию для копирования и вставки произвольного числа строк в заданную таблицу.

Public Sub insertRows(tgtWorksheet As String, R As Integer, NumRows As Integer)
    'Statements added for error checking'
    Debug.Print ("Inserting " & NumRows & " rows in '" & tgtWorksheet & "' by copying row " & insertRow)
    copyRng = Worksheets(tgtWorksheet).Rows(insertRow).EntireRow
    pasteRng = Range(Worksheets(tgtWorksheet).Cells(insertRow, 1), Worksheets(tgtWorksheet).Cells(insertRow + NumRows - 1, 1)).EntireRow
    'End statements added for error checking'

    Worksheets(tgtWorksheet).Rows(insertRow).EntireRow.Copy
    Range(Worksheets(tgtWorksheet).Cells(insertRow, 1), Worksheets(tgtWorksheet).Cells(insertRow + NumRows - 1, 1)).EntireRow.Insert Shift:=xlDown
End Sub

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

Проблема заключается в том, что, после того, как я успешно запустил это, а затем я удаляю строки из целевой таблицы, которые имеют тот же номер строки, что и цель для моей вставки, при попытке запустить функцию снова я получаю Run-time error '-2147417848 (80010108) Method 'Insert of object 'Range' failed

Когда я опрашиваю два диапазона ActiveWorkbook.Worksheets(tgtWorksheet).Rows(R).EntireRow и Range(ActiveWorkbook.Worksheets(tgtWorksheet).Cells(R, 1),ActiveWorkbook.Worksheets(tgtWorksheet).Cells(R + NumRows - 1, 1)).EntireRow

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

Я не использую фильтры или сводные таблицыв моем tgtWorksheet.Каким-то образом это действие удаления сбивает с толку макрос.

Как я могу устранить эту проблему?


Редактировать - Подробное отслеживание ошибок

Некоторая дополнительная информация здесь:

Вызывающая функция загрузки базы данных вызывает insertRows со строкой:

Call insertRows(tgtWorksheet, insertRow, NumRows)

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

immediate/locals 1

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

В какой-то момент мне вставили достаточно данных, чтобы моей первой пустой строкой была строка 50. Если я перейду к таблице tgtworksheet и удалю строку 50, а затемзапустите его снова, я получаю сообщение об ошибке.(Обратите внимание, что в этом случае строка 51 является элементом за элементом точно так же, как строка 50. Она также элементом за элементом точно такая же строка, что и строка 44 в начальном прогоне выше. У меня есть некоторое неизвестное количество пустых строк шаблона внизумоих данных, и я использую функцию insertRows, чтобы удостовериться, что достаточно строк-разделителей).

enter image description here

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

enter image description here

1 Ответ

0 голосов
/ 01 марта 2019

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

Код, который сейчас работает для меня:

Public Sub insertRows(tgtWorksheet As String, insertRow As Integer, numRows As Integer)
    With Worksheets(tgtWorksheet)
        .Unprotect
        .Rows(insertRow).Copy
        .Range(insertRow + 1 & ":" & insertRow + numRows).Insert (xlDown)
    End With
    Application.CutCopyMode = False
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...