excel 表格lookup 的操作
这个实现语句如下,(写在2行然后向下拖动)(2007或以上版本):
=
IF(OR($D2<>,ISBLANK($H2),$G2=""),
"",
IF(OR($G2="",$G2=""),
IF($H2>,,-)*SUMIFS(INDIRECT("E"&IFERROR(LOOKUP(,/(($H$:INDIRECT("H"&ROW()-)<>"")*($G$:INDIRECT("G"&ROW()-)=$G2)),ROW($:))+,ROW($:$))):$E2,INDIRECT("A"&IFERROR(LOOKUP(,/(($H$:INDIRECT("H"&ROW()-)<>"")*($G$:INDIRECT("G"&ROW()-)=$G2)),ROW($:))+,ROW($:$))):$A2,$A2,INDIRECT("B"&IFERROR(LOOKUP(,/(($H$:INDIRECT("H"&ROW()-)<>"")*($G$:INDIRECT("G"&ROW()-)=$G2)),ROW($:))+,ROW($:$))):$B2,$B2,INDIRECT("D"&IFERROR(LOOKUP(,/(($H$:INDIRECT("H"&ROW()-)<>"")*($G$:INDIRECT("G"&ROW()-)=$G2)),ROW($:))+,ROW($:$))):$D2,,INDIRECT("G"&IFERROR(LOOKUP(,/(($H$:INDIRECT("H"&ROW()-)<>"")*($G$:INDIRECT("G"&ROW()-)=$G2)),ROW($:))+,ROW($:$))):$G2,$G2) - $H2,
IF(OR($G2="",$G2=""),
IF($H2>,,-)*SUMIFS($E:$E,$B:$B,$B2,$G:$G,$G2,$A:$A,$A2,$D:$D,) - $H2,
"ERROR"
)
)
)
主要复杂的是:
INDIRECT("E"&IFERROR(LOOKUP(1,0/(($H$1:INDIRECT("H"&ROW()-1)<>"")*($G$1:INDIRECT("G"&ROW()-1)=$G2)),ROW($1:2))+1,ROW($1:$1)))
其作用就是返回:H列中存在空值,假设第i行有数据,从i行向上查找直到遇到另一个数据位置,返回查找到的空值的最小行号,如下面表格,i=2返回1,i=9返回5,当然还有符合一定筛选条件。
| 1 | |
| 2 | num |
| 3 | |
| 4 | num |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | num |
语句逐步才开看indirect,作用是将字符串“” 转换成有效代码,INDIRECT(“E”&1)= E1
- IFERROR()
为了解决向上查找时候没有遇到空值的情况,例如上表中的第一行若为标签,i =2 时候向上查找并未遇到空,所以用这个语句返回ROW($1:$1),E和1 前面带 $ 意义是excel 中拖动时候不变。
- ROW() 返回选中单元格的行号。
下面是需要慢慢讲的查找语句,先通过简单版来讲原理。
- LOOKUP(1,0/($H$1:INDIRECT("H"&ROW()-1)<>""),ROW($1:2))
一个数据的上面最靠近的 非 空值可以通过上面语句来返回行号。原理:
INDIRECT($H$1:INDIRECT("H"&ROW()-1)<>"")
表示该列 从第一行到数据上一行的 是数值是否为空的判断,结果是 一列的true 、false
0/(...)
用0 除以后变成一列 0 和 div/0,需要括起全部数据,后者是excel 的一个错误标记{0;0;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;0}
然后在该列 中查找1 ,必须大于0(利用了excel 的机制,baidu会有更清楚的解释:lookup 会默认第二个参数是已经sort(从小到大),忽略error,然后用二分查找),结果就会选中列中最后一个0,最后返回第三个参数 的对应数值,这里是行号。如果 查找的指匹配到了,lookup 的机制是返回匹配中最后一个,返回第一个好像是match。 剩下的加减 1是自己调整的。
- ($H$1:INDIRECT("H"&ROW()-1)<>"")*($G$1:INDIRECT("G"&ROW()-1)=$G2)
通过上面0/(...) 的解释,可以加入条件选择,避免了数组公式所以使用*号,这是一个且运算,并没有找到或运算的,1*n 数列 且 1*n 数列 = 1*n 数列。
把使用方法也附上吧
1.对原始数据添加首行,第一行,需要注意的是列A,B,D,E,G,H 必须正确对应
次码 主码 有效号 计算值 选择类型 处理选择
2.对添加首行后的数据排序,方法:
ctrl+A 后选择 开始->排序和筛选->自定义排序,
勾选 数据包含标题,
列:主码,排序依据:数值,次序:升序
点击添加条件,
列:次码,排序依据:数值,次序:升序
3.在某一列的第二行,必须第二行,复制上面的公式
4.最后是一拖到底(其中有空行不影响,向下拖,另向右拖不影响结果)
excel 表格lookup 的操作的更多相关文章
- [python]使用xlrd对Excel表格进行读写操作
2.1 导入模块 import xlrd 2.2 打开Excel文件读取数据 data = xlrd.open_workbook("excelFile.xls") 2.3 使用技巧 ...
- jfinal中excel表格导出
今天工作中遇到了excel表格导出的操作,还好有写好的模板,不然我也是焦头烂额,下面记录一下excel表格导出的操作步骤,同时用来给正在学习jfinal的小伙伴一些参考和学习. 首先我们需要把表格查询 ...
- VS2010 C++ 操作Excel表格的编程实现
转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html 通过VC实现对Excel表格的操作的方法有多种, ...
- qt 操作excel表格
自己编写的一个Qt C++类,用于操作excel表格,在Qt中操作excel需在.pro中增加CONFIG+=qaxcontainer配置. 1.打开Excel:objExcel = new QAx ...
- Python操作excel表格
用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件 注:本篇代码在Python3环境下运行 首先导入两个模块xlrd和xlwt,xlrd用来读取Exc ...
- php操作excel表格的导入和导出
前言:对于excel大家肯定熟悉不过了的,那么我们在日常的业务中应该是有对这些文件的导入导出操作的 类的下载:composer require phpoffice/phpexcel,其中Classes ...
- python对Excel表格操作
操作场景,给一个Excel表格随机生成10万个手机号码 python中常见的对Excel操作模块 xlwt module 将数据写入Excel表 xlrd module 读取Excel表格 xlsxw ...
- Python 利用Python操作excel表格之openyxl介绍Part2
利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436) ## 绘图 c = LineChart() ...
- Python 利用Python操作excel表格之openyxl介绍Part1
利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436),免费获取以下性能监控工具(类似Nmon精简版) ...
随机推荐
- 自定义AlertView的方法和改变Alert的弹出位置以及其宽度
此方法在IOS7中不适合 一.自定义AlertView 1.首先新建一个OC类继承与AlertView. 2.然后再.m中添加方法 - (void)layoutSubviews 可以再这个方法里边改变 ...
- Deepgreen DB 是什么(含Deepgreen和Greenplum下载地址)
Deepgreen官网下载地址:http://vitessedata.com/products/deepgreen-db/download/ 不需要注册 Greenplum官网下载地址:https:/ ...
- [BZOJ] 1563: [NOI2009]诗人小G
1D/1D的方程,代价函数是一个p次函数,典型的决策单调性 用单调队列(其实算单调栈)维护决策点,优化转移 复杂度\(O(nlogn)\) #include<iostream> #incl ...
- 【Linux】开放指定端口设置
这里以开放tomcat的8080端口为例 1.开放Linux的8080端口 vi /etc/sysconfig/iptables 进入编辑页面,在指定位置新增以下配置 -A INPUT -m stat ...
- Linux 用户管理(三)
一.userdel --delete a user account and related files -r --remove 删除用户及家目录 二.id --print real and effe ...
- 【php】【趣味代码】对象引用的比较
<?php $a = new stdClass(); $a->name = 'flint'; $b = $a ; $b->sex = 'man'; saveObject($b); f ...
- Thinkphp 5 调试执行的SQL语句
在模型操作中 ,为了更好的查明错误,经常需要查看下最近使用的SQL语句,我们可以用getLastsql方法来输出上次执行的sql语句.例如: User::get(1); echo User::getL ...
- nrf528xx bootloader 模块介绍(转载)
转载https://www.cnblogs.com/rfnets/p/8205521.html 1. bootloader 的基本功能: 启动应用 几个应用之间切换 初始化外设 nordic nrf5 ...
- BZOJ 4425: [Nwerc2015]Assigning Workstations分配工作站
难度在于读题 #include<cstdio> #include<algorithm> #include<queue> using namespace std; p ...
- UVa 12235 状压DP Help Bubu
题解戳这 一开始没看懂题解,后来想明白以后,d(i, j, s, x)是考虑第i本书的时候,前面已经拿走了j本书,剩下的书的种类的二进制状态为s,剩下的最后一本书的编号为x,所能得到的最小混乱度. 这 ...