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精简版) ...
随机推荐
- 学习JavaScript你必须掌握的8大知识点!
大知识点! 一.JavaScript思维导图之<变量>的学习 二. JavaScript思维导图之<函数基础> 三.JavaScript思维导图之<基本dom操作 ...
- Spring中c3p0连接池的配置 及JdbcTemplate的使用 通过XML配置文件注入各种需要对象的操作 来完成数据库添加Add()方法
通过配置文件XML方法的配置 可以使用非常简练的Service类 UserService类代码如下: package com.swift; public class UserService { pri ...
- Java 的Throwable、error、exception的区别
1. 什么是异常? 异常本质上是程序上的错误,包括程序逻辑错误和系统错误.比如使用空的引用(NullPointerException).数组下标越界(IndexOutOfBoundsException ...
- 【离线 线段树分治】bzoj4025: 二分图
昨天mac的gdb挂了,今天怎么笔记本的gdb也挂了…… Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这 ...
- pandas处理较大数据量级的方法 - chunk,hdf,pkl
前情提要: 工作原因需要处理一批约30G左右的CSV数据,数据量级不需要hadoop的使用,同时由于办公的本本内存较低的缘故,需要解读取数据时内存不足的原因. 操作流程: 方法与方式:首先是读取数据, ...
- day 37 MySQL行(记录)的详细操作
MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操 ...
- viewController备注
1.按结构可以对iOS的所有ViewController分成两类: 1).主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UIT ...
- debian 升级glibc
原因 wheezy是2.13,编译android4.4 需要2.14的,报错如下: rebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8-linar ...
- WPF触控程序的开发(一)——有用的资源
迟来的一篇博文,每次都要撞到月末,这个月实在太忙了,除了在公司上班,还接了个单子,用wpf做一个触屏软件,类似iphone的相册功能.先说搭建开发环境吧,我是不可能去买个平板来的,再说基于win7的程 ...
- socket中send和recv函数
Socket一次Recv接受的字节有限制么? 从套接字接收数据. 返回值是表示接收数据的字符串. 一次接收的最大数据量由bufsize指定.它默认为零. 注意为了最好地匹配硬件和网络现实,bufsiz ...