2015-02-05 88 views
-3

我正在将多列中列出的数据放入单列(A)中。如果B列中存在数据,则抓取该数据,将其粘贴在A列中数据的末尾,然后返回并删除现在为空的列B,该列将所有其他列移动到一列上,以便现在有数据存在B列,直到除了A列之外没有更多的数据列。我现在这样做的方式是通过列出下面的相同代码的多个块,其显然效率不高,代码早晚会打破。任何建议表示赞赏!循环将所有列移入一列

Range("B1").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Cut 
Range("A1").Select 
Selection.End(xlDown).Select 
ActiveCell.Offset(1, 0).Range("A1").Select 
ActiveSheet.Paste 
Selection.End(xlUp).Select 
ActiveCell.Offset(0, 1).Columns("A:A").EntireColumn.Select 
Selection.Delete Shift:=xlToLeft 
ActiveCell.Offset(0, -1).Range("A1").Select 
+2

尝试一下,然后返回循环代码。那我们可以帮忙。 – Sorceri 2015-02-05 20:51:43

+0

请[停止使用.select](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – Chrismas007 2015-02-05 20:56:50

+0

谢谢你参考上一篇文章@ Chrismas007讨论了使用范围和避免选择。这非常有用。 – Joseph 2015-02-05 22:36:19

回答

1

有一个非常简单的方法来做到这一点:

Sub MoveIt() 

Dim LastRow As Long 
Dim ws1 as Worksheet 

Set ws1 = Sheets("Name of Sheet") 

Do While (ws1.Range("B1").Value <> "") 
    LastRow = ws1.Range("A" & ws1.Rows.Count).End(xlUp).Row + 1 
    ws1.Range("B1:B" & ws1.Range("B" & ws1.Rows.Count).End(xlUp).Row).Copy 
    ws1.Range("A" & LastRow).PasteSpecial 
    ws1.Range("B1").EntireColumn.Delete xlToLeft 
Loop 

End Sub 
+0

如果这适用于您,请用绿色复选标记接受答案。 – Chrismas007 2015-02-05 21:02:43

+0

这很棒@ Chrismas007。谢谢您的意见。我知道像你这样的聪明人在各种论坛上都厌倦了像我这样的人在没有出现的问题上提出问题,我们试图做我们自己的研究,而且我也会这样做,但是在这种情况下,我不知道该去哪里甚至开始。感谢您的意见。 – Joseph 2015-02-05 22:30:17

1

我喜欢Christmas007的答案。我也想分享这个解决方案:

Sub MoveIt() 
Dim mysht As Worksheet 
Set mysht = ActiveSheet 
Set myrng = mysht.UsedRange 


nextrow = mysht.Cells(mysht.Rows.Count, 1).End(xlUp).Row 

For i = 2 To myrng.Columns.Count 

lastColrow = myrng.Cells(mysht.Rows.Count, i).End(xlUp).Row 
If lastColrow <> 1 Or myrng.Cells(1, i) <> "" Then 
    For j = 1 To lastColrow 
     nextrow = nextrow + 1 
     mysht.Cells(nextrow, 1) = myrng.Cells(j, i) 

    Next j 
End If 
Next i 

Range(myrng.Columns(2), myrng.Columns(myrng.Columns.Count)).Clear 


End Sub 

我喜欢它,因为它不使用复制,粘贴和删除功能。根据我的经验,如果您正在处理大型工作簿并且他们还要求激活工作表,则这些功能会导致宏拖动。