VBA: определить последнюю строку формул (или данных) на листе, скопировать эту строку, а затем вставить одну строку прямо под ней - PullRequest
0 голосов
/ 19 сентября 2019

Я хотел бы указать последний ряд формул на листе под названием «Срочные кредиты».Затем я хотел бы скопировать все эти формулы и вставить их на одну строку ниже.Например, если последняя строка с формулами - это строка 15, я хотел бы скопировать строку 15 и вставить формулы в строку 16. В моем коде ниже я получаю сообщение об ошибке Worksheets("Term Loans").Range(Worksheets("Term Loans").Cells(lRow, 1)).EntireRow.Copy. Любой совет, как исправитьэто будет высоко ценится.Ошибка «Ошибка приложения или объекта»


Dim lRow As Long

Sheets("Term Loans").Select

    'Find the last non-blank cell in column A(1)
    lRow = Cells(Rows.Count, 1).End(xlUp).Row


        ' Now Copy the range:
        Worksheets("Term Loans").Range(Worksheets("Term Loans").Cells(lRow, 1)).EntireRow.Copy
        ' And paste to first empty row
        Worksheets("Term Loans").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulas
        Application.CutCopyMode = False

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Ваша ошибка вызвана

Worksheets("Term Loans").Range(Worksheets("Term Loans").Cells(lRow, 1))

Когда вы передаете один параметр в Range(...), он интерпретируется как строка адреса.Когда этот параметр является самим диапазоном, (Worksheets("Term Loans").Cells(lRow, 1) в этом случае) значение этого диапазона передается в Range (таким образом, ... .Cells(lRow, 1).Value в этом случае)

Итак,если ... .Cells(lRow, 1).Value не вернет действительный адрес в стиле A1 (или имя именованного диапазона), вы получите сообщение об ошибке.

Вот как правильно ссылаться на диапазон

Sub Demo
    Dim lRow As Long
    Dim ws As Worksheet

    Set ws = Sheets("Term Loans")

    'Find the last non-blank cell in column A(1)
    lRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' Now Copy the range:
    ws.Cells(lRow, 1).EntireRow.Copy
    ' And paste to first empty row
    ws.Cells(ws.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulas
    Application.CutCopyMode = False

End Sub

Иулучшенная версия

Sub Demo2
    Dim wb as Workbook
    Dim ws As Worksheet
    Dim rng as Range 

    Set wb = Thisworkbook 'or Activeworkbook, or some other book you specify
    Set ws = wb.Worksheets("Term Loans")
    With ws
        'Find the last non-blank cell in column A(1)
        Set rng = .Cells(.Rows.Count, 1).End(xlUp).EntireRow
    End With 

    ' Now Copy the range:
    rng.Copy
    ' And paste to first empty row
    rng.Offset(1, 0).PasteSpecial xlPasteFormulas
    Application.CutCopyMode = False

    ' To set a specific cell in the new row to a value
    Dim MyVal as Long
    MyVal = 42
    rng.Offset(1, 0).Cells(1, 3) = MyVal
End Sub
0 голосов
/ 20 сентября 2019

Вы пытаетесь сослаться на lrow как диапазон после объявления его как Long, и именно отсюда исходит ошибка.Попробуйте вместо этого, я объявил некоторые другие переменные, чтобы сделать код более простым.Надеюсь, это поможет:

Sub copypaste1rowdown()

    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim lRow As Long
    lRow = ws.Range("A3:Q3").CurrentRegion.Rows.Count

    Dim lCol As Long
    lCol = ws.Range("A3:Q3").CurrentRegion.Columns.Count

    Dim i As Long

    For i = 1 To lCol
        Cells(lRow + 2, i).Copy
        Cells(lRow + 2, i).Offset(1, 0).PasteSpecial xlPasteAll
    Next i

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