求电子表格计算公式的公式解析

Excel各种条件求和的公式汇总_百度经验
&&&&&&电脑
分享有回报:
Excel各种条件求和的公式汇总
经常和Execl打交道的人肯定觉得求和公式是大家时常用到的。Excel里有哪几路求和公式呢?他们的使用方式又是怎样?我为大家汇总一下。
使用SUMIF()公式的单条件求和:如要统计C列中的数据,要求统计条件是B列中数据为&条件一&。并将结果放在C6单元格中,我们只要在C6单元格中输入公式“=SUMIF(B2:B5,&条件一&,C2:C5)”即完成这一统计。
SUM()函数+IF()函数嵌套的方式双条件求和:如统计生产一班生产的质量为“合格”产品的总数,并将结果放在E6单元格中,我们用“条件求和”功能来实现:①选“工具→向导→条件求和”命令,在弹出的对话框中,按右下带“―”号的按钮,用鼠标选定D1:I5区域,并按窗口右边带红色箭头的按钮(恢复对话框状态)。②按“下一步”,在弹出的对话框中,按“求和列”右边的下拉按钮选中“生产量”项,再分别按“条件列、运算符、比较值”右边的下拉按钮,依次选中“生产班组”、“=”(默认)、“生产一班”选项,最后按“添加条件”按钮。重复前述操作,将“条件列、运算符、比较值”设置为“质量”、“=”、“合格”,并按“添加条件”按钮。③两次点击“下一步”,在弹出的对话框中,按右下带“―”号的按钮,用鼠标选定E6单元格,并按窗口右边带红色箭头的按钮。④按“完成”按钮,此时符合条件的汇总结果将自动、准确地显示在E6单元格中。其实上述四步是可以用一段公式来完成的,因为公式中含有数组公式,在E6单元格中直接输入公式:=SUM(IF(D2:D5=&生产一班&,IF(I2:I5=&合格&,E2:E5))),然后再同时按住Ctrl+Shift+Enter键,才能让输入的公式生效。上面的IF公式也可以改一改,SUM(IF((D2:D5=&生产一班&)*(I2:I5=&合格&),E2:E5)),也是一样的,你可以灵活应用,不过注意,IF的嵌套最多7层。除了上面两个我常用的方法外,另外我发现网络上有一个利用数组乘积函数的,这是在百度上发现的,我推荐一下:
SUMPRODUCT()函数方式:表格为:A    B   C   D1 姓名  班 级  性别  余额2 张三  三年五  女   983 李四  三年五  男   1054 王五  三年五  女   335 李六  三年五  女   46现在求求出三年五班女生的总余额。公式:=SUMPRODUCT((B2:B5=&三年五&)*(C2:C5=&女&)*(D2:D5))解释:SUMPRODUCT在给定的几组数组中,将数组间对应的元素相乘,并返回乘积之和。语法 SUMPRODUCT(array1,array2,array3, ...) Array1, array2, array3, ... 为 2 到 30 个数组,其相应元素需要进行相乘并求和。在这里((B2:B5=&三年五&)*(C2:C5=&女&)*(D2:D5))为一个数组,其中(B2:B5=&三年五&)*(C2:C5=&女&)为确定满足准备求和条件的单元格所在的行,*(D2:D5)则是满足求和条件的单元格的范围。第三个函数不常用,我对它也不是很了解,为尊重作者原著,我只有把他的内容贴出来,请见谅。其实上面的第二个方式(sum函数嵌套if函数)和第三个方式(sumproduct函数)不但可以实现双条件求和,也可以实现三条件求和甚至多条件求和的。只不过函数稍微变更一下的。
SUMIFS函数该函数在EXCEL2007中被广泛使用,使用起来更加方便,例如第三个方式中的例子,我们就可以输入公式:“=SUMIFS(D2:D5,B2:B5,&三年五&,C2:C5,&女&)”,是不是更轻松?
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
第1期你不知道的iPad技巧1258次分享
第1期win7电脑那些事2157次分享
第2期新人玩转百度经验332次分享
第1期Win8.1实用小技巧1020次分享
第1期小白装大神491次分享
请扫描分享到朋友圈本帖最后由 shaowu459 于
20:58 编辑
题目虽然写了三个,但是例子主要就阶梯电价来说明,关于部分提成计算及个税计算核心逻辑是一致的。
13:39 上传
13:39 上传
13:39 上传
下载次数: 439
15.55 KB, 下载次数: 439
20:58 上传
下载次数: 181
31.21 KB, 下载次数: 181
本帖评分记录财富
总评分:&财富 + 40&
推荐使用辅助区和数据透视表
在线时间38 小时经验5 威望0 性别保密最后登录注册时间阅读权限10UID1734365积分5帖子精华0分享0
EH新人, 积分 5, 距离下一级还需 15 积分
积分排行3000+帖子精华0微积分0
看了这个终于明白个税的计算公司怎么来的了 谢谢
&看来我说的还是比较明白的:)&
在线时间5288 小时经验11461 威望8 最后登录注册时间阅读权限100UID361650积分13061帖子精华2分享6
管理以下版块
积分排行44帖子精华2微积分0
演示+语音讲解已更新到
推荐使用辅助区和数据透视表
在线时间780 小时经验599 威望0 性别男最后登录注册时间阅读权限30UID84100积分599帖子精华0分享0
EH中级, 积分 599, 距离下一级还需 501 积分
积分排行1766帖子精华0微积分0
用面积来表示,很形象!附件能以2003版的格式再传一份么?
在线时间5288 小时经验11461 威望8 最后登录注册时间阅读权限100UID361650积分13061帖子精华2分享6
管理以下版块
积分排行44帖子精华2微积分0
中原一布衣 发表于
用面积来表示,很形象!附件能以2003版的格式再传一份么?
2003版已经上传,参考。
推荐使用辅助区和数据透视表
在线时间47 小时经验18 威望0 性别保密最后登录注册时间阅读权限10UID719115积分18帖子精华0分享0
EH新人, 积分 18, 距离下一级还需 2 积分
积分排行3000+帖子精华0微积分0
如果阶梯较少的话,可以用if函数如:计算a1中的电价可以用=IF(A1&600,425+(A1-600)*0.98,IF(A1&260,176.8+(A1-260)*0.73,A1*0.68))
在线时间1283 小时经验1373 威望0 性别男最后登录注册时间阅读权限50UID26216积分1373帖子精华0分享0
EH高级, 积分 1373, 距离下一级还需 627 积分
积分排行756帖子精华0微积分0
谢谢楼主。又进步了。
在线时间78 小时经验15 威望0 性别男最后登录注册时间阅读权限10UID133157积分15帖子精华0分享0
EH新人, 积分 15, 距离下一级还需 5 积分
积分排行3000+帖子精华0微积分0
这写得真好!谢谢!
在线时间4 小时经验4 威望0 性别保密最后登录注册时间阅读权限10UID2226834积分4帖子精华0分享0
EH新人, 积分 4, 距离下一级还需 16 积分
积分排行3000+帖子精华0微积分0
确实很好,学习了!
在线时间250 小时经验191 威望0 性别保密最后登录注册时间阅读权限20UID1157015积分191帖子精华0分享0
EH初级, 积分 191, 距离下一级还需 159 积分
积分排行3000+帖子精华0微积分0
形象& & 易懂
积分≥4700即可申请
优秀管理者
优秀管理者勋章No.1
金牌优秀会员
金牌优秀会员奖章No.1
优秀会员奖章No.1
优秀会员奖章No.2
- 注意:自起,未完成邮箱认证的会员将无法发帖!如何完成邮箱认证?请点击下方“查看”。
关注我们,与您相约微信公众平台!
Copyright 1999 - 2017 Excel Home. All Rights Reserved.本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!
Powered by
本站特聘法律顾问:徐怀玉律师 李志群律师 &&excel函数公式详细解析_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
193页免费24页免费61页免费2页¥1.0010页免费 5页免费16页免费9页免费91页4下载券1页免费
喜欢此文档的还喜欢95页1下载券34页1下载券41页1下载券94页1下载券87页1下载券
excel函数公式详细解析|文​档​资​料​搜​集​整​理
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢问题请见附件。多谢
10:55 上传
下载次数: 8
3.96 KB, 下载次数: 8
在线时间683 小时经验506 威望0 性别男最后登录注册时间阅读权限30UID198628积分506帖子精华0分享0
EH中级, 积分 506, 距离下一级还需 594 积分
积分排行2148帖子精华0微积分0
=SUM(N(INDIRECT(&A&&{2,3,4,5,6})))
加个N,原因楼下回答
在线时间377 小时经验862 威望0 最后登录注册时间阅读权限30UID1355820积分862帖子精华0分享0
EH中级, 积分 862, 距离下一级还需 238 积分
积分排行1220帖子精华0微积分0
bpsinopec 发表于
=SUM(N(INDIRECT(&A&&{2,3,4,5,6})))
加个N,原因楼下回答
貌似没人回答,烦请讲解下可否?
在线时间203 小时经验705 威望0 性别保密最后登录注册时间阅读权限30UID1320431积分705帖子精华0分享0
EH中级, 积分 705, 距离下一级还需 395 积分
积分排行1508帖子精华0微积分0
pupil.y 发表于
貌似没人回答,烦请讲解下可否?
还是等侠圣吧,如骾在喉!
在线时间377 小时经验862 威望0 最后登录注册时间阅读权限30UID1355820积分862帖子精华0分享0
EH中级, 积分 862, 距离下一级还需 238 积分
积分排行1220帖子精华0微积分0
xtzxf0011 发表于
还是等侠圣吧,如骾在喉!
顶起来……
在线时间4764 小时经验19017 威望9 最后登录注册时间阅读权限100UID688250积分19217帖子精华0分享0
管理以下版块
积分排行15帖子精华0微积分0
xtzxf0011 发表于
还是等侠圣吧,如骾在喉!
indirect的参数为数组时,需要外套N()或T()函数才能返回正确的结果,offset的第二、三参数如果为数组,同样也要这样处理才能得到正确结果。
在线时间4764 小时经验19017 威望9 最后登录注册时间阅读权限100UID688250积分19217帖子精华0分享0
管理以下版块
积分排行15帖子精华0微积分0
offset的解法如下。=SUM(N(OFFSET(A1,{1,2,3,4,5},)))复制代码
在线时间377 小时经验862 威望0 最后登录注册时间阅读权限30UID1355820积分862帖子精华0分享0
EH中级, 积分 862, 距离下一级还需 238 积分
积分排行1220帖子精华0微积分0
laowuwyx 发表于
offset的解法如下。
难道是规定的用法……?!
多谢laowuuyx大侠的精彩讲解,这个我得记一下
在线时间4764 小时经验19017 威望9 最后登录注册时间阅读权限100UID688250积分19217帖子精华0分享0
管理以下版块
积分排行15帖子精华0微积分0
pupil.y 发表于
难道是规定的用法……?!
多谢laowuuyx大侠的精彩讲解,这个我得记一下
这个问题比较复杂,个人认为碰到类似问题会处理就可以了,如果还想深入了解,请详见大头版主的帖子。
在线时间377 小时经验862 威望0 最后登录注册时间阅读权限30UID1355820积分862帖子精华0分享0
EH中级, 积分 862, 距离下一级还需 238 积分
积分排行1220帖子精华0微积分0
laowuwyx 发表于
这个问题比较复杂,个人认为碰到类似问题会处理就可以了,如果还想深入了解,请详见大头版主的帖子。http ...
哦哦,不用深入研究,会用就可以了,而且刚我去看了一下那个帖子……告诉我权限不够……郁闷
积分≥4700即可申请
最佳会员奖章No.1
金牌优秀会员
金牌优秀会员奖章No.1
金牌优秀会员
金牌优秀会员奖章No.2
优秀会员奖章No.1
优秀会员奖章No.2
优秀会员奖章No.3
- 注意:自起,未完成邮箱认证的会员将无法发帖!如何完成邮箱认证?请点击下方“查看”。
关注我们,与您相约微信公众平台!
Copyright 1999 - 2017 Excel Home. All Rights Reserved.本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!
Powered by
本站特聘法律顾问:徐怀玉律师 李志群律师 &&Cell产品背景:
Cell组件、插件是中国第一个商业控件,采用ActiveX技术,能够快速制作出专业的各种复杂的中国报表,拥有600多个编程接口,实现报表自定义,报表显示、打印预览、打印,图表,公式,自定义函数、资源本地化等强大功能,能够完全读写Excel档。Cell完全解决了excel在使用的过程中出现的制表不稳定、程序运行慢且效率低、经常出现莫名其妙的错误以及要求客户机器上必须安装excel等等问题。
典型功能 &制作中国式的复杂报表 &丰富的单元格式与设计 &强大的打印及打印预览 &别具一格的选择接口 &强大的图表功能 &强大的单元公式 &自定义函数 &与Excel文件格式的兼容 &名称管理(单元格命名, 数字、字符串、公式、区域命名), &资源本地化 &转换PDF、CSV格式文件
&&&&&&&&&& 公式的解析运算, 对一个表格控件来说, 是必不可少的一个部分. 在数据汇总, 周报年报总结等多种应用环境. 但是, 表格控件有其特殊的地方, 表格是以一个一个的格式构成的, 没有公式都是有自己的一个位置的. 每个单元格公式都是跟其他单元格有相互引用, 跨表页引用等多种情况.
&&&&&&&&&& Cell根据表格控件的各种特性, 自主研发了适合表格控件的一套公式解析计算引擎. 如图:
这里, 我将分几篇文章, 详细介绍一下Cell是如何实现上图中的各个部分.
Cell公式解析:
&&&&&&&&&& 如何对单元格设置一个公式, 相信每个人都很熟悉Excel的应用, Cell本身的模板设计器, 跟Excel有很多的共同之处, 你只需要在Cell单元格上按一下 &=& 号, Cell 的公式编辑器就会显示在Cell 的顶端(类似Excel的公式栏), 选中 &B2& 单元格, 按&=&号, 其中输入&A1&, 引用单元格A1的内容. 这样, B2 就有一个公式了, 在修改A1单元格内容的时候, B2 的值就会改变.
我们也可以通过接口的方式来设置公式, 可以调用Cell接口SetFormula, 详细用法请参考
Cell对公式是如何解析的呢??
在输入公式的时候, 经过词法分析, Cell将输入的公式字符串解析为中间代码, 存储在SG_Formula, SG_EXPR, SG_POLISH_UNIT 结构中.
struct SG_Formula
&&&&&&& long&&&&& &
&&&&&&& long&&&&& &
&&&&&&& long&&&&& &
&&&&&&& CString &&&& //公式字符串
&&&&&&& long&&&&& &
&&&&&&& SG_EXPR&&
struct& SG_EXPR
&&&&&&& SG_ENUM_VALUE &&&&&&
&&&&&&& USHORT& &&&&&&&&
&&&&&&& SG_POLISH_UNIT &*
struct& SG_POLISH_UNIT
&&&&&&& SG_ENUM_POLITYPE
&&&&&&& short &&&&&&&&&&&&
&&&&&&& short &&&&&&&&&&&&
&&&&&&& union
&&&&&&&&&&&&&&& &double&&&&&&&& &&f;&&&&&&&&&&&&&&&&&&&&&&& &// value for a numerical constant
&&&&&&&&&&&&&&& &LPTSTR&&&&&&&&&&&&&&&&& & s;&&&&&&&&&&&&&&&&&&&&&& &// a string , may occur is logic expr
&&&&&&&&&&&&&&& &SG_ENUM_OPERATOR& &&&&&&&&&&&&&&&& // inner code for an operator */
&&&&&&&&&&&&&&& &SG_AREA&&&&&&&&&& &&&&&&&&&&&&&&&&&& // an area&
&&&&&&&&&&&&&&& &SG_3DCell&&&&&&&&&& &&&&&&&&&&&&&&&&& // a cell
&&&&&&&&&&&&&&& &SG_FUNCCALL&&&&&& *funcC&&&&&&&&&&&&& // a function call
&&&&&&& };
SG_POLISH_UNIT: 存储一个基本的语法单位. SG_ENUM_POLITYPE标示此语法单位的类型
SG_EXPR: 存储一个解析后的公式, 由多个SG_POLISH_UNIT组成
SG_Formula: 存储公式整个公式的信息, 包括位置, 公式解析后的 SG_EXPR
解析后的公式在cell中的都是存储在一个SG_Formula结构中.
我通过一个例子, 来看看Cell如何解析一个公式的.
例如 输入这样的一个公式 B2=A1+1+2
词法分析就是从左到右逐个字符的对公式进行扫描, 分析出其中单词符号.Cell中的单词符号的种类分为 6 种, 对应于SG_POLISH_UNIT中的 6 中类型, 即:
Double: 数值类型
String : 字符串类型
SG_ENUM_OPERATOR : 操作运算符类型 ( 如: &+&, &-&, &and& &:&, &&& 等)
SG_AREA: 单元格区域类型 (如: A1:B2, B3:B4)
SG_3DCell: 单个单元格类型 (如: A1)
SG_FUNCCALL: 函数类型
对于我们例子输入的公式来说, 我们可以将公式分解为下面5个单词符号
&A1& -& SG_3DCel类型
&+& -&& SG_ENUM_OPERATOR 操作符
&1& , &2& -& Double 数值类型
Cell对公式扫描过程中, 最终也是生成这样的一个单词符号组合. 解析过程中,
按照& 以字符开头的符号 & 数字符号 && 字符串 & 其他符号 的过程解析的,
下面是Cell获得单词符号的代码.
SG_ENUM_TOKEN GetToken( )
&&&&&&& USES_CONVERSION;
&&&&&&& LPCTSTR curstr = sourcecode +&
&&&&&&& if( curtoken == TOKEN_CODE_END ){
&&&&&&&&&&&&&&& return TOKEN_CODE_END;
&&&&&&& //去掉空格
&&&&&&& while ( ( unsigned ) *curstr &= 32 && *curstr& != _T('/n') && *curstr& != 0 )
&&&&&&&&&&&&&&& ++
&&&&&&& //去掉双斜杠注释
&&&&&&& if( *curstr == _T('/') && *(curstr+1) == _T('/') )
&&&&&&&&&&&&&&& curstr += 2;
&&&&&&&&&&&&&&& while( TRUE )
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& if( *curstr == 0x0d && *(curstr+1) == 0x0a)
&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curstr += 2;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& else if( *curstr == 0 )
&&&&&&&&&&&&&&&&&&&&&&& else curstr++;
&&&&&&&&&&&&&&& }
&&&&&&& realstartpos = curstr -
&&&&&&& lastpos =
&&&&&&& //=========================&& any token begin with alpha or chinese
&&&&&&& if ( (*curstr&0x80) || _istalpha( *curstr ) || *curstr == _T('$')) {
&&&&&&&&&&&&&&& while( _istalnum( *curstr ) || *curstr == '_' || *curstr & 0x80 || *curstr == _T('$')){
&&&&&&&&&&&&&&&&&&&&&&& &//*curstr = tolower( *curstr );
&&&&&&&&&&&&&&&&&&&&&&& &++
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& CopyTokenString( realstartpos, curstr-sourcecode);
&&&&&&&&&&&&&&& if( (curstr-sourcecode) - realstartpos+1 & SG_MAX_TOKEN_LEN)
&&&&&&&&&&&&&&&&&&&&&&& throw ERR_TOKEN_TOOLONG;
&&&&&&&&&&&&&&& if ( m_Func-&IsFunction( curtokenstr ) )
&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_FUNC;
&&&&&&& &&&&&&& else if( _tcsicmp( curtokenstr, _T("and") ) == 0 )
&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_AND;
&&&&&&&&&&&&&&& else if( _tcsicmp( curtokenstr, _T("or") ) == 0 )
&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_OR;
&&&&&&&&&&&&&&& else if( _tcsicmp( curtokenstr, _T("not") ) == 0 )
&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_NOT;
&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_ID;
&&&&&&& //========================= =& digit token: include integer and float number
&&& else if ( _istdigit( *curstr ) || *curstr == _T('.') ) {
&&&&&&&&&&&&&&& if( _istdigit( *curstr )){
&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_INTEGER;&&&&
&&&&&&&&&&&&&&&&&&&&&&& while( _istdigit( *++curstr ) );
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& if( *curstr == '.' ){
&&&&&&&&&&&&&&&&&&&&&&& while( _istdigit( *++curstr ) );
&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_FLOAT_NUM;
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& if ( *curstr == 'e' || *curstr == 'E' ){
&&&&&&&&&&&&&&&&&&&&&&& if ( curstr[1] == '+' || curstr[1] == '-' ){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if ( !_istdigit( curstr[2] ) )
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& throw ERR_EXPNT_EXPECTED;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ++
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& if ( _istdigit( curstr[1] ) ){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& while ( _istdigit( *++curstr ) );
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_FLOAT_NUM;
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& //要求其后面不是!
&&&&&&&&&&&&&&& BOOL numvalid = TRUE;
&&&&&&&&&&&&&&& LPCTSTR tstr =
&&&&&&&&&&&&&&& while( *tstr != 0 ){
&&&&&&&&&&&&&&&&&&&&&&& if( *tstr == 32 ){ tstr++; }
&&&&&&&&&&&&&&&&&&&&&&& else if( *tstr == '!' ){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& numvalid = FALSE;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& if( numvalid ){
&&&&&&&&&&&&&&&&&&&&&&& CopyTokenString( realstartpos, curstr-sourcecode );
&&&&&&&&&&&&&&&&&&&&&&& if ( curtoken == TOKEN_INTEGER ){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if ( _tcslen( curtokenstr ) & 10 || ( _tcslen( curtokenstr ) == 10 ){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_FLOAT_NUM;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& floattokenval = ttof( curtokenstr );
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& inttokenval = _ttol ( curtokenstr );
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& floattokenval = ttof( curtokenstr );
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& else{&&&&&&& //这是一个页签
&&&&&&&&&&&&&&&&&&&&&&& CopyTokenString( realstartpos, curstr-sourcecode);
&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_ID;
&&&&&&&&&&&&&&& }
&&&&&&& //==============================&&&&&&& string token: like "Avsd"&
&&&&&&& else if ( *curstr == '"' ) {
&&&&&&&&&&&&&&& do {
&&&&&&&&&&&&&&&&&&&&&&& ++
&&&&&&&&&&&&&&& }while( !(*curstr& == '"' && *(curstr-1) != '//' ) && *curstr );
&&&&&&&&&&&&&&& if ( *curstr == 0 )
&&&&&&&&&&&&&&&&&&&&&&& throw ERR_YIN_HAO_UNMATCH;
&&&&&&&&&&&&&&& //CopyTokenString( realstartpos+1, curstr-sourcecode );
&&&&&&&&&&&&&&& strtokenval = sourcecode+realstartpos+1;
&&&&&&&&&&&&&&& strtokenlen = (curstr-sourcecode)-realstartpos-1;
&&&&&&&&&&&&&&& ++
&&&&&&&&&&&&&&& curtoken = TOKEN_STRING;
&&&&&&& &}
&&&&&&& //=================================& any other token
&&&&&&& else {
&&&&&&&&&&&&&&& switch( *curstr ){
&&&&&&&&&&&&&&&&&&&&&&& case& ':':&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_MAO_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& case& '/n':
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtokenstr[0] = 0;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_LINE_END;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& && case '/0':
&&&&&&&&&&&&&&&&&&&&&&& && curtokenstr[0] = 0;
&&&&&&&&&&&&&&&&&&&&&&& && curtoken = TOKEN_CODE_END;
&&&&&&&&&&&&&&&&&&&&&&& &&
&&&&&&&&&&&&&&& && case& ',':
&&&&&&&&&&&&&&&&&&&&&&& &&& curtoken = TOKEN_DOU_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& case& '!':
&&&&&&&&&&&&&&&&&&&&&&& &&& curtoken = TOKEN_TANG_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&& case '/' :
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_DIV_OP;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& && case '-':
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_MINUS_OP;
&&&&&&&&&&&&&&&&&&&&&&& &&
&&&&&&&&&&&&&&& && case '+':
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_ADD_OP;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& && case '*':
&&&&&&&&&&&&&&&&&&&&&&& && curtoken = TOKEN_MULTI_OP;
&&&&&&&&&&&&&&&&&&&&&&& &&
&&&&&&&&&&&&&&& && case '(':
&&&&&&&&&&&&&&&&&&&&&&& && curtoken = TOKEN_L_KUO_HAO;
&&&&&&&&&&&&&&&&&&&&&&& &&
&&&&&&&&&&&&&&&&&&&&&&& case ')':
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & curtoken = TOKEN_R_KUO_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&&&&&&&&&& case '=':
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & curtoken = TOKEN_EQUAL_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&& &&& case '&':
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if ( *(curstr+1) == '=' ){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curstr++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_EQGREAT_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_GREAT_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& case '&':
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if ( *(curstr+1) == '=' ){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curstr++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_EQSMALL_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& else if ( *(curstr+1) == '&' ){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curstr++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_NOTEQ_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_SMALL_HAO;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& case '^':
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & curtoken = TOKEN_POWER;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &
&&&&&&&&&&&&&&&&&&&&&&& default :
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& curtoken = TOKEN_UNKNOWN;
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& curtokenstr[0] = *curstr++;
&&&&&&&&&&&&&&& curtokenstr[1] = '/0';
&&&&&&& curpos = curstr -
&&&&&&& tokenstartpos =
Cell通过词法分析, 会将公式 A1+1+2 分解为 5 个基本的语法单位. 每一个语法单位存储在SG_POLISH_UNIT. &5个语法单位构成一个公式SG_EXPR.
A1+1+2 分解后, 每一单位都会分配一个Cell可以识别的单词符号, 如 &A1& 识别为一个T_CELL类型的符号, &+& 识别为一个 O_ADD 操作运算符号等
每一个语法单位通过 startpos endpos 对应到你输入的源公式字符串. 方便以后对公式做调整.
分解后的5个语法单位以数组的形式存储在公式SG_EXPR 中的 polishs 成员中.
这样, 输入的公式经过词法分析后, 我们得到了 语法单位的 类型, 单词符号, 还有每个语法单位对应的一个Cell内部类型对象. 为随后的合法性验证, 公式计算的打下基础.
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1736次
排名:千里之外

我要回帖

更多关于 电子表格计算公式 的文章

 

随机推荐