寻找有关宏的帮助,以便在更多行上获取数据块,并将它们放入列中。
我附上了一张照片来描绘这个。所有数据块将由图中的第一列1或2确定。我只是想将块2向上移动并且在1.旁边。我遇到的唯一问题是对于每个块,列数是可变的。
编辑:图片链接包含嵌入式未显示:enter link description here
这会相对接近吗?
Sub macro()
Dim wav_name As String
Range("A1").Select
Do While ActiveCell.Value <> ""
ActiveCell.Offset(0, 2).Select
wav_name = ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Do
If ActiveCell.Value = wav_name Then
ActiveCell.Offset(1, 0).Select
Else
Exit Do
End If
Loop
Range(ActiveCell.Offset(0, -2), ActiveCell.End(xlDown)).Select
Selection.Cut
ActiveCell.End(xlUp).Offset(0, 3).Select
ActiveSheet.Paste
Loop
Range("A1").Select
End Sub
答案 0 :(得分:1)
你所拥有的东西非常适用于一个关键的例外。
您的剪切选择仅抓取第一行数据。您需要将其更改为
Range(ActiveCell).Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
要处理可变数量的列,您可以通过添加一个varabile(即LastCol)并将以下代码放入Do循环来捕获第一部分中的最后一列
LastCol = Activecell.End(xlToRight).Column
然后用您的变量
替换上一个偏移语句中的3请注意,如果您需要提高代码的性能,可以重构代码以删除许多select语句(包括我上面提到的语句),但是您编写的内容对您有用。
编辑:这是您的最终代码的样子
Sub macro()
Dim wav_name As String
Dim LastCol as Long
Range("A1").Select
Do While ActiveCell.Value <> ""
ActiveCell.Offset(0, 2).Select
wav_name = ActiveCell.Value
ActiveCell.Offset(1, 0).Select
LastCol = Activecell.End(xlToRight).Column
Do
If ActiveCell.Value = wav_name Then
ActiveCell.Offset(1, 0).Select
Else
Exit Do
End If
Loop
Range(ActiveCell.Offset(0, -2), ActiveCell.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Cut
ActiveCell.End(xlUp).Offset(0, LastCol +1).Select
ActiveSheet.Paste
Loop
Range("A1").Select
End Sub
我没有对此进行测试,因此您可能需要进行一些调试......但现在它在逻辑上是正确的。