我们在小学到高中时,教师通常都会根据我们的身高、是否近视来给我们进行排座位,通常我们的老师会手动进行排序,但如果我们能统一规则,一次将所有的班级都进行排坐,效率就会大大提高。
我们通过这次的实例,学习一下数据分列、单元格条件格式、单列数据与多列数据的相互转化、行列函数、数据透视表、vlookup模糊匹配、INDEX引用函数
源数据录入与处理
我们可能会在Word或记事本中将学生的姓名以、分隔,如下面这两种这样:

我们将他们复制到excel中,会都集中在一个单元格,如下图:
姓名列
分列
我们选择『数据选项卡』-「数据工具组」~【分列】
第一步:使用分隔符号
选择“其他”中输入“、”作为分隔符号,注意下方的预览
点击完成即可得到下面的效果。
单行转置
如果是第一个只有单行的数据,复制所有数据单元格,然后定位到A2单元格,在『开始选项卡』-「剪贴板工具组」~【粘贴下拉选择性粘贴】,打开如下图的界面:
勾选下方的“转置”,然后就可以粘贴为一列:
当然,对于仅行列转置也可以直接选择如下图的图标:
多行多列转单列
如果我们的姓名数据经过分列后是上面的第二种方式,我们就需要使用下面的方式了
首先我们要确定使用哪种方式的排列,是Z字型还是N字型,这里我们使用哪种方式都无所谓,因为之后还需要对其进行排序,顺序都会被打乱,这里我们以方式二来进行讲解
首先我们复制原数据(m行n列),之后在S4(第1行第n+1列)单元格输入公式=O5
(第2行第1列)(使用相对引用),之后将公式向下、向右拖拽填充,直到第一行出现0,这样我们就有了一行从1到12的数据,之后对其进行行列转置即可,如下面的动态图:
同理,如果想使用方式一,只要在第m+1行输入公式引用第1行第2列数据即可
之后修改第一行的内容为表头“姓名、身高、是否近视”
身高列
在第二列中录入各个同学的身高信息,只需录入数值,之后设置单元格的数字格式。
使用快捷键【Ctrl+1】,切换到数字组,先选择数值,然后选择自定义,在最后输入“米”,如下图:
这样设置后单元格本质还是数值,只是显示的方式变了
是否近视列
最后我们设置是否近视,使用1代表是,0代表否,我们可以也直接使用数字格式中的自定义来实现
我们输入如下图的格式,然后复制该单元格到其他单元格,然后输入1或0即可显示是或否
源数据分组排序
我们对于姓名的排序,需要综合考虑身高与是否近视,但身高在一定范围内是差异不大的,这就需要我们对身高进行分组处理后再进行排序,这里我们介绍两种常用的方法
一、使用透视表分组排序
我们定位到源数据表的某一个单元格,然后选择『插入选项卡』-「表格工具组」~【数据透视表】,选择表格区域和插入的位置
将下图中上方的字段,按身高、是否近视、姓名顺序依次拖到行字段中,将身高拖动到值字段,
注意使用求和,如果你拖动过去是计数等其他计算,可以点击字段中的下箭头,选择值字段设置,如下图:
在打开的窗口中选择汇总方式为求和,如下图:
之后我们会得出下面的原格式:
随后我们进行格式的设置,在『数据透视表-设计选项卡』-「布局工具组」~【分类汇总下拉不显示分类汇总】
然后我们对身高进行升序排列,对是否近视进行降序排列,排列就是点击下图中红色框线的箭头,之后选择对应的序列
之后我们定位到身高列中的某一单元格,然后右键选择“组合”,之后设置组合的具体细节
这里需要注意起始值和步长,比如我们这里设置起始于1.5,步长0.1,每段的范围就是1.5-1.6、1.6-1.7等等,而我们设置为某一值后其前面的勾就会自动消失,因为这是是否自动的勾
到这里基本就结束了,我们复制透视表中的姓名列,就可以进行余下的步骤了
二、使用vlookup模糊匹配分组排序
但上面的这种操作的灵活性不是太大,主要是步长唯一,但如果我们使用接下来这种方式,我们就可以自定义步长了
首先讲解一下vlookup函数
VLOOKUP(lookup_value,table_array,col_index_number,[range_lookup])函数中第一个参数表示查找的值,第二个参数表示在哪个区域进行查找(所选区域的第一列包含查找值,所选区域的其他列与第一列数据个数相同),第三参数表示返回单元格(行是查找值所在行)列为所选区域的第几列,注意这里的列数字范围在所选区域内,不是在整个工作表中,第四参数是匹配的方式,0(FLASE)表示精确匹配,1(TRUE)表示模糊(近似)匹配,工作中一般使用精确匹配,模糊(近似)匹配只有在匹配某一范围时才使用
具体来讲,如下图的位置作为参数2(table_array)
这样进行模糊匹配(参数4[range_lookup]为1),就相当于匹配一定的范围,具体如下图,“[A,B)”表示包括A但不包括B的范围内的数,∞表示无穷
接下来我们在最右侧的列中第一个姓名(D2)后输入公式=VLOOKUP(B2,$H$2:$I$8,2,1)
,这里使用绝对引用参数二,之后向下拖拽即可,如下面的动态演示:
进行到这步,我们就可以对身高范围和是否近视来排序了,定位到数据中的某一单元格,在『开始选项卡』-「编辑工具组」~【排序和筛选下拉自定义排序】
在这里,我们设置排序的主要关键字为升高范围升序,次要关键字为是否近视降序(添加次要关键字只要点击下图中红色框内的“添加条件”)
点击确定后,我们有了排序后的数据,如下图:
在这里我们观察到周八1.74米,比王五高,但他们两位的身高均在[1.7-1.75)范围内,且周八近视,就排在王五前面
好了,到了这里,我们将排列好的姓名复制即可进行下一步
座位表
通过上面的两种方法,我们得到了经过排序的姓名列,之后我们需要将他们安排到对应的座位,也就是将单列的数据转换为多行多列的数据
首先,我们讲解一下转换的原理
原理这部分可能有一点难,但我总结了两个公式,如果不想深入的了解内部原因,套用即可。
我们以下图中原数据二为例,我们这里主要使用行列函数和INDEX引用函数
ROW([refrence])和COLUMN([refrence])函数分别返回参数单元格的行数和列数,如果不填写参数,返回当前单元格的行列数,比如B3单元格row(B3)返回3,column(B3)返回2
INDEX(array,row_num[,column_num])如果第一个参数选择的范围是单行或单列,只需指定前两个参数,返回第row_num[column_num]个数据,否则,后面的两个参数都需要指定,返回该范围的第R行,第C列数据
我们有两种转换的方式,一种是Z字型,一种是N字型,我们以Z字型的排序为例,来说明其中的原理
假设我们的数字需要排列到J19到L22(4行3列)范围内,我们需要的排序顺序是从1至12,呈Z字型,我们将每个单元格的行与列展现出来,如下图:
我们在其中找规律,每行中,后一个单元格的引用都比前一个单元格的引用大一,恰好列函数满足这一条件;再来看每一列,后面的单元格引用都比前面的大3,这正好是每一行的单元格个数,上下单元格的行数相差1,如果乘上3,正好就是这个数字,因此我们总结的公式是=(ROW()-26)*3+COLUMN()-9
,之后拖动填充该公式即可
通过分析,这里给出一般规律:
如果我们需要在Xm:Yn范围内自左向右,自上而下,“Z”字型无空值,增加值为1,依次填充1到(Y-X+1)*(n-m+1)之间的整数的数字,我们每个单元格的公式都是
=(ROW()-m)*(Y-X+1)+COLUMN()-X+1
,这里的Xm、Yn表示类似B2、D4单元格这样的命名方式,而式中的大写字母表示的是第几列,比如A表示1,B表示2,不是固定的X列。而Y-X+1表示首列到尾列共有多少列,也是每行有多少单元格
如果我们需要在Xm:Yn范围内自上而下,自左向右,“N”字型无空值,增加值为1,依次填充1到(Y-X+1)*(n-m+1)之间的整数的数字,我们每个单元格的公式都是
=ROW()-m+1+(COLUMN()-X)*(n-m+1)
,这里的Xm、Yn表示类似B2、D4单元格这样的命名方式,而式中的大写字母表示的是第几列,比如A表示1,B表示2,不是固定的X列。而n-m+1表示首行到尾行共有多少列,也是每列有多少单元格
具体到我们座位的排序上来说,假如我们要排成4行3列的座位,排到H10到J13范围中,结合INDEX,我们在H10单元格中输入公式=INDEX($A$2:$A$13,(ROW()-10)*3+COLUMN()-7)
,然后我们拖动填充即可。
最后说明一下,这个例子仅用来讲解一些excel中常用的操作,在实际的生活中要考虑的因素还有很多,比如说谁谁的父亲是老师的同事等等
好了,最后总结一下这篇文章中的知识点
- 数据分列
- 单元格条件格式
- 单列数据与多列数据的相互转化
- 行列函数
- 数据透视表
- vlookup模糊匹配
- INDEX引用函数
在微信公众号“未央暮城”(WeyoungTwilight)后台回复“座位”获取源excel文件
如果觉得我的文章还不错,欢迎点赞、转发、评论啊!