如何在excel中获得一个函数,将多行排列的数据堆叠到另一个工作表的单个列中

如何在excel中获得一个函数,将多行排列的数据堆叠到另一个工作表的单个列中,excel,vba,loops,for-loop,Excel,Vba,Loops,For Loop,我一直在尝试将当前按行排列的大量数据拉到excel中的单独工作表中,并将其堆叠到单个列中,以便我可以上传到microstrategy进行分析。 理想情况下我想要 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脚本来实现这一点,可以很容易地修改和应用到其他工作表。我也不希望复制和粘贴值,而是希望有指

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

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,但似乎无法达到预期的结果。我觉得这并不是难以置信的困难,但到目前为止,制定正确的循环一直在逃避我。任何帮助都将不胜感激。谢谢

您不需要VBA。你只需点击几下就可以做到。这样做:

选择数据范围 转到“数据”选项卡,然后单击“从表/范围” 好的,范围 在打开的新窗口中,选择所有列 转到“变换”选项卡 单击取消打印列 返回“主页”选项卡,然后单击“关闭并加载”
看看这是否适合您:

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

假设这段代码可以工作,那么对于较大的数据集,这段代码可能需要一段时间。将输入范围读入二维数组,将值堆叠在内存中,然后在一次操作中将堆叠的值写回工作表,效率会高得多,但这不会在重新计算时保留任何链接/更新。

您是否尝试通过VB复制数据,而不是设置公式?像“Sheet2.Cells1+ii,1=Sheet1.Cellsr,c”一样,将表1和表2作为工作表,r代表行,c代表列?我们可以假设1行中的值之间没有空格,2没有空行,和3所有信息从A列开始,每行都有数据?@Salek是的,这是一个选项,但如queston中所述,理想情况下,我希望有链接。@Taelsin 1是的,行中的值之间没有空格,但我不知道这会如何影响脚本2没有空行Sagain不知道这会有什么影响3Info从Column H开始,但可以通过更改脚本中的I值轻松地进行调整above@Cormac当做chillin在回答中建议的更有效的解决方案时,它们主要用于停止条件。如果数据只在行和列的末尾用空格很好地压缩,那么您可以使用空单元格作为信号来移动到下一行。这是哪个Excel版本?@pnuts您的正确朋友-但是OP要求创建一个VBA脚本来实现this@sam是的,我不需要使用VBA,但这样做将是相当劳动密集型的这项任务将定期重复,我正在处理数百行规模的数据集,因此,我越能自动化流程,效果越好