【问题标题】:VBA copy range to last row & paste on new sheet, first empty row after cell A19VBA将范围复制到最后一行并粘贴到新工作表上,单元格A19之后的第一个空行
【发布时间】:2021-02-24 05:09:35
【问题描述】:

我正在尝试将范围 A6:L 复制到工作表“步骤 1”中的最后一行。 然后粘贴到工作表“Vendor_Copy”上,但粘贴在 A19 之后的第一个空行上。

这就是我所拥有的,除了粘贴在正确的位置之外,它什么都做。它从 A1 开始粘贴,这是一个空白单元格。但是,即使我用数字 1 填充 1 - 19 的所有行,它仍然会粘贴到工作表“Vendor_Copy”的 A1 中。

感谢您的帮助!

Dim sht1 As Worksheet
Dim sht2 As Worksheet
Dim lr As Long
    
Set sht1 = Worksheets("Step 1")
Set sht2 = Worksheets("Vendor_Copy")

lr = sht2.Range("A19").End(xlDown).Row

sht1.Activate
Range("A6").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
    
sht2.Activate
Cells(lastrow + 1, 1).PasteSpecial

【问题讨论】:

  • sht2.Cells(Rows.Count, "A").End(xlUp).Offset(1,0).PasteSpecial
  • 避免使用xlDown 来查找最后一行。您可能希望看到THIS 同样避免使用xlToRight 来查找最后一列。

标签: excel vba


【解决方案1】:

不要使用Selection 对象。它意味着作为屏幕和 VBA 之间的接口。相反,请使用 Range 对象,它可以让您直接处理工作表。

Sheet2 上您希望处理的行是下一个空闲行,但不小于 19。在 Excel 术语中,这是 MAX() 函数的结果,包含在下面的代码中。

Dim Sht1    As Worksheet
Dim Sht2    As Worksheet
Dim Rng     As Range
Dim Cl      As Long                     ' Column: last used
Dim Rt      As Long                     ' Row: target
    
Set Sht1 = Worksheets("Step 1")
Set Sht2 = Worksheets("Vendor_Copy")

With Sht1
    Cl = .Cells(6, .Columns.Count).End(xlToLeft).Column
    Set Rng = .Range(.Cells(6, "A"), .Cells(.Rows.Count, "A").End(xlUp)).Resize(, Cl)
End With

With Sht2
    ' Columns(1) = Columns("A")
    Rt = WorksheetFunction.Max(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 19)
    Rng.Copy Destination:=.Cells(Rt, 1)
End With

请注意,Cells(6, 1).End(xlDown).Row - 或 Range("A6").End(xlDown).Row 将为您提供 A6 下方最后使用的单元格的地址,后面跟一个空格。 Cells(Rows.Count, 1).End(xlUp).Row 将为您提供从工作表底部看的 A 列中第一个使用的单元格 (Rows.Count)。不同之处在于,从上往下看,下一个空白可能不是该列中最后使用的单元格。 Cells(6, 1).End(xlToRight).ColumnCells(6, Columns.Count).End(xlToLeft).Column 之间的区别相同。从左到右查看您会找到最后使用的列。从右向左看,你会发现第一个空白。

【讨论】:

  • @Siddarth Rout 哈哈。这是 MS 的方式:让事情变得更容易,直到任务不再可识别并因此无法解决。如果您再次阅读我的代码,您会发现我在某些方面遵循了您的建议,但并非始终如一。很难达到正确的平衡。但是 OP 很可能会感谢您的指点。
【解决方案2】:

试试这个:

Dim sht1 As Worksheet
Dim sht2 As Worksheet
dim rng As Range
    
Set sht1 = Worksheets("Step 1")
Set sht2 = Worksheets("Vendor_Copy")

with sht1
    Set rng = .Range("A6", .Range("A6").End(xlDown))
    Set rng = .Range(rng, rng.End(xlToRight))
end with

rng.copy
    
sht2.Cells(Rows.Count, "A").End(xlUp).Offset(1,0).PasteSpecial

另请参阅:How to avoid using Select in Excel VBA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多