Excel多行到多列,用于不同的值

时间:2017-06-29 14:07:02

标签: excel vba access-vba ms-access-2010

我正在努力制作像这里讨论过的东西(Transpose multiple rows to multiple columns) 基本上

我在Excel或MS-Access中获取数据如下

ID   Desc Day1 Day2 Day3 ...
London  Apr17  12 34  36  
London  May17  16 0   29
London  Jun17  17 18  43
Birm    May17  11 0   28
Birm    Jun17  12 18  42

我想在Excel或MS-Access中生成类似的内容

          --Apr---------   -----May ---------  -----------Jun----- 
ID      Desc Day1 Day2 Day3   Day1  Day2 Day3     Day1  Day2 Day3 
London Apr17  12 34  36      ...16  0   29        17   18   43
Birm                         ...11  0   28        12   18   42

任何想法如何做到这一点

尝试了转置,间接等 对我来说,挑战是我在开始时大约有10列保持相同,然后右侧的大约10列保持相同,并且每天需要大约400列,并且计算的列将被存储。

1 个答案:

答案 0 :(得分:0)

每当我需要在Excel中执行类似的操作时,我通常会使用公式的组合来创建文本单元格引用,然后使用indirect函数来获取值。如果您的数据相当一致,那么为间接函数创建单元格引用的公式非常简单。如果数据不统一,则需要使用匹配函数的组合来创建单元格引用,并且如果您拥有的数据越多,它们就会非常笨拙。

例如,如果显示的第一组数据在A1中开始,而第二组数据在I1中开始,那么公式如:

= CHAR(CODE(" J&#34)+ MATCH($ B2,$Ĵ$ 10:$ R $ 10,0)+ MATCH(C $ 1,$Ĵ$ 2:$ R $ 2,0) - 2)及; TEXT(MATCH($ A2,$ I $ 3:$ I $ 9,0)2"#&#34)

请注意,我必须在J10到R10中创建一组包含相应月份Desc条目的公式。

现在,这个公式可以为您提供数据应该去的位置的单元格引用。问题是您需要从数据的位置到其所在位置的引用。所以这是倒退。在这里,它变得很麻烦。你需要在嵌套的IF中使用另一组MATCH函数来得到它:

= IF(NOT(ISNA(MATCH(J11,$ C $ 36:$ C $ 42,0)))," C"&安培; TEXT(MATCH(J11,$ C $ 36:$ C $ 42 ,0)1"#&#34),IF(NOT(ISNA(MATCH(J11,$ d $ 36:$ d $ 42,0)))," d"&安培; TEXT(MATCH(J11,$ d $ 36:$ d $ 42,0)2,"#&#34),IF(NOT(ISNA(MATCH(J11,$ E $ 36:$ E $ 42,0) )),#34; E"&安培; TEXT(MATCH(J11,$ E $ 36:$ E $ 42,0)2,"#")," I1&#34 ;)))

在添加更多Day列时会变得残酷。请注意,我必须创建一个包含J11到R13中位置文本值的数组,虽然您可以使用ROW和COL函数的组合而不是数组,但需要更大的数据。

然后在J3到R9(扩展为需要更多数据)时,INDIRECT函数用于从第二个IF / MATCH / MATCH函数中选择数据。

您可以删除一些辅助计算单元格,例如将IF / MATCH / MATCH / ...函数直接放在INDIRECT函数中,我发现在开发这样的东西时更容易创建一堆中间公式单元格,这有助于确定某些东西不正确的地方,并且差不多总是在某个地方搞砸了。

在Access中,您可以使用在另一个查询中组合在一起的多个交叉表查询来生成大型多列数据输出。正如其他人所指出的那样,电子邮件是对输出列数量的限制,我还没试过看。

祝你好运!