Excel VBA - установка диапазона формулы для одной строки в пустой многострочный диапазон, относительные ссылки пропускают строки - PullRequest
0 голосов
/ 05 февраля 2020

Excel VBA - Задание диапазона относительной формулы в одной строке для пустого диапазона из нескольких строк, относительные ссылки пропускают строки

Я пытаюсь создать макрос для пользователей шаблона книги Excel, чтобы:

1) добавить строки в именованный диапазон,

2) переместить последнюю запись в этом именованном диапазоне в верхнюю строку в этом диапазоне новых строк (чтобы сохранить границы именованного диапазона и сохраните порядок любых записей, введенных пользователем), и

3) заполните эти новые строки формулой из главной строки.

Я застрял, когда установлены формулы главной строки для этого диапазона нескольких пустых строк относительные ссылки (после первой строки) пропускают строку. Например, если первая строка в этом диапазоне, скажем, строка 16, то:

Строка 16 имеет ссылку на формулу для A16,

В строке 17 эта ссылка установлена ​​на A18,

В строке 18 для этой ссылки установлено значение A20 и т. Д. c.

Ниже приведена подпрограмма, предназначенная для выполнения этой задачи:

Option Explicit

Public Sub AddRows( _
    ByRef rrngInputFields As Range, _
    ByRef rrngMasterRow As Range, _
    ByVal intRowsToAdd As Long)
    'Add rows to worksheet
        'rrngInputFields is the named range that defines user input fields
        'rrngMasterRow is the row that contains template formula
        'intRowsToAdd is the number of rows to add, determined by the user

    Dim rngRefRow                       As Range

    Dim rngLastRecordOldRow             As Range
    Dim intLastRecordNewNo              As Integer

    Dim rngNewRows                      As Range
    Dim rngLastRecordNewRow             As Range
    Dim intCountCol                     As Integer

    'Set the last user record in the user input range
        'New rows will be added above this to preserve the range
    Set rngRefRow _
        = rrngInputFields.Cells(rrngInputFields.Rows.Count, 1).EntireRow

    'Set the last user record to later be moved to the top of the added rows
        'This will maintain the order the user input their data
    Set rngLastRecordOldRow = rngRefRow
    intLastRecordNewNo = rngRefRow.Row

    'Add the new rows
    rngRefRow.Resize(intRowsToAdd).Insert

    intCountCol = rrngMasterRow.Columns.Count

    'Set the range of new rows that will receive the template formula and formatting
    Set rngNewRows _
        = ActiveSheet.Range(Cells(intLastRecordNewNo + 1, 1), _
        Cells(intLastRecordNewNo + intRowsToAdd, intCountCol))

    'Set the row to move the last user input record
    Set rngLastRecordNewRow = ActiveSheet.Rows(intLastRecordNewNo)

    'Move the last user record to the bottom of the existing records
    rngLastRecordNewRow.FormulaR1C1 = rngLastRecordOldRow.FormulaR1C1

    'Copy the master row, including all formulas and formatting, to the added rows
    rngNewRows.FormulaR1C1 = rrngMasterRow.FormulaR1C1

End Sub

В последней строке указывается, где проблема возникает сама по себе.

Что может вызвать этот пропуск в относительной ссылке?

1 Ответ

0 голосов
/ 23 февраля 2020

Это связано с эффектом range.range, описанным в комментариях здесь . Решение состоит в том, чтобы использовать range.copy метод, подобный этому

'rngNewRows.FormulaR1C1 = rrngMasterRow.FormulaR1C1
rrngMasterRow.Copy rngNewRows
...