将列转置到新列中并相应地维护/重复行

为尴尬的标题道歉。 我已经通过论坛search,但还没有遇到一个合适的解决scheme。 我想象我以后会需要使用macros。

我有一个电子表格,按行列出交易,即每笔交易一行。 每项交易包含预计的财务数据。 所以,每一行都涉及一个多年有财务影响的交易。

例如,标题看起来像

Transaction | field1 | field 2 | etc. | 2010-11 | 2011-12 | 2012-13 | etc. | 

在这些年之下是美元的数额。

所有的字段都包含我需要跨行复制的数据,除了我希望将年份转换为单个列,而财务数据则反之。

所以如果我有logging:

 exampleid | data | data | 45000 | 56000 | 223145 | data 

我也想成为:

 exampleid | data | data | 2010/11 | 45000 | data exampleid | data | data | 2011/12 | 56000 | data exampleid | data | data | 2012/13 | 223145 | data 

有大约30列。

你不需要VBA。 您可以使用/修改这里发布的公式。 这篇文章的目的正是为了这样一个案例的参考。

对于每个input行,您需要两组公式行到列,一个用于标题,一个用于数据。

在公式中使用适当的相对/绝对索引,以便能够复制/粘贴。

这是我用来做到这一点。 你可以在子开始处更改variables来决定你有多less个数据列,你的数据有多宽,哪些表名用于导入和导出等等。

导出的数据始终始于与原始数据开始相同的列。

数据需要有标题才能正常工作,并假定第一列数据中没有空白单元格。

 Sub pivot_data() data_sheet = "Sheet1" 'name of sheet containing original data export_sheet = "Sheet2" 'name of sheet to export to start_d_row = 2 'first row of data (headings are grabbed from row above) start_d_col = 1 'first column of data end_d_col = 7 'last column of data start_t_col = 4 'first column to pivot end_t_col = 6 'last column to pivot xrow = 2 'first row to export DATA to (headings will be row above) trailing_col = end_d_col - end_t_col 'calculated number of trailing columns pivot_size = end_t_col - start_t_col + 1 'calculated size of pivot 'headings For xcol = start_d_col To start_t_col - 1 Worksheets(export_sheet).Cells(xrow - 1, xcol).Formula = Worksheets(data_sheet).Cells(start_d_row - 1, xcol).Value Next xcol Worksheets(export_sheet).Cells(xrow - 1, xcol).Formula = "Narrative" Worksheets(export_sheet).Cells(xrow - 1, xcol + 1).Formula = "Value" For xcol = start_t_col + 2 To start_t_col + 2 + trailing_col - 1 Worksheets(export_sheet).Cells(xrow - 1, xcol).Formula = Worksheets(data_sheet).Cells(start_d_row - 1, xcol - 2 + pivot_size).Value Next xcol 'data For irow = 2 To Worksheets(data_sheet).Cells(start_d_row - 1, start_d_col).End(xlDown).Row For icol = start_t_col To end_t_col For xcol = start_d_col To start_t_col - 1 Worksheets(export_sheet).Cells(xrow, xcol).Formula = Worksheets(data_sheet).Cells(irow, xcol).Value Next xcol Worksheets(export_sheet).Cells(xrow, start_t_col).Formula = Worksheets(data_sheet).Cells(1, icol).Value Worksheets(export_sheet).Cells(xrow, start_t_col + 1).Formula = Worksheets(data_sheet).Cells(irow, icol).Value If end_d_col = end_t_col Then Else For xcol = start_t_col + 2 To start_t_col + 2 + trailing_col - 1 Worksheets(export_sheet).Cells(xrow, xcol).Formula = Worksheets(data_sheet).Cells(irow, xcol - 2 + pivot_size).Value Next xcol End If xrow = xrow + 1 Next icol Next irow End Sub 

希望有所帮助

VBA当然可以用来解决这个问题,但是对于定期结构化的数据,比如也可以使用本地Excel。

基本的问题是,你想把你的“input”列表中的每个logging分成“输出”列表中的n个logging。 所以如果你有我的logging在你的input列表中,你将有输出中的i * n个logging。

我曾经在英国国家统计局的人口数据上做了很多这样的工作,数据是按照年龄段和地点按整齐排列的表格显示人口水平,而我希望以列表的forms显示,每条logging只显示在单一地点和年龄组合的人口。 列表格式通常用于Excel的数据过滤和/或数据透视表进行分析,偶尔也会导入到Access中。

转换数据的方法如下。

  1. 例如,假设您在input表中有25年的数据,并input200条inputlogging,则要生成200 * 25 = 5000个输出logging,因此首先生成包含5000行的2列列表。 从第一行的1,1开始; 第二排1,2 ; 第三排1,3 ; …; 第25排1,25 ; 在第二十六行的2,1 ; 第27排2,2 ; …; 第50排2,25 ; 第51行3,1 ; 依此类推,直到你在第5000行达到200,25 。 这样的列表很容易产生:假设单元格A2B2表示第一个1,1 (只需将这些值input到两个单元格中),那么B3就有一个公式,如IF(B2=25,1,1+B2)可以复制到列B的其余行A3还包含基于IF函数的公式,但是这次第一个参数是基于相邻单元格(即B3 )中的值。 精确的公式是作为一个练习留下来的,并且应该再次抄袭A列的剩余行。
  2. 5000行对应于您的输出logging,每对值将告诉您哪个inputlogging(第一个值)以及该logging内的哪一年(第二个值)为输出logging提供数据。 您现在可以使用这些信息来创build包含输出logging的单元格。 可能包括INDEX()OFFSET()INDIRECT()函数,但后者将需要与ADDRESS()函数结合使用。
  3. INDEX()可能是最直接的理解和应用,但其他的值得探索和理解。 如果您的200个inputlogging(不包括标题行)保存在Sheet1!A2:AB201 (带有用于非年份数据的列AC和在D-AB列中的25年年度数据)和输出表将出现在Sheet2 (第1行是标题行,列A和B的使用方法如上面第1步所述),那么Sheet2!C2的公式将为=INDEX(Sheet1!A$2:A$201,$A2)并且可以为所有输出行和下一个2(非年)输出列复制此公式(注意使用实现此目的的混合绝对和相对寻址)。 输出列表(F列)的第4列的年份值是通过从Sheet1的标题行中Sheet1正确的值而生成的。 在单元格Sheet2!F2使用的公式是=INDEX(Sheet1!$D$1:$AB$1,B2) 。 将此公式复制到列F的其余行中。单元格Sheet2!G2的公式使用=INDEX()函数的二维版本 – 但我将其作为练习留下。 一旦你得到了正确的公式,它应该被复制到列G的其余行。

如果您已成功导航上述输出数据,您应该在Sheet2!C2:G5001input数据,您可以将列标题input到第1行。

最后对你的术语发表评论。 你不是转移你的数据,而是改变它的呈现方式。 转置数据通常意味着将表中的所有行转换为列,反之亦然:因此,将具有I行和J列的表转换为具有J行和I列的表。 在你的情况下,美元值从I行和J列转换为I * J行和1列。