邪恶的GFW,你就饶了我吧:(

2009-09-06

在Excel实现“列表”、“表格”的相互转换

1、前言
数据经常有“列表”、“表格”两种表现形式
列表形式:
Name    Value
张三    31
张三    32
……
李四    41
李四    42
李四    43
……
王二    21
王二    22
……
数据库就使用这种形式,但其Key有冗余。

表格形式:
Name    Value1    Value2    Value3    Value……
张三    31      32
李四    41      42      43
王二    21      22
这种形式Key没有冗余,但Value究竟有几个不好确定,会形成Sparse矩阵,不利于关系数学(矩阵)处理。

两种形式各有利弊,关键是能够随意转换。

2、“列表”→“表格”
2.1、VBA
VBA编程思路如下:
目标行指针Table_Row;
目标列指针Table_Column;
Table_Row=Table_Start-1
For(List_Row,List_Start,List_End)
  比较List_Row.List_Key、Table_Row.Table_Key
    如果相等:
      Table_Column+=1
    如果不等:
      TableRow+=1
      List_Key→[Table_Row].Table_Key
      Table_Column=1
  List_Data→[Table_Row,Table_Column].Table_Data。
Next List_Row

2.2、交互式操作
Key  个数n  起始行  结束行  地址  数据
其中:
Key:应该是唯一值,可以使用工具得到
个数:可以使用CountIf、DcountIf、Frequency、透视表得到
起始行:可以使用Match得到
结束行:可以使用Match得到,也可以使用起始行+个数得到
地址:Address(起始行,列,1)&":"&Address(结束行,列,1)
数据:Transpose(Indirect(地址))
注意:Transpose应该以最大n输入数组公式,然后删除NA
但这有一个后遗症,当n=1,数组形式的Transpose会形成n个重复,因此需要对n排序,对于n=1的,不用数组形式的Transpose

3、“表格”→“列表”
3.1、VBA
VBA编程思路如下:
List_Row=List_Start
For(Table_Column,Table_Start,Table_End)
  Table_Key→List_Key
  Table_Column.Table_Value→List_Value
  List_Row+=n
Next Table_Column

3.2、交互式操作
纵向选定ValueI,然后重复n次,当然,不能忘记同时复制n次Key

No comments: