如何在 excel 中获取一个函数来堆叠排列在几行中的数据,以在另一个工作表上的单个列中堆叠



我一直在尝试将当前按行排列的大量数据提取到 excel 中的单独工作表中,并将其堆叠到单个列中,以便我可以上传到微策略进行分析。 理想情况下,我想要

a1  b1  c1  d1  
a2  b2  c2  d2  
a3  b3  c3  d3  

成为

a1
b1
c1
d1
a2
b2
c2
d2
a3
b3
c3
d3

我有一些相当大的数据集,需要定期执行此操作,因此希望创建一个VBA脚本来实现此目的,该脚本可以轻松修改并应用于其他工作表。我也不想复制和粘贴值,而是链接到其他工作表,因此当源更新时,目标也是如此。我已经设法得到 a1 b1 c1 d1 使用以下代码

Sub test()
Dim i As Integer, ii As Integer
Dim ws As Worksheet
Set ws = Worksheets("sheet2") 
For i = 1 To 4
ws.Cells(1 +ii, 1).FormulaR1C1 = "='Sheet1'!R1C" & i
ii = ii + 1
Next
End Sub

当尝试制定一个循环来考虑行的变化时,我的问题出现了。到目前为止,我的尝试被证明是徒劳和令人沮丧的;我已经设法获得了 a1 b2 c3 的对角线或一堆 a1 b2 a3 b4 a5 b6,但似乎无法达到预期的结果。我觉得这并不难,但到目前为止,制定正确的循环一直逃避着我。任何帮助将不胜感激。谢谢

看看这是否适合你:

Option Explicit
Sub test()
With thisworkbook
' The first cell to stack downward from (will include the cell you specify), plus sheet name.'
Dim OutputSheetRange as range
Set OutputSheetRange = .worksheets("Sheet2").range("A1")
' Change this to the worksheet containing the cells that need to be stacked.'
With .Worksheets("Sheet1")
Dim FormulaPrefix as string
FormulaPrefix = "='" & .name & "'!"
' Code assumes range below, but change to whatever you need.'
With .range("A1:D4")
Dim RowCount as long
RowCount = .rows.count
Dim ColumnCount as long
ColumnCount = .columns.count
Dim ColumnIndex as long
Dim RowIndex as long
Dim OutputIndex as long
OutputIndex = 0

For ColumnIndex = 1 to ColumnCount
For RowIndex = 1 to RowCount
OutputSheetRange.offset(OutputIndex,0).formula = FormulaPrefix & .cells(rowindex,columnindex).address
OutputIndex = OutputIndex + 1
Next RowIndex
Next Columnindex
End With
End with
End Sub

对于较大的数据集,此代码可能需要一段时间(假设它有效)。将输入范围读取到二维数组中,将值堆叠在内存中,然后在单个操作中将堆叠值写回工作表会更有效 - 但这不会在重新计算时保留任何链接/更新。

你不需要VBA。您只需单击几下即可完成。这样做:

  1. 选择数据范围
  2. 转到"数据"选项卡,然后单击"从表/范围">
  3. 确定范围
  4. 在打开的新窗口中,选择所有列
  5. 转到"转换"选项卡
  6. 点击取消数据透视列
  7. 返回主页选项卡,然后单击关闭并加载

最新更新