邪恶的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

Excel中查询函数的简单小结

Excel中查询函数纷繁复杂,在此简单做个小结,防止遗忘

1、地址函数
Rows/Columns(区域),返回区域包含的行/列数
Row/Column(单元),返回单元是第几行/列

Address(行,列,$$|$R|R$|RR,R1C1|A1,Sheet),返回文本形式的地址
Indirect(文本形式的地址),返回引用
Offset(基点,行偏移,列偏移,高,宽),返回引用

2、返回符合条件个数的查询函数
Countif(区域,条件)
DCount(区域,列,条件)
Frequency(区域,界限数组)

3、返回值的查询函数
Lookup(值,单行/列区域),返回区域后面1行/列的值
Lookup(值,多行/列区域),返回区域最后1行/列的值
Hlookup(值,区域,结果在第几行,1精确|0近似)
VLookup(值,区域,结果在第几列,1精确|0近似)

4、返回位置的查询函数
Match(值,区域,类型),返回第几行匹配

5、依据位置的查询函数
Index(区域,行,列),返回单元格的内容