【问题标题】:VBA to stack to several columns under the first twoVBA堆叠到前两列下的几列
【发布时间】:2016-09-15 07:58:00
【问题描述】:

我有几个工作簿,其中包含很多列(每次都有不同的列数)和很多行。我想将列范围内的所有值复制到 A 列和 B 列。这些值必须成对复制,并且可以包含空单元格甚至空行,也必须复制。

现在我有以下数据集的结构:

 A    B      C     D      E     F   .......
 red cat   black  dog   yellow fox  .......
 red cat   white  dog   yellow fox  .......
 grey cat  black  dog   yellow fox  .......
 ..........................................

连接后我的数据必须如下所示:

 A       B     
 red    cat   
 red    cat  
 grey   cat
 black  dog 
 white  dog
 black  dog
 yellow fox
 yellow fox
 yellow fox

我在 stackoverflow 上找到了 this post,它工作正常,但它不保留我的数据的原始成对顺序并跳过空单元格。我很难弄清楚如何根据我的问题调整这段代码。

此外,我找到了another solution 并尝试对其进行修改,但我在第 8 行收到消息“运行时错误 1004”。

这是我修改后的解决方案:

Sub MoveColumnsUnderAB()

Dim ws      As Worksheet
Dim lr      As Long
Dim lc      As Integer

Set ws = ThisWorkbook.Worksheets("Sheet1")

lc = ws.Range("XFD1").End(xlToLeft).column '' Find the last column

While lc <> 2 '' stop once it hits Column B

    lr = ws.Cells(1, lc).End(xlDown).Row '' Find the last row for this block of 2
    ws.Range(ws.Cells(1, lc).Offset(, -1), ws.Cells(lr, lc)).Copy ws.Range("A" & ws.Rows.Count).End(xlUp).Offset(1)

    ws.Range(ws.Cells(1, lc).Offset(, -1), ws.Cells(lr, lc)).ClearContents '' Clear it out
    lc = ws.Range("XFD1").End(xlToLeft).column '' Get the last column again for the While loop
Wend

End Sub

我将不胜感激。

【问题讨论】:

  • 您的列标题是否会在整个工作表中保持一致?至少对于您要保持成对的两列。
  • @Lowpar 是的,每一对的第一列调用“属性”,第二列调用“类别”

标签: excel concatenation vba


【解决方案1】:

代码效率有点低,因为我不在办公室。它应该可以工作,但是如果缺少列,这将是有问题的,因为成对和缺乏关于其他列可能是什么的知识。

Option Explicit

Sub MoveColumnsUnderAB()
Dim y, store, lc
Dim ws As Worksheet
Dim rng As Range

Set ws = ThisWorkbook.Worksheets("Sheet2")

lc = ws.Range("XFD1").End(xlToLeft).Column '' Find the last column
Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(1, lc))

For Each y In rng

If y = "Attribute" Or y = "Category" Or IsEmpty(y.Offset(1, 0)) And y.Offset(1, 0).End(xlDown).Row > ws.Range("A1").SpecialCells(xlCellTypeLastCell).Offset(1, 0).Row Then
Else
store = Left(y.Address, InStr(2, y.Address, "$") - 1)
store = Right(store, InStr(1, y.Address, "$"))
ws.Range(store & "2:" & store & ws.Range("A1").SpecialCells(xlCellTypeLastCell).Row).Select
Range(Selection, Selection.Offset(0, 1)).Select
Selection.Cut
ws.Range("A" & ws.Range("A1").SpecialCells(xlCellTypeLastCell).Offset(1, 0).Row).End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
End If
Next y
End Sub

【讨论】:

  • 非常感谢您的帮助。不幸的是,该代码不适用于我的数据或我上面描述的简单示例。这很奇怪,但我没有收到任何错误消息。
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多