【问题标题】:How do I get a function in excel to stack data arranged across in several rows to stack in a single coloumn on another worksheet如何在excel中获得一个函数来堆叠排列在多行中的数据以堆叠在另一个工作表上的单个列中
【发布时间】:2018-01-10 21:24:57
【问题描述】:

我一直在尝试将当前按行排列的大量数据提取到 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 的堆栈,但似乎无法达到预期的结果。我觉得这并不是非常困难,但到目前为止,我已经避开了制定正确的循环。任何帮助将不胜感激。谢谢

【问题讨论】:

  • 你不是尝试通过VB复制数据,而不是设置公式吗?像 'Sheet2.Cells(1 +ii, 1) = Sheet1.Cells(r,c)' 将表格 1 和 2 作为工作表,r 代表行,c 代表列?
  • 我们能否假设 (1) 行内的值之间没有空格,(2) 没有空行,以及 (3) 对于每行包含数据的所有信息,所有信息都从 A 列开始?
  • @Salek 是的,这是一种选择,但正如问题中所述,理想情况下我希望链接存在。
  • @Taelsin (1) 是的,行中的值之间没有空格(但我不知道这会如何影响脚本)(2)没有空行(再次看不到什么承担这将有)(3)信息从列 H 开始,但可以通过更改上面脚本中的 I 值轻松调整
  • @Cormac 在执行 chilin 在他的回答中建议的更有效解决方案时,它们主要用于停止条件。如果数据打包得很好(仅在行和列的末尾有空格),那么您可以使用空单元格作为移动到下一行的信号。

标签: excel vba loops for-loop


【解决方案1】:

看看这是否适合你:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 那是哪个 Excel 版本?
    • @pnuts 你的正确朋友 - 但 OP 要求创建一个 VBA 脚本来实现这一目标
    • @sam 是的,我“不需要”使用 VBA,但这样做会非常耗费人力,因为这项任务会定期重复,而且我正在处理规模为数百行,所以我越能自动化流程越好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多