如何通过将列移到行来操作数据集

时间:2019-06-21 13:33:21

标签: excel

我希望使用excel(VBA或Power Query)来修改我的数据集并移动列,以便将它们显示为行。

(道歉,我是新来的,而且表格并没有我希望的那么好)


我正在使用销售数据,目前其格式如下:

(最终目标是在Access数据库中使用它并将其链接到数据透视表)

类别|细分|品牌| SKU#|数据源| 201901 | 201902 | 201903 | ...

脸部|洁面乳|斧头12345 | $数量| $ 5 | $ 10 | $ 16 | ...

脸部|乳液鸽子| 54321 | $数量| $ 14 | $ 25 | $ 13 | ...


我想将其移动到的格式是:

类别|细分|品牌| SKU#|数据源|年份值

脸部|洁面乳|斧头12345 | $数量| 201901 | $ 5

脸部|洁面乳|斧头12345 | $数量| 201902 | $ 10

脸部|洁面乳|斧头12345 | $数量| 201903 | $ 16

脸部|乳液鸽子| 54321 | $数量| 201901 | $ 14

脸部|乳液鸽子| 54321 | $数量| 201902 | $ 25

脸部|乳液鸽子| 54321 | $数量| 201903 | $ 13


有4个不同的数据源,但是它们的格式完全相同。 如果您认为方便的话,我还可以将“类别”,“细分”和“品牌”分解为一个查找表。

我打算用VBA编写一些代码,并首先列出代码需要完成的所有工作。然后,我写了几行,很快就中断了,开始寻找替代解决方案(即电源查询)。我认为最好的方法是转置数据,但是每种产品上的说明都与其余数据不符。任何有关实现此目标的资源或方向将不胜感激。


这是到目前为止我尝试过的事情: 在VBA中,我基本上将计数保存为变量:

Set ws = ThisWorkbook.Worksheets("Source")
totalRows = ws.Range("A1").CurrentRegion.Rows.Count
RelColumns = ws.Range("A1").CurrentRegion.Columns.Count - 7 'There are 7 columns outside the data which are constant (The Cat/Segment/Brand/Sku/datasource)

^过去,我正在计划嵌套循环以引用该值,然后将所有内容复制到新工作表中。我的想法是这样的:

For i = 2 to TotalRows 'Gets each SKU and data source within that SKU
    For j = 1 to RelColumns 'Does each value (year) that needs to be brought across
        ...
    Next
Next

我不确定下一步该怎么做,因为我找不到一种方法来复制这些单元格并从每个单元格中获得适当的价值(我没有为此做任何代码,只是集思广益)。宁愿继续撞墙,我试图从另一个方向去解决这个问题:

我将数据导入Excel,并将其格式化为表格。将其带入强大的查询编辑器中,我已经使用转置功能处理了“转换”选项卡。但是,删除了年份(因为它们是列标题),并且每种产品的描述都移到了表的顶部(考虑到转置的工作原理,这是预期的)。我可以轻松地手动输入年份,但是对于如何正确地还原描述感到困惑。每个人都需要复制到与当前列数一样多的行中,而这样做的方法使我难以理解。我可以编写VBA或Python,但是在使用它的地方迷路了。

2 个答案:

答案 0 :(得分:0)

我用它来将一列重写为一行,并写了一些评论来帮助您关注。

Private Sub ColumnToRow()

    'This program will work by initially selecting the first cell in the column you wish to replicate
    Dim targetRange As Range
    Set targetRange = Cells(305, 3) 'Replace 3, 305 to whatever cell you want to begin writing to. the 3 is column C just convert the letter to corresponding number
    Do While Selection.Value <> ""
        targetRange.Value = Selection.Value
        Set targetRange = targetRange.Offset(0, 1) 'move over one column
        Selection.Offset(1, 0).Select 'move selection to next row
    Loop
End Sub

答案 1 :(得分:0)

以防万一有人偶然发现此问题,我前一阵子解决了这个问题,并认为我会分享在这里使用的方法:

首先,我获取了所有数据并将其加载到Access数据库中。 然后,在VBA中使用ADODB,我遍历了所有年份,并查询了数据的第一部分和年份,并选择了一个列,该列的值就是该年份。

将所有内容都写到工作表上,每年都比上次要少,

希望这对遇到相同问题的人有所帮助