【问题标题】:Stack multiple columns into two colums in pairs of two将多列堆叠成两列,两两成对
【发布时间】:2012-03-08 06:49:47
【问题描述】:

我的列A:ALC 填充了数据,并且每列有不同数量的行。如果可能的话,我需要一个宏,它将成对地堆叠列。例如,列C 直接在列A 下,列D 直接在列B 下,等等所有列A:ALC

        COLUMN A    COLUMN B          COLUMN C      COLUMN D
ROW 1   2598        F800              2599          F800
ROW 2   2598        K1300             2599          K1300
ROW 3   2598        S1000RR           2599          R900
ROW 4   2598        G650              2599          G650
ROW 5   2598        R1200             2599          K1600
ROW 6   2599        S1000
ROW 7   2599        HP2
ROW 8   2599        R1200

每对列的数据量相同(例如,列 AB 有 8 行,列 CD 有 5 行,等等),但行数,显然,在多对列之间有所不同。数据中没有空白。

当我运行宏时,你给 Excel 显示了这个:

运行时错误“13”:类型不匹配

可能是什么问题?

注意:有些列只有一对数据,即只有第一行的数据。

这是我需要的输出:

       COLUMN A    COLUMN B          
ROW 1   2598        F800              
ROW 2   2598        K1300             
ROW 3   2598        S1000RR 
ROW 4   2598        G650              
ROW 5   2598        R1200             
ROW 6   2599        S1000
ROW 7   2599        HP2
ROW 8   2599        R1200
ROW 9   2599        F800
ROW 10  2599        K1300
ROW 11  2599        R900
ROW 12  2599        G650
ROW 13  2599        K1600

【问题讨论】:

  • 能否请您显示将输出的内容??
  • 我添加了输出...希望能有所帮助
  • 哎呀...对不起。我一定是不小心留下了“大写锁定”。不要对我大喊大叫。 :)
  • 输出的例子是否更清楚了?我仍然在使用 brettdj 的宏时遇到问题。任何帮助将不胜感激。谢谢。

标签: excel vba


【解决方案1】:

如果 A:ALC 中的数据范围已满,则此变量数组代码将很快在 A 列和 B 列中形成您的新范围

请注意,如果遇到空白或单个单元格列,则代码将失败,因为无法创建变体数组。如果是这种情况,那么我将需要添加范围测试,所以请指教。

[更新为处理空白范围和/或单个单元格]

Sub Combine()
Dim OrigA
Dim OrigB
Dim strA As String
Dim strB As String
Dim strDelim As String
Dim lngCol As Long

strDelim = "||"
strA = Join(Application.Transpose(Range([a1], Cells(Rows.Count, "A").End(xlUp))), strDelim)
strB = Join(Application.Transpose(Range([b1], Cells(Rows.Count, "b").End(xlUp))), strDelim)

For lngCol = Columns("C").Column To Columns("ALC").Column - 2 Step 2
    If Application.CountA(Columns(lngCol)) > 1 Then
    'handle odd column range
        strA = strA & (strDelim & Join(Application.Transpose(Range(Cells(1, lngCol), Cells(Rows.Count, lngCol).End(xlUp))), strDelim))
    Else
    'handle odd column single cell
        If Len(Cells(1, lngCol)) > 0 Then strA = strA & (strDelim & Cells(1, lngCol).Value)
    End If
      If Application.CountA(Columns(lngCol + 1)) > 1 Then
      'handle even column range
    strB = strB & (strDelim & Join(Application.Transpose(Range(Cells(1, lngCol + 1), Cells(Rows.Count, lngCol + 1).End(xlUp))), strDelim))
    Else
     'handle even column single cell
    If Len(Cells(1, lngCol + 1)) > 0 Then strB = strB & (strDelim & Cells(1, lngCol + 1).Value)
    End If
Next

OrigA = Application.Transpose(Split(strA, strDelim))
OrigB = Application.Transpose(Split(strB, strDelim))

[a1].Resize(UBound(OrigA, 1), 1) = OrigA
[b1].Resize(UBound(OrigB, 1), 1) = OrigB

End Sub

【讨论】:

  • 当我运行你给 Excel 的宏时显示:运行时错误'13':类型不匹配
  • 我认为它需要“范围测试”,正如你所说。此外,如果列数发生变化,例如从“A:ALC”到“A:AMD”,然后我会简单地将For行中的(“ALC”)更改为(“AMD”),还是还有更多?感谢您的帮助。
  • @user1256390 1) 你有没有看到我对单个单元格或空白范围的警告 - 你有这些吗?我会更新。 2) 您的 AMD 查询的答案是肯定的。
  • 哎呀...我不认为我做到了,但显然我错了,因为这就是阻碍我的原因——单细胞。你的宏很好用!非常感谢!
  • @user1256390 没有问题。请看How does accepting an answer work?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多