一户一表之用OFFSET函数制一户一表(EXCLE)
1、思路:利用OFFSET函数,先分析该函数所需要的5部分内容。
第1部分reference,任意单元格均可引用(本文建议不超过B3);
第2部分rows,移动多少行用行号进行补充;
第3部分cols,移动多少列,可以不做移动,空值;
第4部分height,选择区域多少行,由家庭人数决定;
第5部分width,选择区域多少列,我们根据表格内容确定。
2、按户制表,首先得先确定户号,而刚分析OFFSET函数需用到的行号、家庭人数,均可参阅之前发表的经验【一户一表之身份证号查询户号、姓名等信息】进行填写。

3、一、创建户(编)号
思路:第几户家庭,就标号为几;有几个”本人或户主“,即有几户家庭。
在第一列处插入一列,命名为【户编号】;
如图,单元格A4,输入
=COUNTIF($D$4:D4,"本人或户主")
原理:以“本人或户主”作为确定每户的依据,统计单元格D4到单元格D4共有几个”本人或户主“,再配合使用单元格下拉自动填充,即可将全表按户编号。
其中,第一个D4需使用绝对引用。

4、二、查找所在行号
在【所在行号】右边第一个单元格输入函数
=MATCH(L11,A:A,0)
原理:查找单元格L11输入的户编号在所有的户编号A列所处的位置,即我们需要的所在行号。

5、三、统计家庭总人数
思路:当户(编)号相同时,即为同一户人家,有几个相同的编号,即有几人。
在【家庭人数】右边第一个单元格输入函数
=COUNTIF(A:A,L11)
原理:统计单元格L11的户编号,在A列中共有多少个。

6、四、查找姓名
在【姓名】右边第一个单元格输入函数
=INDEX(B:B,L14)
原理:当单元格L14的行号为35时,即为B列的第35行单元格数据,即单元格B35的数据。

7、五、函数OFFSET
思路:右侧空白选择一片空白区域,比如我选择20×7;
原理:20表示每户家庭人数最多20人,即20行;
7表示我需要【姓名、性别、与户主关系、出生年月、身份证号、年龄、现居住地】共7项数据,即7列。
选定好区域,再在函数旁的编辑栏输入函数
=OFFSET(B1,L14-1,,L13,7)然后同时按Ctrl+Shift+Enter键
原理:以B1为参考单元格,下移单元格L14中35减1行,右移动0行(空值),拓选区域为单元格L13中3行,共7列(即我需要7项数据)。

8、六、显示#N/A
实际家庭人数绝不可能有20人,即20×7全部填满,那多余的就会显示为#N/A。
去除这些#N/A,这时我们可以利用IFERROR。

9、七、20行数据全部相同
当家庭人数为1时,即OFFSET函数第4部分,拓选区域的行为1时,会把2-20行填充的和第1行数据相同。(不知这是BUG还是什么原因,本人使用微软2007版EXCLE和WPS2019版均会出现该问题)

10、八、去除#N/A和重复数据
1、另选空白区域,或者新建一份表格。
2、第一行;
第一个单元格直接输入“=”,加上刚才OFFSET函数所得出结果的单元格;如图所示,输入
=N4,即引用N4单元格的数据;
当单元格右下角变成小“+”号时右拉填充。
思路:每户至少有1人,所以第一行数据不用怎么变更,直接用“=”引用即可。

11、第二至二十行
思路:以家庭人数1作为条件,进行设置;
第二行第一个单元格,输入
=IF($L$13=1,"",IF($L$13>1,IFERROR(N5,"")))
原理:该函数组使用了3个函数,
第①个函数IF——当绝对引用的单元格L13即家庭人数为1时,现在第二行开始的单元格,直接显示为空值,否则进入第②个函数IF——当绝对引用的单元格L13即家庭人数大于1时,则进入第③个函数IFERROR——当引用的值,比如单元格N5,如果N5出现#N/A,则显示空值,否则显示N5的值。
当单元格右下角变成小“+”号时右拉填充,再向下填充。
