首页 > 解决方案 > 使用取决于活动行的偏移动态范围进行剪切和粘贴

问题描述

对 VBA 来说真的很新,所以请原谅我说/做的任何愚蠢的事情。到目前为止,这个网站对我的加速学习有很大的帮助。

我在 Excel 中有一组数据,需要使用 VBA 重新排列。我想从列 AF:AR 中获取(剪切)数据,并将其移动(粘贴)到插入原始行下方的新行中的列 J:V 中。每次我运行报表时,数据集的大小都不同,因此我从数据集的末尾开始接近它,并在电子表格中向上移动。数据集有标题,所以停在第2行。我目前的计划是移动到数据集的末尾,从最后一行剪切数据并将其粘贴到下面的行,在上面插入一个空白行,然后向上移动一行并重复,直到到达第 2 行。

这是我到目前为止所拥有的:

' Move to end of data.
Selection.End(xlDown).Select
' Repeat loop until top of data is reached..
Do Until ActiveCell.Row = 2
    ' Get row address of active cell.
    ActiveRow = ActiveCell.Row
    ' Cut and paste data to row below current row.
    Range(Cells(ActiveRow, "AF"), Cells(ActiveRow, "AR")).Cut Range("J" & ActiveRow).Offset(1, 0)
    ' Insert a blank row above.
    ActiveCell.Offset(-1, 0).Select
    ActiveCell.EntireRow.Insert Shift:=xlDown
    ' Move to next row of data up.
    ActiveCell.Offset(-1, 0).Select
Loop

运行时,我收到此错误

“运行时错误‘1004’:应用程序定义的或对象定义的错误。”

并调试指向以下行:

Range(Cells(ActiveRow, "AF"), Cells(ActiveRow, "AR")).Cut Range("J" & ActiveRow).Offset(1, 0)

我找不到任何关于在 .Cut 函数中使用带偏移的动态范围的信息,所以这可能是问题所在。我的语法有什么错误/遗漏,还是有更简单的方法来实现我的目标?

提前感谢您分享您的天才。

标签: excelvba

解决方案


这更干净,更快,但仍然有选择和激活荆棘。我可能会回去继续努力,但它现在有效。

'Define the range of remaining data.
Set rngData = ThisWorkbook.Worksheets("Sheet2").Range("A1")
Set rngData = rngData.CurrentRegion

' Move to end of data.
rngData.End(xlDown).Select
Do Until ActiveCell.Row = 1
    ' Get row address of active cell.
    ActiveRow = ActiveCell.Row
    ' Cut and paste OCC data to row below current row.
    Range(Cells(ActiveRow, "AF"), Cells(ActiveRow, "AR")).Cut Range("J" & (ActiveRow + 1))
    ' Insert a blank row above.
    ActiveCell.EntireRow.Insert Shift:=xlDown
    Selection.Offset(-1, 0).Select
' Repeat until top of data is reached.
Loop

' Delete unnecessary remaining column headers.
ThisWorkbook.Worksheets("Sheet2").Range("AF1:AR1").Clear

' Delete Unnecessary blank row #2.
Range("A2").EntireRow.Delete

推荐阅读