Office中国论坛/Access中国论坛

标题: Excel挑战Access第二十三期:错位引用 [打印本页]

作者: pureshadow    时间: 2016-5-3 19:47
标题: Excel挑战Access第二十三期:错位引用
Excel单元格引用非常灵活,写公式时不一定要引用同一行的数据,也可以错位引用,比如:
[attach]58947[/attach]

Access呢?

作者: ly    时间: 2016-5-3 21:00
不可否认,access的灵活性与Excel真的不能相比,在Access中,“表”只是存储数据的地方。

但Access通过查询、窗体、报表等方式,来弥补他的不足,而且有时很简单,只要属性设置一下就可到达目的。

比如:通过报表对字段属性设置,对数据累加,公式都不用!
[attach]58948[/attach]

作者: tmtony    时间: 2016-5-4 09:52
是的,单就这个功能来讲,Access的确不如Excel方便
小妖是不是请教哪位Access高手,一下子抓住了Access的痛点,开始反扑了
作者: tmtony    时间: 2016-5-4 09:52
ly 发表于 2016-5-3 21:00
不可否认,access的灵活性与Excel真的不能相比,在Access中,“表”只是存储数据的地方。

但Access通过 ...

的确是的
作者: roych    时间: 2016-5-4 12:32
先来个简单点的:
[attach]58958[/attach]额,报表版本嘛,前面一期已经让小妖姐姐做视频起码花了7分钟,就不求她的心理阴影面积了。

作者: pureshadow    时间: 2016-5-4 18:12
你们都错误理解我的意思了,我既不是要实现累加,也不是要实现中式排名,只不过用这两个例子来实现错位引用,我要实现的功能是错位引用、错位引用、错位引用(重要的话说三遍)
容我给个阴险的表情~~
作者: pureshadow    时间: 2016-5-4 18:13
不过,谢谢ly和Roy,让我又学到新的东东
这次容我给个得意的表情~
作者: roych    时间: 2016-5-5 04:58
pureshadow 发表于 2016-5-4 18:12
你们都错误理解我的意思了,我既不是要实现累加,也不是要实现中式排名,只不过用这两个例子来实现错位引用 ...

这个套路有点深,小妖姐姐不理解不出奇。不妨按我的理解先过一遍吧:

错位引用,应该是引用当前列的上一行以及其它列的同一行,计算后得到一个结果。
——也许伦家引用的是当前列的和其他列的任意一行呢?
——这种情况只有2种可能性:要么是两列的表头不一致,合并单元格之类导致的;要么就是同一列用了不同的公式。这两种可能在Access里都变成了不可能。如果考虑到这一层,Access输了。

说完定义,现在来看套路。以累计为例:

前者相当于D6,后者相当于E5。

我们先来看Excel。E5怎么来的?SUM(D5,E4)→E4=SUM(D4,E3)→……E2=SUM(D2,E1),我们知道,E1是文本,表头,不参与计算,如此递推下去,E5=SUM(D1:D4)。

这不是就我们Dsum("数量","测试数据","ID<"&[ID])所表达的吗?Dsum("数量","测试数据","ID="&[ID])相当于D6应该不必赘述了吧?

Access版本里那个递推根本没见到嘛。事实上,在Access里这并不算什么。定义2个变量(例如i和j),预先将第一行的“数量”赋值给i,然后读取第一行的“数量”,如果等于i,k就不变,i不变;否则就增加1,i变为新的“数量”。如此一步步下去即可达到递推的目的。
但是这个写法较为复杂,所以Roy就取巧地使用记录的位置来处理。

作者: pureshadow    时间: 2016-5-5 16:19
你凌晨五点钟起来折腾这个?
作者: pureshadow    时间: 2016-5-5 16:59
Access虽然死板,但却能使表格更加规范,至少在Access中绝对看不到万恶的合并单元格。
作者: pureshadow    时间: 2016-5-5 17:06
不过Excel中,因为有这种错位引用,很多公式都可以写得很精彩,不然,光一个中式排名,就能要人命。
[attach]58973[/attach]
当然,这个数组公式有个优点是不需要考虑A列排序的问题。
作者: ganlinlao    时间: 2016-5-9 22:59
本帖最后由 ganlinlao 于 2016-5-9 23:31 编辑

Excel和Access的工作机制是完全不同的。
Excel打开一个xlsx文件,是一次性把文件全部载入内存,所以,每个Excel表的每个单元格在内存中的地址是固定的。
这也是为什么Excel在公式中可以引用单元格,因为每个单元格的地址是明确和可寻的。这也是为什么Excel打开一个大文件比如50M大小的xlsx,会变得很卡,因为一次性要在内存中分配这么大的内存,变得非常困难。没有人能想象Excel打开一个1.9G的xlsx文件,会变成什么样子,估计离死机不远。
Access不管dao或是ado载入acced表中的数据,是逐条输出的。除非你特意去修改注册表,否则,它一次只输出一条记录。换句说,表中的数据在内存的地址一开始是不明确和不可寻的,所以它没有公式,也无法引用具体某行某列的数值。
StrSql="select * from 表1“
rs.open strsql,currentproject,1,3
这个时候,其实rs是没有任何记录的。
rs.moveFirst,这个时候才会从acced中输出第一条记录。而且只输出一条。

********************
说到这里,我们顺便再看一下Excel的公式(函数)。Excel的公式或函数和Access的表达式,本质是一样的,它实质是一种回调函数,那个该死的=(等于号)遮蔽了无数人的眼睛,让人忘了它是一个回调函数。=相当于icallback(addressof 公式或函数名())。

作者: Superleistung    时间: 2016-5-26 09:17
PK越来越有意思了




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3