我一直在尝试将当前按行排列的大量数据提取到 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。您只需单击几下即可完成。这样做:
- 选择数据范围
- 转到"数据"选项卡,然后单击"从表/范围">
- 确定范围
- 在打开的新窗口中,选择所有列
- 转到"转换"选项卡
- 点击取消数据透视列
- 返回主页选项卡,然后单击关闭并加载