Excel宏列拆分

时间:2011-10-24 21:45:49

标签: excel vba

寻找有关宏的帮助,以便在更多行上获取数据块,并将它们放入列中。

我附上了一张照片来描绘这个。所有数据块将由图中的第一列1或2确定。我只是想将块2向上移动并且在1.旁边。我遇到的唯一问题是对于每个块,列数是可变的。

编辑:图片链接包含嵌入式未显示:enter link description here

enter image 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

1 个答案:

答案 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

我没有对此进行测试,因此您可能需要进行一些调试......但现在它在逻辑上是正确的。