Excel VBA:标识工作表中公式(或数据)的最后一行,复制该行,然后在其正下方粘贴一行

Excel VBA:标识工作表中公式(或数据)的最后一行,复制该行,然后在其正下方粘贴一行,excel,vba,Excel,Vba,我想确定表格上题为“定期贷款”的最后一行公式。然后我想复制所有这些公式并将它们粘贴到下面的一行。例如,如果公式的最后一行是第15行,我想复制第15行并将公式粘贴到第16行。在我下面的代码中,我在工作表(“定期贷款”).Range(工作表(“定期贷款”).Cells(lRow,1)).EntireRow.Copy行中遇到一个错误。请提供有关如何解决此问题的任何建议。错误为“应用程序定义或对象定义错误” 将lrow声明为Long后,您试图将其作为范围引用,这就是错误的来源。试试这个,我声明了一些其他

我想确定表格上题为“定期贷款”的最后一行公式。然后我想复制所有这些公式并将它们粘贴到下面的一行。例如,如果公式的最后一行是第15行,我想复制第15行并将公式粘贴到第16行。在我下面的代码中,我在
工作表(“定期贷款”).Range(工作表(“定期贷款”).Cells(lRow,1)).EntireRow.Copy
行中遇到一个错误。请提供有关如何解决此问题的任何建议。错误为“应用程序定义或对象定义错误”


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

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
您的错误是由

Worksheets("Term Loans").Range(Worksheets("Term Loans").Cells(lRow, 1))
当您将单个参数传递给
范围(…)
时,它将被解释为地址字符串。当该参数本身是一个范围时,(
工作表(“定期贷款”).Cells(在本例中为lRow,1)
)该范围的值将传递给
范围
(因此
…Cells(lRow,1)。value
为本例)

所以,除非
。单元格(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
您的错误是由

Worksheets("Term Loans").Range(Worksheets("Term Loans").Cells(lRow, 1))
当您将单个参数传递给
范围(…)
时,它将被解释为地址字符串。当该参数本身是一个范围时,(
工作表(“定期贷款”).Cells(在本例中为lRow,1)
)该范围的值将传递给
范围
(因此
…Cells(lRow,1)。value
为本例)

所以,除非
。单元格(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

Range(lRow)
类似于
Range(4)
,如果您查找任何参考或Excel帮助,您将看到它是无效语法。哦,我明白了。您知道如何编写代码将4转换为列号吗?将
工作表(“定期贷款”).Range(lRow)替换为
工作表(“定期贷款”).Range(工作表(“定期贷款”).Cells(lRow,1)).EntireRow.Copy
。。。请注意,1。我认为你关于特殊参数的语法也不正确;你可能想查一下,然后2。根据我的经验,最好不要使用复制和粘贴;您通常更愿意将目标行设置为与源行相等。@AlexM I将其替换为以下内容,但仍然收到一个错误
工作表(“定期贷款”).Range(工作表(“定期贷款”)).Cells(lRow,1).EntireRow.Copy
您的工作表附近缺少一个括号,但我可能把它放错了右括号place@AlexM请查看我的原始粘贴的更新。我得到一个对象定义的错误
Range(lRow)
类似于
Range(4)
,如果您查找任何参考或Excel帮助,您将看到它是无效语法。哦,我明白了。您知道如何编写代码将4转换为列号吗?将
工作表(“定期贷款”).Range(lRow)替换为
工作表(“定期贷款”).Range(工作表(“定期贷款”).Cells(lRow,1)).EntireRow.Copy
。。。请注意,1。我认为你关于特殊参数的语法也不正确;你可能想查一下,然后2。根据我的经验,最好不要使用复制和粘贴;您通常更愿意将目标行设置为与源行相等。@AlexM I将其替换为以下内容,但仍然收到一个错误
工作表(“定期贷款”).Range(工作表(“定期贷款”)).Cells(lRow,1).EntireRow.Copy
您的工作表附近缺少一个括号,但我可能把它放错了右括号place@AlexM请查看我的原始粘贴的更新。我正在定义一个对象error@BigBen接得好,我本想把它拿出来的。谢谢Edited@Miles费特:我用了你的代码,它只是将A1单元格铜化并粘贴到它下面的一个单元格中。你的意思是把语法改成A1以外的东西吗。如果有帮助,第2行为空。该表从第3行开始,如果您将其更改为
lRow=ws.Range(“A3”).CurrentRegion.Rows.Count,就像我刚才编辑的代码中的那样,这是否有效?当然,
currentRegion
会给你错误的
lRow
,如果在你的范围内有空格。编辑我非常感谢你的帮助。它似乎不起作用。它最终显示单元格A7周围的虚线框,即使表格在第9I行结束,因为您的表格从第3行开始,您可以在复制和粘贴
范围(“A”&lRow+2).复制范围(“A”&lRow+2).偏移量(1,0).粘贴特殊xlPasteAll
@BigBen good catch,我本想把它拿出来的。谢谢Edited@Miles费特:我用了你的代码,它只是将A1单元格铜化并粘贴到它下面的一个单元格中。你的意思是把语法改成A1以外的东西吗。如果有帮助,第2行为空。该表从第3行开始,如果您将其更改为
lRow=ws.Range(“A3”).CurrentRegion.Rows.Count,就像我刚才编辑的代码中的那样,这是否有效?当然,
currentRegion
会给你错误的
lRow
,如果在你的范围内有空格。编辑我非常感谢你的帮助。它似乎不起作用。它最终显示单元格A7周围的虚线框,即使表格结束于再次编辑的第9I行,