《易表-设置表间关联.docx》由会员分享,可在线阅读,更多相关《易表-设置表间关联.docx(30页珍藏版)》请在三一办公上搜索。
1、设置表间关联关于表间关联易表可以在表与表之间建立关联,例如在订单管理系统中,通常包括客户、产品、定单三个表,其中每个订单都对应着一个客户和一个产品,如果我们能够在客户与订单、产品与订单之间建立某种关联,那么相互之间可以互相引用和定位,例如订单可以引用产品表中的单价数据来计算金额,而选择某一个产品或某一个客户,也可以快速找到所有对应的订单。设置表间关联在表菜单上,单击“表间关联”,启动表间关联设置窗口0。添加关联单击“添加”,选择要建立关联的表,指定用于关联的列。左表和右表并没有区别,任何一个表都可以作为左表,也可以作为右表。删除关联选择要删除的关联,单击删除。定位关联记录利用表间关联,我们可以
2、在其他表中快速定位相关的记录。例如在一个订单管理系统中,如果已经在订单表和产品表之间通过产品编号建立关联,那么在订单表中,一旦选择某一订单,产品表会自动显示对应产品的详细资料;反之一旦在产品表中选择某一产品,订单表也会自动显示该产品对应的第一条订单,由于同一产品可能有多条订单,如果要显示该产品对应的所有订单,可以首先将订单表根据产品编号进行排序。查看关联表数据在“表”菜单中,指向“显示关联表”,会列出所有和当前表有关联的表,单击这些关联表,即可在主窗口的下方显示关联表,而且这些关联表只会显示和当前表的当前记录有关联的数据。下列图是一个入库管理系统,入库单表和入库明细表通过“入库单编号”建立关联
3、,每个入库单记录在入库明细表中对应有多个记录,这是一种典型的父子关系。为便于管理,我们通常选择入库单表(父子关系中的父方)进行操作,在“表”菜单中指向“显示关联表”,单击“入库明细”,既可如下列图所示在主窗口下方显示入库明细表,而且这个入库明细表只会显示属于当前入库单的数据。如上图所示,右击入库明细表,通过快捷菜单,你可以增加、插入或删除行,还可以打印报表。你也可以通过以下快捷键对关联表进行操作:Ctrl+ACtrl+I增加一行插入一行Ctrl+Del删除行在关联表中增加行,其关联列内容会自动输入。例如上图中,在入库明细表增加一行后,新增行的入库单编号等于入库表当前行的入库单编号。引用关联数据
4、如果已经在两个表之间建立关联,那么就可以在公式中互相引用数据,要引用关联表中的数据,必须同时指定表名和列名,表名和列名之间用符号“!”隔开,例如:产品!单价1、关联计算例如在一个订单管理系统中,如果已经在订单表和产品表之间通过产品编号建立关联,可以将订单表中金额列的刷新公式设为:数量*产品!单价*(1-折扣D这样我们一旦在订单表输入订购产品数量和折扣,易表就会自动调用产品表中对应的产品单价,然后计算出金额。2、自动输入如果订单表和产品表都包括产品编号、产品名称两列,而产品表已经录入所有的产品编号和产品名称,我们希望在订单表中只需输入产品编号,对应的产品名称即可自动输入。为实现上述目的,首先在订
5、单表和产品表之间通过产品编号建立关联,然后将订单表中的产品列的刷新公式设为:产品!产品名称,设置完成之后,即可象我们希望的那样,订单表只需输入产品编号,产品名称即可自动输入。RelationRow变量当进行关联计算时,可以用RelatiOnRoW变量判断关联表中是否存在关联行(记录),如果存在,那么返回关联行的位置,否那么返回-1。例如,在订单管理的时候,订单表和产品表通过产品编号建立关联,在订单表中输入某个产品编号,如果产品表中存在对应该编号的产品,那么产品名称和单价自动调用产品表中的数据,否那么由用户自己输入。那么在订单表中,产品列和单价列的公式应该分别设为:if(产品!RelationR
6、ow=-1,产品名称,产品!产品名称)if(产品!RelationRow=-1,单价,产品!单价)统计关联表的数据关联表之间通常还存在某种统计关系,例如下列图是一个入库管理系统,入库单表和入库明细表通过“入库单编号”建立关联,入库单表中的金额等于入库明细表中各行金额之和。为了自动计算入库单表的金额,只需该列的刷新公式设为:SUmFOr(入库明细”,金额,入库单编号入库单编号)设置上述公式后,修改关联表(入库明细表)中的数据,入库单表会自动求出总的金额。需要注意的是,只有在入库单表作为主表,入库明细表作为关联表显示的情况下,入库单的金额才会自动计算。自动重算关联表在默认的情况下,如果某一列的刷新
7、公式引用了关联表中的数据,那么关联表中的数据被修改之后,刷新公式并不会重新计算,要得到最新的计算结果,必须在“表”菜单中,单击“重算全表”。例如在产品表中修改单价,那么订单表中只有新增行(或被重新修改数据的行)才会采用新单价计算金额,如果希望已经输入的数据也采用新单价重算金额,必须在“表”菜单中,单击“重算全表”。可是很多时候,我们希望修改主表中的数据,关联表的数据能够自动更新,怎样实现呢?很简单。方法一例如下列图,修改产品表的单价,希望订单表的单价自动更新为新的单价,为达次目的,可以按照如下步骤进行设置:1、选择产品表的“单价”歹U,在“列”菜单上,单击“操作公式”2、将“单价列”的操作公式
8、设为:ReCalCRGrid(订单表”)经过上述设置,即可实现在产品表修改某个产品的单价,订单表中对应产品的单价会自动更新为最新的单价。ReCaICRGrid函数用于重算关联表,而且仅仅重算已经显示出来的关联表(主界面和录入窗口均可)。普通用户可以暂时忽略下面的方法。方法二:方法一必须产品表和订单表同时可见,而且订单表是作为关联表出现的情况下才能有效,如果我们希望不管订单表是否可见,修改产品表的单价,订单表的单价都可以自动更新为新的单价,只需按如下步骤设置。1、选择产品表的“单价”歹U,在“列”菜单上,单击“操作公式”2、将“单价列”的操作公式设为:RePIaCeFOr(订单表,“单价,单价,
9、产品名称产品名称)3、或者将“单价列”的操作公式设为:ReCaICOIFor(订单表单价,产品名称,=,产品名称)前提是订单表的单价列的刷新公式设为:产品表!单价方法三如果希望不管订单表处于主表状态还是关联表状态的情况,修改订单表中的数量列,产品表中的总数量和金额都可以即时刷新,可按照如下步骤设计:1、选择产品表,将总数量、总金额的刷新公式分别设为:SUmFor(订单数量,产品名称产品名称DSUmFON订单”,金额,产品名称,产品名称)2、选择订单表,将其数量列的操作公式设为:if(产品表!RelationRow0,ReCalCROW(产品表”,产品表!RelationRow),True)也可
10、以设为:if(产品表!RelationRow0,RecalcCell(“产品表”,产品表!R。IationRow,总数量“)AndRecalcCellC产品表,产品表!R。IatiOnRoW总金额),True)公式的理解请参考RePIaCeFor、RecalcColForRecalcCel1操作公式根据多列建立关联有的时候单单靠某一列是不能唯一区分某行数据的,例如在订单管理系统中,可能需要同时用品名和规格来区分一个产品,此时我们需要在订单表和产品表之间同时建立两个关联,一个关联基于品名,另一个关联基于规格。多个关联的使用和前面提到的单个关联并没有什么不同,在此就不多讲了。父子关联在设置关联的时
11、候,如果关联表之间是父子关系,只需选择“父子”选项即可。什么是父子关系呢?父子关系也叫一对多关系,例如对于产品表和订单明细表,订单明细表中的每一条记录只能对应产品表中的一个产品(记录),而每一个产品在订单明细中可能对应有多个记录(订单),就像一个父亲可以有多个儿子,而一个儿子只能有一个父亲一样,所以这种关系称之为父子关系。在设置关联的时候,“父”指的是左表,“子”指的是“右表”,所以对于父子关联,左表和右表的位置干万不能搞错。对于父子关系的表,如果子表存在对应记录,父表中的对应记录将不能被删除,出于平安考虑,父表中的记录每次只能删除一行。再谈关联计算前面已经说过,如果已经在两个表之间建立关联,
12、那么就可以在公式中互相引用数据,例如在一个订单管理系统中,如果已经在订单表和产品表之间通过产品编号建立关联,那么订单表可以调用产品表中的单价计算金额,其金额列的刷新公式为:数量*产品!单价*(1-折扣)如果修改了产品表中的单价,那么新增订单会采用新单价计算金额,原有的订单并不会采用新单价重新计算金额。但是如果修改原有的某一订单,该订单会采用新单价重新计算金额,如果执行重算全表命令,那么原来所有的订单都会采用新单价重新计算金额。现在的问题是,原来的订单有可能要修改,但是又希望采用原单价,而且原有订单可能局部希望采用原单价,局部采用新单价,按照上述的方法,显然不可能实现这些要求,必须拓展一下思路:
13、 哪些订单采用新单价,哪些订单采用旧单价,计算机并不知道,所以最好增加一个标志列(姑且称之为“标志”列吧),将标志列的类型设为逻辑型,如果断定某些订单永久性地采用原单价计算金额,那么在标志列打勾(其值将为-1)。 对于某些订单永久性地采用原单价计算金额,那么以后修改产品表中的单价后,如何直观地知道这些订单所采用的单价呢?所以最好还是在订单表中增加一个“单价”歹h 将订单表的单价列的刷新公式设为:,门7标7=-1,单价J,产品!单价D。这个公式的含义是:如果标志列的值为-L那么单价不变,否那么刷新为产品表中的单价。 最后将产品表中金额列的计算公式改为:数量*单价*(1-折扣)因为刷新公式是从左到
14、右计算的,显然对于订单表,应该先计算单价,后计算金额,所以应该将单价列置于金额列之前。如果你不希望设置标志列,只是希望输入订单的产品名称后,自动从产品表中调入该产品的单价,之后该订单的单价不再和产品表中的单价有任何关系,而且可以手工修改这个单价,那么只需将订单表中单价列的公式设为:if(单价0,单价,产品!单价这个公式的含义是,如果单价大于0,那么单价保持不变,否那么从产品表中取得单价。FindText在指定的表、指定的列中杳找指定内容,并返回符合条件的行中指定列的内容。语法:FindText (Grid,Col, CompareCol, CompareMode CompareValue,Po
15、sition)GridColCompareCol CompareMode CompareValue Position在表中进行查找,可以用表名表示,也可以用位置表示。返回该列的内容,可以用列名称表示,也可以用位置表示。进行比拟的列,可以用列名称表示,也可以用位置表示。比拟方式,包括=、=、=、Like、InStr共8种比拟方式。比拟值这个参数决定返回第几个符合条件的行的数据,如果省略,那么返回第一个符合条件的行中指定列的内容。可以设置多个比拟条件,从第三个参数开始,每三个参数组成一个比拟条件。如果比拟方式选择的是InStr,那么进行包含查询;如果比拟方式选择Like,那么可以在比拟值中使用通配
16、符进行类似查询。例子:FindText(订单数量,客户CSO1)返回订单表中CSOl客户的第一个订单的订购数量。FindText(订单,数量,客户,J,CS01,产品,=,PD01)返回订单表中CSOl客户第一次订购产品PDOl的数量OFindTeXtc订单数量客户=JCSOl产品=JPDOl,2)返回订单表中CSOl客户第二次订购产品PDOl的数量o利用FindText函数,我们可以在不建立表间关联的情况下引用其他表中有关联的数据。例如订单表和产品表都包括品名、规格、单价等数据,而产品表已经录入所有的品名、规格和单价,我们希望在订单表中只需输入品名和规格,单价即可自动输入。为实现上述目的,我
17、们只需将订单表中单价列的刷新公式设为:FindTeXt(产品表,单价”,品名,=,品名,规格,=,规格)合并关联表在“表”菜单中,单击“合并关联表”,可以将两个关联表合并为一个新表。两个关联表必须有一个为父表,一个为子表,并分别指定用于关联的列,以及需要包括在新表中的列。那么如何确定父表和子表呢?我们知道关联表之间往往存在着一种一对多的关系,例如客户表中的某个客户在订单表中对应着多条订单,而一个订单只能对应着一个客户,所以客户表就是父表,订单表就是子表。关联筛选在表与表之间建立关联后,一个表中的每条记录在关联表中也应该有对应的条记录,但是由于数据输入错误或其他原因,某些记录可能在关联表中没有对
18、应记录。为了快速找出这些记录,可以利用“筛选”菜单中的“关联筛选”命令。不仅是关联表,任何存在一定关系的表,都可以进行这种关联筛选。例如在人事管理中,在根本信息表中按下列图所示进行关联筛选,即可快速找出在根本信息表中有记录而在工资表中没有记录的员工。显然,可以利用关联筛选得到两个结构相同的表的交集或差集,至于并集,可以利用前面提到的合并表的功能来实现。在子方设计下列图是一个入库管理系统,入库单表和入库明细表通过“入库单编号”建立关联,每个入库单记录在入库明细表中对应多个记录,为便于管理,我们通常选择入库单表进行操作,通过菜单命令”表-显示关联表”来显示当前入库单对应的入库明细数据。如果要打印一
19、张入库单,显然应该包括入库单数据和该入库单对应的所有入库明细数据,由于入库单和入库明细存在一对多的关系,所以这张报表按照常规的方法在入库单表设计是不行的,因为没有方法逐一调用入库明细表中的有关数据;为了解决这个问题,我们可以在入库明细表中设计入库单报表,设计过程和普通的报表一样,而且可以很方便地通过表名!列名的格式调用入库单表中的数据,因为入库明细表中每条记录在入库单表中只有唯一的一条对应记录。在入库明细表设计好入库单报表之后,再回到入库单表,需要打印入库单的时候,右击入库明细表,从快捷菜单中指向“打印报表”,单击“入库单”即可。这是在入库明细表中设计的入库单报表:这是入库单打印效果:在父方设
20、计在子方设计一对多报表有一个缺乏,就是每次只能打印父方一条记录,对于批量打印报表非常不便。为解决这个问题,我们也可以考虑在父方设计报表,不过相对要繁琐一些。要在父方设计一对多报表,必须掌握FindTeXt函数,我们知道FindTeXt可以按照指定的条件从指定表中返回指定列的内容,而且可以用参数决定返回第几个符合条件的数据,例如:FindTeXt(入库明细存货编码入库单编号入库单编号,1)表示从入库明细表中找出第一个入库单编号等于当前入库单编号的记录,并返回该记录存货编码列的内容。FindTeXt(入库明细数量入库单编号,”=,入库单编号,6)表示从入库明细表中找出第六个入库单编号等于当前入库单
21、编号的记录,并返回该记录数量列的内容。利用EindText设计一对多的关联报表时,首先应该估计父方每条记录最多可能对应子表中多少条记录,例如一个入库单,最多可能包括多少种产品,假定这个最大数为Rows,子表最大的列数是COls,那么就在报表的细节区绘制一个(RoWS+1)*Cols的表,第一行打印子表的列标题,其他各行用FindText函数调用子表数据进行打印,如下列图所示。为了提高效率,我们可以先设置好第二行的对象,然后复制、粘贴,将新粘贴的对象拖到第三行,然后稍作修改即可,其他各行也用类似的方法处理。上图中,第2行第3列的内容为:FindText(入库明细规格入库单编号,“=,入库单编号,
22、D第7行第6列的内容为:findtext(入库明细数量入库单编号,=,入库单编号,6)其他单元格的内容类推,下面是打印效果:你也许留意到上图中最后两行是空的,这是因为设计报表的时候,预留了7行数据,而当前入库单只有5条入库明细。明细字段明细字段如果将列类型设为明细型,那该列中的每一个单元格都会包含一个明细表,单击单元格右边的按钮,可以翻开明细表。例如在下列图中,家属和工作经历两个字段都是明细型。右击明细表,通过弹出的快捷菜单你可以设置明细表的栏目,列表工程、刷新公式,也可以排序、添加行、删除行。在明细表的最后一个单元格按回车键,会自动增加一行。你也可以通过以下快捷键对明细表进行操作:Ctrl+
23、A增加一行Ctrl+I插入一行Ctrl+Del删除行引用主表中的数据1、明细表不管引用的是哪一个主表的数据,都必须同时包括表名和列名,例如产品!单价2、明细表虽然不能和主表建立表间关联,但是可以利用FindTQXt函数到达和关联相似的效果。假定有一个名为产品表的主表,已经输入编号、品名、单价等数据,希望在明细表中只需输入产品编号,对应的品名和单价即可自动输入。为实现上述目的,我们只需将明细表中产品列的刷新公式设为:FindTeXt(产品”,品名,编号编号),单价列的刷新公式设为:FindTeXtC产品,单价编号,”=,编号)引用明细表中的数据利用SubCell可以返回明细表中的指定位置的内容。
24、语法:SubCelKColName,SubRow,SubCol)ColName明细列的名称SubRow行坐标,如果设为-1,那么返回最后一行的数据。SubCol列坐标例如下列图中,订单列是明细型,订单明细表第3行第2列位置的内容为7,所以SUbCel1(订单”,3,2)=7统计明细表数据请参考一下函数:SubSumSubAvgSubMaxSubMinSubRows合并明细表对于明细字段来说,数据分布在不同的明细表中,不便于进行统一的分析处理。在“表”菜单中,单击“合并明细表”,可以将某个明细列的数据合并到一个单独的表中,而且可以包括主表中的局部列,这样就可以和主表一样,随心所欲地对明细数据进行
25、统计分析,以及其他各种操作。自动复制明细行由于明细数据分散在不同的明细表中,如果有相同内容的数据要输入,必须一个一个明细表去录入,很不方便。为解决这个问题,最新版本的易表增加了自动复制明细行的功能,在某一个明细表中,输入要复制到所有明细表的内容,然后右击复制内容所在的行,从弹出的快捷菜单中执行“自动复制”命令即可。注意这项操作必须在主窗口进行,对于录入窗口无效。如何打印明细表数据明细表数据不能直接打印,只能利用SUbCell函数在报表中打印。假定某个明细表的列数为COls,最大行数为ROWs,那么就在报表中绘制一个RoWS*COIS大小的表格,在每个单元格中利用SubCell函数设置打印内容。
26、例如下列图就是用subcell函数来打印员工的工作简历。明细表和关联表明细表的大局部功能都可以用关联表实现,大多数时候,我们推荐采用关联表。使用公式计算的根底:列类型为了确保公式计算结果的准确性,在设计表的时候,一定要正确设置列的类型,例如对于一个订单管理系统,必须将“数量”、“单价”、“折扣”等列设为数值型,将日期列设为时间型,客户、产品、雇员等列设为字符型。刷新公式关于刷新公式通过设置刷新公式,某些列的值可以由其它列的值计算得出。例如在订单表中,可以将“金额”列的刷新公式设为:数量*单价*(1-折扣D这样一旦增加或修改数据,金额即可根据数量、单价、折扣的值自动求得。为了确保计算结果为两位小
27、数,我建议将公式改为:RoUnd(数量*单价*(1-折扣),2)设置刷新公式选择要设置刷新公式的列,在“列”菜单上,单击“刷新公式”,启动公式生成器,输入刷新公式,单击“确定”刷新公式不需要在开始位置输入等于号,而且列名称必须用方括号括起来,例如对于“订单”表中的“金额”歹U,正确的刷新公式为:ROUnd(数量*单价*(1-折扣),2)以下的公式那么都是错误的:ROUnd(数量*单价*(1-折扣,2)=ROUnd(数量*单价*(1-折扣D,2)金额=RoUnd(数量*单价*(1-折扣),2)提示:刷新公式对于汇总模式、框架模式下的分组行是无效的,如果要对分组行进行计算,请在“列”菜单上,单击“
28、重算列”,输入计算公式,计算范围选择分组行。条件计算有的时候,条件不同,计算公式不同,此时需要用IF函数进行条件判断,If函数有三个参数,第一个参数为条件判断式,第二个参数为条件成立的计算公式,第三个参数为条件不成立的计算公式。例子一,下面是订单表中金额列的刷新公式,数量超过50的订单给与5%的折扣:if(数量50,数量*单价*0.95,数量*单价)例子二,某单位营业员的奖金计算公式,回款额不同,计算公式不同,这是一个典型的IF函数嵌套使用例子:if(回款额=1100,0,if(回款额=1500,(回款额100)*0.1+70,if(回款额=1800,(回款额T500)*0.3+110,if(
29、回款额=2100,(回款额T800)*0.35+200,if(回款额=2400,(回款额-2100)*0.4+305,if(回款额=2700,(回款额-2400)*0.45+425,0)例子三,只有符合某一条件才进行计算,例如只有结账等于0时,才重新计算金额:if(结账=0,数量*产品!单价*(-折扣)J金额)结账列是一个逻辑列,结账=0表示还未结帐,这样我们修改产品表中的单价后,并不会影响已结帐的订单。触发条件刷新公式是自动计算的,但是这个自动计算也是有条件的,只有在相关列的数据被修改后,刷新才会自动计算。例如下列图中,只有单价、数量、折扣等相关列的内容被修改后,金额列的内容才会自动刷新。何
30、谓相关列呢?就是刷新公式引用了该列的数据,而且引用格式为:列名称,所以对于金额列的刷新公式:R。Und(Z数7*单价*(1-折扣),2)数量、单价、折扣三列就是相关列。对于大多数公式来说,都是直接引用列名称进行计算,无需在这方面进行过多的考虑。但是一些特殊情况下,我们就不得不考虑触发条件了。例如在下面的表中,有A、B、C三列,C列用于记录A列最后一次被修改的时间。易表中返回当前时间的函数是NOw()。显然简单地将C列的刷新公式设置为NoWO是不行的,因为此时A列不是相关列,修改A列数据后,C列的刷新公式并不会自动计算,为到达目的,我们可以将C列的刷新公式设为:IF(A=A,Now(),)f现在
31、A列就是C列刷新公式的相关列,这样一旦A列数据变化,就会重算C列的刷新公式,由于条件A二A在任何时候都是成立的,所以A列内容变化后,C列就会自动记录当前时间。此外,如果用户直接修改某列的内容,也会自动重算该列的刷新公式,所以对于任何一列的刷新公式来说,该列本身也算是一个关联列。流水账关于流水账流水账是经常使用的种记账方式,局部数据都要结合本行和之前行的数据计算得出。例如下列图所示,我们希望修改任意一行的进仓或出仓数量,所有行的结存均能自动刷新,且在分组行显示最新的结存。设置刷新公式显然本行结存是由上行结存加上本行进仓,再减去本行出仓,那么如何来引用上一行中的结存呢,我们需要使用CelI函数,C
32、ell函数用于引用指定单元格,例如Cell(2,5)表示位于第2行第5列的单元格,此外CelI函数通常和变量Row、CoI结合使用,RoW表示当前行,COl表示当前列,所以CeII(ROWT,CoD表示同一列中上一行的单元格。此外,我们要注意第一行的结存和其它行的计算方法是不同的,第一行的结存的计算公式直接就是“进仓-出仓”,易表中有一个变量FirStRow,该变量代表每个分组的第一行。综上所述,上图中结存列的刷新公式应设为:if(Row=FirstRow,进仓-,Cell(Row-1,Col)+进仓-出仓)如果要在第一行输入上一期的结存,那么刷新公式应该设为:if(Row=FirstRow,
33、结存,CelI(RCWT,CoD+进仓-出仓)设置框架模式要在同一本流水账包括多种产品,必须使用框架模式。例如要到达上图中的流水账效果,必须根据产品列进行分组,并对结存列进行统计,统计类型为流水账,如下列图所示: 自动输入分组名在上例中,如果将“产品”列的默认值设为:CelI(ParentR。*,CoD,那么我们新增行时,会自动输入产品名称。ParentROW是一个变量,代表当前行所属的分组行,所以CeII(ParentRoW,CoD表示同一列中分组行单元格的内容。 需要特别注意的除了流水账计算,请不要轻易地在刷新公式中同时使用CeII函数和Row变量,否那么会将刷新公式看作流水账计算公式,修
34、改当前行的数据,那么当前行之后的所有行都会重新计算,大大降低了程序的运行效率。同一行中的单元格应该用列名称来引用,而不是用CeII函数。例如下面两个公式的计算结果是一样的:IF(CeII(RoWJ未开票数量)=0,0K,IF(未开票数量=0,0K,)但是第二个公式的运算效率远远高过第一个公式,如果表的行数较多,而且在表的开始位置修改数据,那么两者的速度差异将是百倍、千倍甚至万倍。为什么计算速度这么慢?不少用户反响,自己设置的刷新公式运算速度特别慢。要提高易表的运算速度,要把握两个原那么;1、尽量用刷新公式,而不是单元格公式来计算。2、除了流水账外,在设置刷新公式时,绝不可在CeU函数中出现Ro
35、W变量,同一行中的单元格应该用列名称来引用,而不是用CelI函数。例如下面两个公式的计算结果是一样的:IF(Cen(Row,”未开票数量)=0,0K,IF(未开票数量=0,0K,)但是第二个公式的运算效率远远高过第一个公式,如果表的行数较多,而且在表的开始位置修改数据,那么两者的速度差异将是百倍、千倍甚至万倍。为什么会这样呢,因为如果Cell函数中出现row变量,会将该刷新公式作为流水账计算公式,修改当前行的数据,当前行之后的所有行的公式都会重新计算。默认值公式 关于默认值公式每一列都可以设置一个默认值公式,增加新行时,将自动计算该公式,并将结果填入到对应的列中。例如,在“员工资料”表中,可以
36、将“城市”列的默认值设为:“北京“。当用户在表中添加行时,会在“城市”列中自动愉入北京,如果该员工不是北京的,录入员也可以输入其他城市的名称。再例如在“订单”表中,可以将“日期”列的默认值设为:Today(),当用户在表中添加行时,会在“日期”列中自动输入当天日期。 设置默认值公式选择要设置默认值公式的列,在“列”菜单上,单击“默认值公式”。 一个默认值使用技巧新增行数据和上一行的数据有些经常是相似或相同的,对于相似或相同的列,我们可以将其默认值设为:cell(row-1,col),这样新增行的数据会自动从上一行继承这些列的内容,无需再次输入。cell函数说明默认值只是在新增行的时候计算一次,
37、其他任何时候都不会自动计算的。重算列 关于重算列重算列可以按照指定的公式、指定的范围重新计算某一列,这种操作是一次性的。而刷新公式是一个属性,一旦设置那么永久生效。例如在订单表中,希望给数量超过500的订单增加5%的折扣,此时就只能就利用重算列来实现,而不能使用刷新公式,因为这种操作是-次性的。 操作步骤在“列”菜单上,单击“重算列”,输入重算公式,指定重算范围,单击“确定”。范围选项选项说明所有行重算所有行选定行重算选定行分组行只重算汇总模式或框架模式下的分组行符合条件的行只刷新符合指定条件的行,单击”可以启动表达式生成器来输入条件。包括隐藏行是否重算隐藏行单元格公式 关于单元格公式通过设置
38、单元格公式,某些单元格的值可以由其它单元格的值计算得出。请注意单元格公式和刷新公式的差异,前者是针对单个单元格的,后者是针对整列的,而且如果可能,我们推荐尽量使用刷新公式,因为刷新公式的效率更高。 设置单元格公式用鼠标右键单击要设置公式的单元格,从弹出的快捷菜单中单击“单元格公式”,启动公式生成器,输入单元格公式,单击“确定”。单元格公式不需要在开始位置输入等于号,直接输入计算式即可。单元格公式不需要在开始位置输入等于号,下面的单元格公式可以正确运算:CELL(I,2)+CELL(1,3)以下的单元格公式那么是错误的:=CELL(L2)+CELL(I,3) 必须掌握的几个函数在单元格公式中经常
39、使用的函数有:CelRAggregatesSumforCoUntfOr注意:和刷新公式不同,修改数据之后,单元格公式不会自动计算,在任何时候,按F8键,可重算单元格公式。如果你希望修改数据之后,自动计算单元格公式,可在“表”菜单上,单击“计算选项”,选择自动计算单元格公式即可。再次强调应该尽可能用刷新公式,而不是单元格公式。自动计算设置在默认情况下,刷新公式是自动计算的,一旦修改或增加数据,会立即得到最新的计算结果,而单元格公式在默认情况下,那么不会自动计算,修改数据之后,按“F8”键可重新计算所有单元格公式。如果设置了较多的单元格公式和刷新公式,那么程序的运行速度会降低,大面积地复制和粘贴数
40、据的时候,更是如此。为了提高效率,可以暂停自动计算。在“表”菜单中,单击“选项设置”,可以设置修改数据后,是否自动计算刷新公式、单元格公式以及分组统计结果。除非你的数据量很小,而且所设置的单元格公式不是很杂,否那么最好不要选择自动计算单元格公式。暂停自动计算后,如果需要得到最新的计算结果,可以在“表”菜单上指向“重新计算”,即可重算刷新公式、单元格公式或分组统计结果,也可以重算选定的行、歹U,或者重算整个表。直接输入计算式在输入数据时,可以直接输入计算式,程序会自动对该计算式求值,并将结果填入单元格。例如在单元格中输入:=2*3,那么实际输入的将是6。注意在单元格中输入的公式,必须以等于号开始
41、。可以在公式中使用函数、列名,例如:=INT(数量*单价)。直接输入的公式是一次性的,计算结束后,该公式并不会保存,如果需要设置永久性的公式,请参考:刷新公式、单元格公式时间计算 两种列类型易表有两种和时间有关的列类型,时间型和时段型,前者表示某一个日期或时间,后者表示一个时间间隔。有效的时间数据99-01-0112:30:12有效的时段数据28:1212:30:12无效的时间数据28:12无效的时段数据99-01-01 如何得到时间间隔利用函数NUnIber可以计算时间间隔,例如:NUmber($”1999-3-1)-Number($ 例如一在打字速度考试中,知道每个学员的用时和字数,如何求
42、得每分钟的平均打字速度呢?很简单,将 “用时”列设为时段型,时段型数据参与运算的时候,将转换为以秒为单位的数值,例如时段 “0:01:30”等于90秒,所以将转换为数值90参与计算。综上所述,平均每分钟打字速度的计算公 式为:1999-2-1*)=28Number($7:303-Number($1:30)=0.25Number函数是将时间转换为以日为单位的数字,所以用这种方式计算得出的时间间隔是以日为单位的。 时段数据的特别之处时段型数据通常表示两个时间的间隔,并且是以秒为单位的(尽管显示为时分秒),所以用NUmber得到两个时间的间隔之后,还必须乘以每天的秒数(86400),才能得到真正的时
43、段型数据,例如:(Number($*7:30*)-Number($*1:28*)*86400=6:02需要的注意的是,上述的公式只有用在时段型列才有效,否那么会得到以秒表示的时间间隔:(NUmber($7:30)-Number($*1:28*)*86400=21720可以用CTilne函数将数值转换为时段数据,例如:CTime(21720)=6:02时段数据可以直接进行加减,例如下列图中,后三列全部为时段型,合计列的刷新公式为:上班时间+加班时间字数/用时*60 例如二在一个工资管理系统中,员工每天的工资按小时计算,每小时的工资为8元,那么工资列的刷新公式应该为:(NUmber(下班时间)-N
44、Umber(上班时间)*24*8如果需要知道每人每天的工作时间长度,可增加一列“工作时数”,将其列类型设为时段型,刷新公式设为:(NUmber(下班时间)-NUmber(上班时间)*86400然后将工资列的刷新公式设为:工作时数3600*8怎么理解上面的公式呢,函数NUmber求出的时间差是以天为单位,乘以24才是小时数,乘以86400(24*3600)得到的才是时段数据。行验证公式 关于行验证公式通过设置行验证公式,可以对愉入的数据进行验证。在执行命令或移动到其它行之前,程序会根据行验证公式检验当前行的有效性,如果当前行不符合行验证公式要求,那么不能执行任何操作。行验证公式必须是一个逻辑表达
45、式。 设置验证公式在“表”菜单上,指向“公式设置”命令,单击“验证公式”,即可输入行验证公式。例如在订单管理系统中,要求每个订单的订货数量必须大于20,而且折扣不能超过10%,那么可以将行验证公式设为:数量20And折扣=0.1 行验证公式的触发条件换行、切换表、执行菜单命令都会触发行验证公式,在同一行不同的列中移动不会触发验证公式。验证提示对于一个友善的应用系统,应该在数据不符合验证条件的时候,给用户一个明确的错误提示。要实现这个目标,必须用MsgBox函数。语法MsgBox(Message,Option,Icon)Message提示信息Option决定MSgBoX函数的返回值,设为0返回F
46、alse,设为1返回TnIe,设为2那么根据用户的选择返回值,用户选择“是返回TnIe,选择“否”返回False。Icon可选参数,指定提示窗口显示的图标,1错误,2询问,3警告,4提示几个例子1、在订单表中,将行验证公式设为:if(折扣0.15,InSgboX(折扣不能超过15%!”,O),True)如果用户输入的折扣超过015,将提示“折扣不能超过15犷,而且用户必须作出更正,才能进行其他操作。2、在订单表中,将行验证公式设为:if(折扣0.15,InSgboX(折扣不能超过15%!”,1),True)如果用户输入的折扣超过015,将提示“折扣不能超过15%”,但是用户可以不作出更正,继续进行其他操作。3、在订单表中,将行验证公式设为:if(折扣0.15,m