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