Excel如何使用excel表格?

excel如何录制宏?excel宏的使用图文教程
作者:佚名
字体:[ ] 来源:互联网 时间:10-13 10:24:52
excel如何录制宏?excel宏功能可以让Excel帮我们完成大量重复的动作,从而提高工作效率,下面脚本之家小编就为大家带来excel宏的使用图文教程,一起来看看吧
为了简省操作,用户可以在Excel中将录制好的宏直接应用到其他表格当中,说到录制宏有很多用户都不会,那么excel如何录制宏?下面脚本之家小编就为大家带来excel宏的使用图文教程,一起来看看吧!
1、excel宏在哪里呢,打开excel表格,点击左上角的office图标,然后选择excel选项。
2、在excel选项的常用中勾选在功能区显示&开发工具&选项卡,然后点击确定。
3、此时在excel开发工具中就可以点击录制excel宏。
4、设置excel宏的名称,快捷键,同时设置保存在何处,然后点击确定。
5、在excel宏中有个是否使用相对引用需要注意一下,然后对excel表做一些更改,小编就改一下字体颜色。
6、excel宏录制好之后我们便可以点击停止录制了。
7、将光标定位在其它单元格,然后按自己设置的excel宏快捷键就可以自动修改字体颜色了。小编这里只举一个最简单的例子,其它复杂一些的工作同样可以使用excel宏来处理。
以上就是excel宏的使用图文教程,大家看明白了吗?希望这篇教程对大家有所帮助,谢谢阅读!
大家感兴趣的内容
12345678910
最近更新的内容名师幽默的声音,考试重点和难点讲解,每天限额200张,抢完为止!改变,从这一刻开始!
你现在的位置:> >
2015年Excel教程技巧大全:电子表格使用技巧
会计城 | 日
来源 : 网络
本文由会计网小编为您介绍2015年Excel教程技巧大全:电子表格使用技巧。关于Excel教程技巧大全具体内容请看下文。
  01、如何在已有的单元格中批量加入一段固定字符?
  例如:在单位的人事资料,在excel中输入后,由于上级要求在原来的职称证书的号码全部再加两位,即要在每个人的证书号码前再添上两位数13,如果一个一个改的话实在太麻烦了,那么我们可以用下面的办法,省时又省力:
  1)假设证书号在A列,在A列后点击鼠标右键,插入一列,为B列;
  2)在B2单元格写入: ="13" & A2 后回车;
  3)看到结果为 13xxxxxxxxxxxxx 了吗?鼠标放到B2位置,单元格的下方不是有一个小方点吗,按着鼠标左键往下拖动直到结束。当你放开鼠标左键时就全部都改好了。若是在原证书号后面加13 则在B2单元格中写入:=A2 & “13” 后回车。
  02、如何设置文件下拉窗口的最下面的最近运行的文件名个数?
  打开“工具”,选“选项”,再选“常规”,在“最近使用的文件清单”下面的文件个数输入框中改变文件数目即可。若不在菜单中显示最近使用的文件名,则将“最近使用的文件清单”前的复选框去掉即可。
  03、在EXCEL中输入如“1-1”、“1-2”之类的格式后它即变成1月1日,1月2日等日期形式,怎么办?
  这是由于EXCEL自动识别为日期格式所造成,你只要点击主菜单的“格式”菜单,选“单元格”,再在“数字”菜单标签下把该单元格的格式设成文本格式就行了。
  04、在EXCEL中如何使它象WORD一样的自动定时保存文件?
  点击“工具”菜单“自动保存”项,设置自动保存文件夹的间隔时间。如果在“工具”菜单下没有“自动保存”菜单项,那么执行“工具”菜单下“加载宏...”选上“自动保存”,“确定”。然后进行设置即可。
  05、用Excel做多页的表格时,怎样像Word的表格那样做一个标题,即每页的第一行(或几行)是一样的。但是不是用页眉来完成?
  在EXCEL的文件菜单-页面设置-工作表-打印标题;可进行顶端或左端标题设置,通过按下折叠对话框按钮后,用鼠标划定范围即可。这样Excel就会自动在各页上加上你划定的部分作为表头。
  06、在Excel中如何设置加权平均?
  加权平均在财务核算和统计工作中经常用到,并不是一项很复杂的计算,关键是要理解加权平均值其实就是总量值(如金额)除以总数量得出的单位平均 值,而不是简单的将各个单位值(如单价)平均后得到的那个单位值。在Excel中可设置公式解决(其实就是一个除法算式),分母是各个量值之和,分子是相 应的各个数量之和,它的结果就是这些量值的加权平均值。
  07、如果在一个Excel文件中含有多个工作表,如何将多个工作表一次设置成同样的页眉和页脚?如何才能一次打印多个工作表?
  把鼠标移到工作表的名称处(若你没有特别设置的话,Excel自动设置的名称是“sheet1、sheet2、 sheet3.......”),然后点右键,在弹出的菜单中选择“选择全部工作表”的菜单项,这时你的所有操作都是针对全部工作表了,不管是设置页眉和 页脚还是打印你工作表。
  08、EXCEL中有序号一栏,由于对表格进行调整,序号全乱了,可要是手动一个一个改序号实在太慢太麻烦,用什么方法可以快速解决?
  如果序号是不应随着表格其他内容的调整而发生变化的话,那么在制作EXCEL表格时就应将序号这一字段与其他字段分开,如在“总分”与“排名”之间空开一列,为了不影响显示美观,可将这一空的列字段设为隐藏,这样在调整表格(数据清单)的内容时就不会影响序号了。
  09、用Excel2000做成的工资表,只有第一个人有工资条的条头(如编号、姓名、岗位工资.......),想输出成工资条的形式。怎么做?
  这个问题应该这样解决:先复制一张工资表,然后在页面设置中选中工作表选项,设置打印工作表行标题,选好工资条的条头,然后在每一个人之间插入 行分页符,再把页长设置成工资条的高度即可。使用自定义方式重装了一遍中文office,Excel的打印纸选项中只有A4一种,怎么办?随便安装一个打 印机驱动程序就可以了。
  10、在Excel中小数点无法输入,按小数点,显示的却是逗号,无论怎样设置选项都无济于事,该怎么办?
  这是一个比较特殊的问题,我曾为此花了十几个小时的时间,但说白了很简单。在Windows的控制面板中,点击“区域设置”图标,在弹出的“区 域设置属性”对话面板上在“区域设置”里选择“中文(中国)”,在“区域设置属性”对话面板上在“数字”属性里把小数点改为“.”(未改前是“,”),按 “确定”按钮结束。这样再打开Excel就一切都正常了。
  11、如何快速选取特定区域?
  使用F5键可以快速选取特定区域。例如,要选取A2:A1000,最简便的方法是按F5键,出现“定位”窗口,在“引用”栏内输入需选取的区域A2:A1000。
  12、如何快速返回选中区域?
  按Ctr+BacksPae(即退格键)。
  13、如何快速定位到单元格?
  方法一:按F5键,出现“定位”对话框,在引用栏中输入欲跳到的单元格地址,单市“确定”按钮即可。
  方法二:单击编辑栏左侧单元格地址框,输入单元格地址即可。
  14、“Ctrl+*”的特殊功用
  一般来说,当处理一个工作表中有很多数据的表格时,通过选定表格中某个单元格,然后按下 Ctrl+* 键可选定整个表格。Ctfl+* 选定的区域是这样决定的:根据选定单元格向四周辐射所涉及到的有数据单元格的最大区域。
  15、如何快速选取工作表中所有包含公式的单元格?
  有时,需要对工作表中所有包含公式的单元格加以保护,或填入与其他单元格不同的颜色,以提醒用户注意不能在有此颜色的区域内输入数据。以下方法 可以帮助快速选取所有包含公式的单元格:选择“编辑”“定位”,单击“定位条件”按钮,在“定位条件”对话框中选择“公式”项,按“确定”按钮即可。
  16、如何在不同单元格中快速输入同一数内容?
  选定单元格区域,输入值,然后按 Ctrl+ Ener键,即可实现在选定的单元格区域中一次性输入相同的值。
  17、只记得函数的名称,但记不清函数的参数了,怎么办?
  如果你知道所要使用函数的名字,但又记不清它的所有参数格式,那么可以用键盘快捷键把参数粘贴到编辑栏内。
  具体方法是:在编辑栏中输入一个等号其后接函数名,然后按 Ctr+ A键,Excel则自动进入“函数指南&&步骤 2之2”。当使用易于记忆的名字且具有很长一串参数的函数时,上述方法显得特别有用。
  18、如何把选定的一个或多个单元格拖放至新的位置?
  按住Shift键可以快速修改单元格内容的次序。
  具体方法是:选定单元格,按下Shift键,移动鼠标指针至单元格边缘,直至出现拖放指针箭头(空心箭头),然后按住鼠标左键进行拖放操作。上 下拖拉时鼠标在单元格间边界处会变为一个水平“工”状标志,左右拖拉时会变为垂直“工”状标志,释放鼠标按钮完成操作后,选定的一个或多个单元格就被拖放 至新的位置。
  19、如何让屏幕上的工作空间变大?
  可以将不用的工具栏隐藏,也可以极大化Excel窗口,或者在“视图”菜单中选择“全屏显示”命令。
  20、如何使用快显菜单?
  快显菜单中包括了一些操作中最常用的命令,利用它们可以大大提高操作效率。首先选定一个区域,然后单击鼠标右健即可调出快显菜单,根据操作需要选择不同命令。
  21、如何使用快显菜单?
  快显菜单中包括了一些操作中最常用的命令,利用它们可以大大提高操作效率。首先选定一个区域,然后单击鼠标右健即可调出快显菜单,根据操作需要选择不同命令。
  22、如何防止Excel自动打开太多文件?
  当Excel启动时,它会自动打开Xlstart目录下的所有文件。当该目录下的文件过多时,Excel加载太多文件不但费时而且还有可能出 错。解决方法是将不该位于Xlstart目录下的文件移走。另外,还要防止EXcel打开替补启动目录下的文件:选择“工具”“选项”“普通”,将 “替补启动目录”一栏中的所有内容删除。
  23、如何去掉网格线?
  1)除去编辑窗口中的表格线
  单击“工具”菜单中的“选项”,再选中“视图”,找到“网格线”,使之失效;
  2)除去打印时的未定义表格线
  有时会出现这样的情况:你在编辑时未定义的表格线(在编辑窗中看到的也是淡灰色表格线),一般情况下在打印时是不会打印出来的,可有时却偏偏不 听使唤给打印出来了,特别是一些所谓的“电脑”VCD中编辑的Excel表格更是这样。要除去这些表格线,只要在单击“文件”、“页面设置”、“工作表” 菜单,点击一下“网格线”左边的选择框,取消选择“网格线”就行了。
  24、如何快速格式化报表?
  为了制作出美观的报表,需要对报表进行格式化。有快捷方法,即自动套用Excel预设的表格样式。方法是:选定操作区域,选取“格式”菜单中的 “自动套用格式”命令,在格式列表框中选取一款你满意的格式样式,按“确定”按钮即可。要注意的是,格式列表框下面有包括“数字”、“边框线”、“字体” 等6个“应用格式种类”选项,若某项前面的“x”不出现,则在套用表格样式时就不会用该项。
  25、如何快速地复制单元格的格式?
  要将某一格式化操作复制到另一部分数据上,可使用“格式刷”按钮。选择含有所需源格式的单元格,单击工具条上的“格式刷”按钮,此时鼠标变成了刷子形状,然后单击要格式化的单元格即可将格式拷贝过去。
  26、如何为表格添加斜线?
  一般我们习惯表格上有斜线,而工作表本身并没有提供该功能。其实,我们可以使用绘图工具来实现:单击“绘图”按钮,选取“直线”,鼠标变成十字 型.将其移至要添加斜线的开始位置,按住鼠标左键拖动至终止位置,释放鼠标,斜线就画出来了。另外,使用 “文字框”按钮可以方便地在斜线上下方添加文字,但文字周围有边框,要想取消它,可选中文字框,调出快显菜单,选择“对象格式”“图案”,选择“无边 框”项即可。
  27、如何快速地将数字作为文本输入?
  在输入数字前加一个单引号“”&,可以强制地将数字作为文本输入。
  28、如何定义自己的函数?
  用户在Excel中可以自定义函数。切换至 Visual Basic模块,或插入一页新的模块表(Module),在出现的空白程序窗口中键入自定义函数VBA程序,按Enter确认后完成编写工作,Excel 将自动检查其正确性。此后,在同一工作薄内,你就可以与使用Exed内部函数一样在工作表中使用自定义函数,如:
  Function Zm(a)
  If a& 60 Then im=&不及格”
  Else Zm=“及格”
  End If
  End Function
  29、如何在一个与自定义函数驻留工作簿不同的工作簿内的工作表公式中调用自定义函数?
  可在包含自定义函数的工作薄打开的前提下,采用链接的方法(也就是在调用函数时加上该函数所在的工作簿名)。假设上例中的自定义函数Zm所在工 作薄为MYUDF.XLS,现要在另一不同工作簿中的工作表公式中调用Zm函数,应首先确保MYUDF.XLS被打开,然后使用下述链接的方法:= MYUDF.XLS! ZM(b2)
  30、如何快速输入数据序列?
  如果你需要输入诸如表格中的项目序号、日期序列等一些特殊的数据系列,千万别逐条输入,为何不让Excel自动填充呢?在第一个单元格内输入起 始数据,在下一个单元格内输入第二个数据,选定这两个单元格,将光标指向单元格右下方的填充柄,沿着要填充的方向拖动填充柄,拖过的单元格中会自动按 Excel内部规定的序列进行填充。如果能将自己经常要用到的某些有规律的数据(如办公室人员名单),定义成序列,以备日后自动填充,岂不一劳永逸!选择 “工具”菜单中的“选项”命令,再选择“自定义序列”标签,在输入框中输入新序列,注意在新序列各项2间要输入半角符号的逗号加以分隔(例如:张三,李 四,王二&&),单击“增加”按钮将输入的序列保存起来。
  31、使用鼠标右键拖动单元格填充柄
  上例中,介绍了使用鼠标左键拖动单元格填充柄自动填充数据序列的方法。其实,使用鼠标右键拖动单元格填充柄则更具灵活性。在某单元格内输入数 据,按住鼠标右键沿着要填充序列的方向拖动填充柄,将会出现包含下列各项的菜单:复制单元格、以序列方式填充、以格式填充、以值填充;以天数填充、以工作 日该充、以月该充、以年填充;序列&&此时,你可以根据需要选择一种填充方式。
  32、如果你的工作表中已有某个序列项,想把它定义成自动填充序列以备后用,是否需要按照上面介绍的自定义序列的方法重新输入这些序列项?
  不需要。有快捷方法:选定包含序列项的单元格区域,选择“工具”“选项”“自定义序列”,单击“引入”按钮将选定区域的序列项添加至“自定义序列”对话框,按“确定”按钮返回工作表,下次就可以用这个序列项了。
  33、上例中,如果你已拥育的序列项中含有许多重复项,应如何处理使其没有重复项,以便使用“引入”的方法快速创建所需的自定义序列?
  选定单元格区域,选择“数据”“筛选”“高级筛选”,选定“不选重复的记录”选项,按“确定”按钮即可。
  34、如何对工作簿进行安全保护?
  如果你不想别人打开或修改你的工作簿,那么想法加个密码吧。打开工作薄,选择“文件”菜单中的“另存为”命令,选取“选项”,根据用户的需要分别输入“打开文件口令”或“修改文件D令”,按“确定”退出。
  工作簿(表)被保护之后,还可对工作表中某些单元格区域的重要数据进行保护,起到双重保护的功能,此时你可以这样做:首先,选定需保护的单元格 区域,选取“格式”菜单中的“单元格”命令,选取“保护”,从对话框中选取“锁定”,单由“确定”按钮退出。然后选取“工具”菜单中的“保护”命令,选取 “保护工作表”,根据提示两次输入口令后退出。
  注意:不要忘记你设置有“口令”。
  35、如何使单元格中的颜色和底纹不打印出来?
  对那些加了保护的单元格,还可以设置颜色和底纹,以便让用户一目了然,从颜色上看出那些单元格加了保护不能修改,从而可增加数据输入时的直观感 觉。但却带来了问题,即在黑白打印时如果连颜色和底纹都打出来,表格的可视性就大打折扣。解决办法是:选择“文件”“页面设置”“工作表”,在“打 印”栏内选择“单元格单色打印”选项。之后,打印出来的表格就面目如初了。
  36、工作表保护的口令忘记了怎么办?
  如果你想使用一个保护了的工作表,但口令又忘记了,有办法吗?有。选定工作表,选择“编辑”“复制”、“粘贴”,将其拷贝到一个新的工作薄中(注意:一定要是新工作簿),即可超越工作表保护。当然,提醒你最好不用这种方法盗用他人的工作表。
  37、“$”的功用
  Excel一般使用相对地址来引用单元格的位置,当把一个含有单元格地址的公式拷贝到一个新的位置,公式中的单元格地址会随着改变。你可以在列号或行号前添加符号 “$”来冻结单元格地址,使之在拷贝时保持固定不变。
  38、如何用汉字名称代替单元格地址?
  如果你不想使用单元格地址,可以将其定义成一个名字。
  定义名字的方法有两种:一种是选定单元格区域后在“名字框”直接输入名字,另一种是选定想要命名的单元格区域,再选择“插入”“名字”“定 义”,在“当前工作簿中名字”对话框内键人名字即可。使用名字的公式比使用单元格地址引用的公式更易于记忆和阅读,比如公式“=SUM(实发工资)”显然 比用单元格地址简单直观,而且不易出错。
  39、如何在公式中快速输入不连续的单元格地址?
  在SUM函数中输入比较长的单元格区域字符串很麻烦,尤其是当区域为许多不连续单元格区域组成时。这时可按住Ctrl键,进行不连续区域的选 取。区域选定后选择“插入”“名字”“定义”,将此区域命名,如Group1,然后在公式中使用这个区域名,如“=SUM(Group1)”。
  40、如何定义局部名字?
  在默认情况下,工作薄中的所有名字都是全局的。其实,可以定义局部名字,使之只对某个工作表有效,方法是将名字命名为“工作表名!名字”的形式即可。
  41、如何命名常数?
  有时,为常数指定一个名字可以节省在整个工作簿中修改替换此常数的时间。例如,在某个工作表中经常需用利率4.9%来计算利息,可以选择“插 入” “名字”“定 义”,在“当前工作薄的名字”框内输入“利率”,在“引用位置”框中输入“= 0.04.9”,按“确定”按钮。
  42、工作表名称中能含有空格吗?
  能。例如,你可以将某工作表命名为“Zhu Meng”。有一点结注意的是,当你在其他工作表中调用该工作表中的数据时,不能使用类似“= Zhu Meng!A2”的公式,否则 Excel将提示错误信息“找不到文件Meng”。解决的方法是,将调用公式改为“='Zhu Mg'! A2”就行了。当然,输入公式时,你最好养成这样的习惯,即在输入“=”号以后,用鼠标单由 Zhu Meng工作表,再输入余下的内容。
  43、给工作表命名应注意的问题
  有时为了直观,往往要给工作表重命名(Excel默认的荼表名是sheet1、sheet2.....),在重命名时应注意最好不要用已存在的 函数名来作荼表名,否则在下述情况下将产征收岂义。我们知道,在工作薄中复制工作表的方法是,按住Ctrl健并沿着标签行拖动选中的工作表到达新的位置, 复制成的工作表以“源工作表的名字+(2)”形式命名。例如,源表为ZM,则其“克隆”表为ZM(2)。在公式中Excel会把ZM(2)作为函数来处 理,从而出错。因而应给ZM(2)工作表重起个名字。
  44、如何拆分或取消拆分窗口?
  当我们给一个工作表输入数据时,在向下滚动过程中,尤其是当标题行消失后,有时会记错各列标题的相对位置。这时可以将窗口拆分为几部分,然后将 标题部分保留在屏幕上不动,只滚动数据部分。其方法是在主菜单上单击“窗口”“拆分窗口”。取消拆分窗口时除了使用“窗口”“撒消拆分窗口”命令外, 有捷径:将鼠标指针置于水平拆分或垂直拆分线或双拆分钱交点上,双击鼠标即可取消已拆分的窗口。
  45、如何给工作簿扩容?
  选取“工具”“选项”命令,选择“常规”项,在“新工作薄内的工作表数”对话栏用上下箭头改变打开新工作表数。一个工作薄最多可以有255张工作表,系统默认值为6。
  46、如何减少重复劳动?
  我们在实际应用Excel时,经常遇到有些操作重复应用(如定义上下标等)。为了减少重复劳动,我们可以把一些常用到的操作定义成宏。其方法是:选取“工具”菜单中的“宏”命令,执行“记录新宏”,记录好后按“停止”按钮即可。也可以用VBA编程定义宏。
  47、如何快速地批量修改数据?
  假如有一份 Excel工作簿,里面有所有职工工资表。现在想将所有职工的补贴增加50(元),当然你可以用公式进行计算,但除此之外还有更简单的批量修改的方法,即 使用“选择性粘贴”功能:首先在某个空白单元格中输入50,选定此单元格,选择“编辑”“复制”。选取想修改的单元格区域,例如从E2到E150。然后 选择“编辑”“选择性粘贴”,在“选择性粘贴”对话框“运算”栏中选中“加”运算,按“确定”健即可。最后,要删除开始时在某个空白单元格中输入的 50。
  48、如何快速删除特定的数据?
  假如有一份Excel工作薄,其中有大量的产品单价、数量和金额。如果想将所有数量为0的行删除,首先选定区域(包括标题行),然后选择“数 据” “筛选”“自动筛选”。在“数量”列下拉列表中选择“0”,那么将列出所有数量为0的行。此时在所有行都被选中的情况下,选择“编辑”“删除行”, 然后按“确定”即可删除所有数量为0的行。最后,取消自动筛选。
  49、如何快速删除工作表中的空行?
  以下几种方法可以快速删除空行:
  方法一:如果行的顺序无关紧要,则可以根据某一列排序,然后可以方便地删掉空行。
  方法二:如果行的顺序不可改变,你可以先选择“插入”“列”,插入新的一列入在A列中顺序填入整数。然后根据其他任何一列将表中的行排序,使所有空行都集中到表的底部,删去所有空行。最后以A列重新排序,再删去A列,恢复工作表各行原来的顺序。
  方法三:使用上例“如何快速删除特定的数据”的方法,只不过在所有列的下拉列表中都选择“空白”。
  50、如何使用数组公式?
  Excel中数组公式非常有用,它可建立产生多值或对一组值而不是单个值进行操作的公式。要输入数组公式,首先必须选择用来存放结果的单元格区 域,在编辑栏输入公式,然后按ctrl+Shift+Enter组合键锁定数组公式,Excel将在公式两边自动加上括号“{}”。不要自己键入花括号, 否则,Excel认为输入的是一个正文标签。要编辑或清除数组公式.需选择数组区域并且激活编辑栏,公式两边的括号将消失,然后编辑或清除公式,最后按 Ctrl+shift+Enter键。
  51、如何不使显示或打印出来的表格中包含有0值?
  通常情况下,我们不希望显示或打印出来的表格中包含有0值,而是将其内容置为空。例如,图1合计列中如果使用“=b2+c2+d2”公式,将有 可能出现0值的情况,如何让0值不显示?方法一;使用加上If函数判断值是否为0的公式,即: =if(b2+c2+d2=0,“”, b2+c2+d2)方法二:选择“工具”“选项”“视窗”,在“窗口选项”中去掉“零值”选项。方法三:使用自定义格式。 选中 E2:E5区域,选择“格式”“单元格”“数字”,从“分类”列表框中选择“自定义”,在“格式”框中输入“G/通用格式;G/通用格式;;”,按 “确定”按钮即可。
  52、在Excel中用Average函数计算单元格的平均值的,值为0的单元格也包含在内。有没有办法在计算平均值时排除值为0的单元格?
  方法一:如果单元格中的值为0,可用上例“0值不显示的方法”将其内容置为空,此时空单元格处理成文本,这样就可以直接用Average函数计算了。
  方法二:巧用Countif函数 例如,下面的公式可计算出b2:B10区域中非0单元格的平均值:
  =sum(b2: b10)/countif(b2: b1o,"0")
  53、如何在Excel中实现“自动更正”功能?
  Word用户都知道,利用Word的“自动更正”功能可以实现数据的快速输入。但在Excel中却没有类似“自动更正”功能的菜单命令。其实,使用VloopuP函数可以巧妙地解决这一问题。
[关注会计城官方微信,获更多新鲜、专业、实用资讯]
你可能对以下内容感兴趣:excel,excel2007官方下载,excel表格的基本操作,excel表格的35招必学秘技-excel教程网
欢迎大家来到Excel教程网!
热门课程排行
1730人观看
1458人观看
8225人观看
8049人观看
8711人观看
13498人观看
7437人观看
8011人观看
8124人观看
8217人观看
8200人观看
8338人观看
6719人观看
5845人观看
5861人观看
6437人观看
1359人观看
2166人观看
1547人观看
1200人观看
1233人观看
1188人观看
2053人观看
1662人观看
2395人观看
1063人观看
2219人观看
1213人观看
1136人观看
1277人观看
2307人观看
2206人观看
1741人观看
1122人观看
1222人观看
1306人观看
1444人观看
3267人观看
1932人观看
1966人观看
2189人观看
1877人观看
1474人观看
2497人观看
2983人观看
1910人观看
1579人观看
1123人观看
1138人观看
1151人观看
1084人观看
1363人观看
2568人观看
1122人观看
8628人观看
17800人观看
16766人观看
17463人观看
17168人观看
7289人观看
7564人观看
7362人观看
7843人观看
7224人观看
8804人观看
8120人观看
3465人观看
3292人观看
3186人观看
3042人观看
2842人观看
3081人观看
2421人观看
2681人观看
3424人观看
推荐教程排行
最近更新教程日, 3:50 下午
&分享到微博:
(9 人投票, 平均: 4.89 out of 5)
Loading...
真有点舍不得,真想维护好这片Excel知识和技能的分享之地,但是由于备案审核的原因,网站可能要被迫关闭了!
有点无可奈何!但又没有办法!
算起来,从网站开始创建之初到现在,大约快8年了。期间,也核查过多次备案事宜,都是域名提供商帮助解决了。
但这次,非得要我到指定的地点现场照相,可宜昌偏偏就没有照相点,所以没办法……
希望这个网站曾经带给过大家发现和获得Excel技能知识的点滴喜悦!
不过,这样也好。毕竟,网站的维护还是要花不少功夫的。
以后,我就可以专注于在微信上与大家分享了。
微信公众号:excelperfect
通过微信,您可以更快地随时随地了解完美Excel更新。
关注《完美Excel》微信公众账号:
方法1—点击右上角的三个点(…)按钮,选择“查看公众号”,点击关注
方法2—在添加朋友中搜索excelperfect
单击右上角的(+)号,在“添加朋友”中搜索excelperfect
方法3—微信扫一扫下面网址中的二维码
自从日申请成功微信公众号后《完美Excel微信公众号》,用户数每天都有上升,今天(日)下午17:30左右刷新时,用户数达到100。截图于此,留作纪念。
谢谢大家的关注!
继续努力!为大家带来想要的内容,也会以积极的态度与大家积极交流。
日中午13时,成功申请微信订阅号。
微信号:excelperfect
有兴趣的朋友可以扫一扫,关注完美Excel。在这里,将定期与大家及时分享Excel与VBA技术的学习心得和实践体会。
《完美Excel》(第2期)终于发布了!希望大家多提建议。
本期主要内容为Office功能区的开发,汇集了大多数权威的基础资料,相信有兴趣的读者在学习后,会顺利地开发出适合自已的Office功能区界面来。
在今天的计算机世界中,虚拟机的概念已经被用来解决许多问题。从机器的分割(IBM模型),到“半平台无关”的程序设计语言(Java模型),到开发操作系统(UNIX模型和OSI模型),虚拟机的概念在构成现代计算机的过程中已经被证明是一个强大的工具。然而,这个概念对每个人来说并非总是清晰,并且直到20世纪60年代中期,它才被用于实践。
1965年前后 [&]
日13:00,端午后上班的第一天,完美Excel微信公众平台用户数突破500。
在此,留个脚印!
继续努力推出好的excel经验技巧和知识分享。
谢谢大家的关注! [&]
Category: &&|&
&|&2,015 次阅读
日, 12:09 下午
&分享到微博:
(4 人投票, 平均: 5.00 out of 5)
Loading...
《完美Excel》微信公众账号:excelperfect
在详细介绍本的内容前,我们先轻松一下。
据说,在我家的院子里藏着很多金银珠宝。你一定想知道藏在哪儿吧,告诉你,就在院子里的一棵树下。当你兴冲冲地跑到院子里准备挖宝藏时,傻眼了,因为我家院子太大,几乎种了上百棵树,究竟在哪棵树下呢?珠宝的诱惑力太强了,你决定挨个树找,够你找的了……但是,如果我告诉你,在我家院子里有一棵老槐树,从这棵槐树起向右第3棵树下藏着很多金银珠宝,你一下子就能找到了。
很多情况下,我们会采用相对位置或坐标来描述事物的位置。因为这样的描述让人容易理解,从而方便快速找到想要的东西。
言归正传。Offset属性是Range对象的一个很有用的属性,它能够帮助我们指定相对于某个单元格的其它单元格。这样,我们就能够很方便地以某一个特定的单元格为起点,遍历其它单元格,或者到达我们想要的单元格。
简而言之,Offset属性能够帮助我们从工作表中的一个单元格移动到另一个单元格。
Offset属性的语法表达为:
Range对象.Offset(RowOffset,ColumnOffset)
返回基于起点单元格偏移指定的行数和列数后的单元格。
Range对象为指定的起始单元格。(也就是上面所说的老槐树)
括号里的参数均为可选项。
其中,参数RowOffset代表行偏移数,可以是正数、负数或0,正数表示向下偏移的行数,负数表示向上偏移的行数,0表示与起始单元格在同一行;当没有指定该参数值时,默认值为0。
同样,参数ColumnOffset代表列偏移数,可以是正数、负数或0,正数表示向右偏移的列数,负数表示向左偏移的列数,0表示与起始单元格在同一列;当没有指定该参数值时,默认值为0。
如果偏移的行列数超出了Excel工作表单元格的范围,则会导致错误。例如,以单元格A1为起点,向上偏移1行,则会出错。
如下图所示,假设我们要选取以单元格B2为起点单元格,向下偏移1行、向右偏移2列的单元格,则运行代码:
Range(&B2&).Offset(1, 2).Select
返回并选取单元格D3(即Range(+).Offset(1, 2)返回单元格D3,Select方法选取返回的单元格D3)。
再列举一些简单的代码:
Range(&B2&).Offset(1)
返回单元格B3(省略了列偏移量参数ColumnOffset,返回的单元格与起始单元格在同一列)。
Range(&B2&).Offset(, 2)
返回单元格D2(省略了行偏移量参数RowOffset,返回的单元格与起始单元格在同一行)。
举一个极端的例子,下面的代码:
Range(&B2&).Offset
仍返回单元格B2,也就是说,使用不指定参数的Offset属性是多此一举。
当然,代码中也可以加上参数名称,使代码的可读性更强。例如上面的代码也可以写为:
Range(&B2&).Offset(RowOffset:=1, ColumnOffset:=2).Select
Range(&B2&).Offset(RowOffset:=1)
Range(&B2&).Offset(ColumnOffset:=2)
注意,加上参数名称后,就不需要按参数顺序指定参数值了,所以省略前面的参数值而仅指定后面的参数值时,也不需要加上分隔的逗号了(见最后一句代码)。
Offset属性能够用在单元格区域中,偏移整个单元格区域。例如,下面的代码:
Range(&A1:B2&).Offset(2, 2).Select
返回并选取单元格区域C3:D4,如下图所示。
可以在循环中用Offset属性来移动单元格,从而遍历单元格区域来查找满足条件的单元格。如下图所示的工作表:
现在要在单元格区域A2:A7中查找姓名为“赵六”的同学,并将他的分数加粗。代码如下:
Sub OffsetExa1()
Dim rng As Range '声明单元格对象变量
Dim rngTotal As Range '声明单元格对象变量
Set rngTotal = Range(&A2:A7&) '将单元格区域赋值给单元格对象变量
Set rng = Range(&A2&) '将单元格赋值对单元格对象变量
'遍历单元格区域
Do Until rng.Value = &&
If rng.Value = &赵六& Then '如果单元格值为赵六,则将其分数加粗
rng.Offset(0, 1).Font.Bold = True ‘使用Offset属性偏移到分数单元格
Set rng = rng.Offset(1, 0) '将下一个单元格赋值给单元格对象变量
由于本例中是在固定的单元格区域内循环,所以还可使用For Each结构来优化代码,For Each结构负责循环,Offset属性负责偏移到相应的单元格。代码如下:
Sub OffsetExa2()
Dim rng As Range '声明单元格对象变量
Dim rngTotal As Range '声明单元格对象变量
Set rngTotal = Range(&A2:A7&) '将单元格区域赋值给单元格对象变量
'遍历单元格区域
For Each rng In rngTotal
If rng.Value = &赵六& Then '如果单元格值为赵六,则将其分数加粗
rng.Offset(0, 1).Font.Bold = True ‘使用Offset属性偏移到分数单元格
在很多程序中,经常需要先查找满足特定条件的单元格,然后以该单元格为基准,对其他单元格进行操作。
下面,我们使用Offset属性对《》中的系统进行优化,使代码更加灵活。代码如下:
Sub TotalData1()
'声明Worksheet变量
Dim wksInfo As Worksheet
Dim wksBaseInfo As Worksheet
'声明单元格对象变量
Dim rng As Range
'给wksInfo变量赋值
Set wksInfo = ThisWorkbook.Worksheets(&员工信息数据库&)
Set wksBaseInfo = ThisWorkbook.Worksheets(&员工基本信息表&)
'将初始单元格赋值给变量
Set rng = wksInfo.Range(&A2&)
'将&员工基本信息表&中数据自动填入&员工信息数据库&工作表
With wksBaseInfo
rng.Value = Range(&B2&).Value
rng.Offset(0, 1).Value = .Range(&F2&).Value
rng.Offset(0, 2).Value = .Range(&B3&).Value
rng.Offset(0, 3).Value = .Range(&D3&).Value
rng.Offset(0, 4).Value = .Range(&F3&).Value
rng.Offset(0, 5).Value = .Range(&B4&).Value
rng.Offset(0, 6).Value = .Range(&D4&).Value
rng.Offset(0, 7).Value = .Range(&F4&).Value
rng.Offset(0, 8).Value = .Range(&B5&).Value
rng.Offset(0, 9).Value = .Range(&F5&).Value
rng.Offset(0, 10).Value = .Range(&B6&).Value
rng.Offset(0, 11).Value = .Range(&D6&).Value
rng.Offset(0, 12).Value = .Range(&F6&).Value
rng.Offset(0, 13).Value = .Range(&B7&).Value
rng.Offset(0, 14).Value = .Range(&F7&).Value
rng.Offset(0, 15).Value = .Range(&B8&).Value
rng.Offset(0, 16).Value = .Range(&D8&).Value
rng.Offset(0, 17).Value = .Range(&F8&).Value
rng.Offset(0, 18).Value = .Range(&B9&).Value
rng.Offset(0, 19).Value = .Range(&D9&).Value
rng.Offset(0, 20).Value = .Range(&F9&).Value
rng.Offset(0, 21).Value = .Range(&B10&).Value
rng.Offset(0, 22).Value = .Range(&B11&).Value
rng.Offset(0, 23).Value = .Range(&B12&).Value
这样,避免了“员工信息数据库”中的单元格采用“硬编码”(即在代码中使用固定的单元格对象。使用“硬编码”的代码使得以后要修改代码时,需要逐个修改相应的单元格代码,很繁锁,也容易出错。对于经常变换的单元格,最好使用对象变量,例如例子中“员工信息数据库”工作表,在填充数据时,单元格经常要变动。而对于不会变化的单元格,可以使用固定的单元格,如例子中“员工基本信息表”中的单元格F2、B3、D3等)。
上述优化后的代码,使今后代码需要扩展时,只需修改起始单元格即可,更加灵活。
————————————–
通过下列方式可以更快地了解完美Excel更新:
关注《完美Excel》微信公众账号:
方法1—点击右上角的按钮,选择“查看公众号”,点击关注
方法2—在添加朋友中搜索excelperfect
方法3—微信扫一扫下面网址中的二维码
/wordpress/wp-content/uploads/2014/02/excelperfect.jpg
新浪微博名:完美Excel
个人博客:
文章转载请注明出处!
《完美Excel》微信公众账号:excelperfect
在学习的过程中,我们往往会忽视细节,甚至对有些关键细节也一带而过,结果就会造成一知半解或不懂装懂。虽然过多地纠缠于细节,会耗费很多的精力,有时也会陷于不能自拔而走进死胡同,但是认识一些细节,有助于对所学知识的更深入的理解,更会打下坚实的基础。那么,闲话少说,下面我们就来讲解单元格在Excel [&]
《完美Excel》微信公众账号:excelperfect
通过前面两篇文章的学习,我们已经了解了Excel [&]
《完美Excel》微信公众账号:excelperfect
上一篇文章中专门介绍了对象变量,因为在Excel [&]
本文整理了以前的一些关于Find方法的文章,作为Excel VBA应用大全的一部分。
本文为以前编写的一篇文章,转贴于此,作为Excel [&]
Category: , &&|&
&|&3,257 次阅读
日, 6:49 下午
&分享到微博:
(1 人投票, 平均: 5.00 out of 5)
Loading...
《完美Excel》微信公众账号:excelperfect
平时生活中,有很多细节在我们看来似乎是习以为常的。例如,在教孩子剪纸时,我们会选取一张合适大小的纸,然后对其进行裁剪成想要的模样;在维修机器时,我们会先选取合适的扳手,利用它来拧螺丝。像选择纸张并在纸张上进行操作、选取扳手并利用它来做别的事情等等这些操作,是再自然不过的事情了。
然而,当我们使用Excel VBA来操控单元格时,是否要先选取相应的单元格呢?如果熟悉了VBA,我们立马就可以回答:未必。可以说,在Excel VBA的大多数操作中,选取单元格的动作是多余的,甚至会拖慢代码的速度。但是,选取单元格是最基本的操作,是我们无意中就完成的操作,譬如在Excel工作表界面,我们将鼠标一点,那个周边带框的单元格就是我们选取的单元格,此时,我们应用的格式、输入的数据都在那个单元格中。
这里,我们还是从这个最基本的操作介绍起,逐步扩展到Range对象的诸多有用的属性和方法。
Select方法
Range对象的Select方法表示选择某个单元格或某单元格区域。例如,下面的代码:
Range(&A2&).Select
使单元格A2为当前单元格。
下面的代码:
Range(&C2:C5&).Select
选取单元格区域C2:C5。
下图显示了上述代码运行后的结果:
同样地,下面的代码:
Range(&C5&).Select
Cells(5, 3).Select
[C5].Select
Cells(65539).Select
Cells(5, &C&).Select
均选取单元格C5为当前单元格。
下面的代码:
Range(&C2:C5&).Select
Range(&C2&, &C5&).Select
[C2:C5].Select
Range(Range(&C2&), Range(&C5&)).Select
Range(Cells(2, 2), Cells(5, 2)).Select
均选取单元格区域C2:C5。
下面的代码:
Columns(2).Select
Columns(&B&).Select
均选取B列。
下面的代码:
Columns(&B:C&).Select
选取B列和C列。
下面的代码:
Rows(2).Select
Rows(&2:2&).Select
均选取第2行。
下面的代码:
Rows(&2:3&).Select
选取第2行和第3行。
可以看出,在VBA中,您可以采用多种方法来选取要操作的单元格或单元格区域。
您可以在VBE中逐一输入上述代码并运行后对照Excel界面观察运行后的结果,以加深您对单元格对象的理解。
Activate方法
Range对象的Activate方法用于使所选单元格区域中的某单元格为活动单元格。如果没有事先明确地选择某区域,则认为是在当前工作表中的所有单元格中选取某单元格。
例如,下面的代码:
Range(&B2&).Activate
使当前工作表中的单元格B2为活动单元格。
下面的代码:
Range(&B2:C5&).Select
Range(&B5&).Activate
使所选择的单元格区域B2:C5中的单元格B5为当前活动单元格。如下图所示:
下面是一些“奇怪的”现象,如下面的代码:
Range(&B2:D3&).Activate
将选取单元格区域B2:D3,并使该区域的左上角单元格B2为当前活动单元格。如下图所示:
您可以使用不同的单元格区域表示方式,来试验Activate方法。运行代码时结合Excel界面观察其行为,体验Activate方法的实际运行效果。
有兴趣的话,您对ActiveCell属性和Cells属性分别试一试Select方法和Activate方法,看看结果如何?在学习VBA时,多些想法,多些思考,多些尝试,就会对Excel对象理解得更加深入透彻,也会取得更快速的进步。
最后要说明一点的是,本节的内容对熟悉VBA的人来说,可能觉得太啰嗦了,因为熟悉VBA后这两个方法几乎不会用到。但对于初学者来说,在操作一个对象之前先选择它是很自然的一种想法,仔细体验Select方法和Activate方法,有助于打开理解Range对象之门。毕竟,很多初学者的代码或宏录制器的代码中都有大量的Select和Activate存在,并且在我们后续的介绍中也会时不时地出现这两个方法。
此外,对于熟悉的人来说,考虑这两个方法的一些细微之处,也是很有意思的事情。
————————————–
通过下列方式可以更快地了解完美Excel更新:
关注《完美Excel》微信公众账号:
方法1—点击右上角的按钮,选择“查看公众号”,点击关注
方法2—在添加朋友中搜索excelperfect
方法3—微信扫一扫下面网址中的二维码
/wordpress/wp-content/uploads/2014/02/excelperfect.jpg
新浪微博名:完美Excel
个人博客:
文章转载请注明出处!
《完美Excel》微信公众账号:excelperfect
还记得小时候学习数学的经历吗?很小很小的时候,我们会接触到数字,大人们会教我们数数,认识简单的数字,慢慢地我们会开始学习简单的加减法,再大一点,会学习乘除法,背诵乘法口诀,随着学习的深入,我们会逐渐学习到更复杂的运算和规则。
运算无处不在。在编写程序代码时,很多内容都是在进行各种各样的运算,因此,运算符非常 [&]
《完美Excel》微信公众账号:excelperfect
在学习的过程中,我们往往会忽视细节,甚至对有些关键细节也一带而过,结果就会造成一知半解或不懂装懂。虽然过多地纠缠于细节,会耗费很多的精力,有时也会陷于不能自拔而走进死胡同,但是认识一些细节,有助于对所学知识的更深入的理解,更会打下坚实的基础。那么,闲话少说,下面我们就来讲解单元格在Excel [&]
《完美Excel》微信公众账号:excelperfect
在编写程序时,少不了要使用变量和常量,它们都是程序中很重要的元素,是组织完美程序的基础。
下面是一个简单的VBA程序,用来计算半径为5的圆的面积。
Sub 示例2()
Const PI = 3.1415926
Dim r As Integer
Dim area [&]
《完美Excel》微信公众账号:excelperfect
人生经常要面临“多选一”的情况,在编写程序代码时也是如此。在上篇文章中,我们讲解了使用If-Then结构来进行判断,也举了很多个小例子。我们看到,随着条件的增多,代码的结构也变得复杂或难以理解。幸运的是,VBA为我们提供了Select [&]
《完美Excel》微信公众账号:excelperfect
下面,该介绍VBA的循环语句结构了。这里,简要地谈谈有限次的循环结构,也就是For-Next循环。还是先看一个例子。
我们如果想要在工作表单元格区域A1:A10中依次填写数字1至10,可以使用下面的代码:
Sub ForNextTest1()
Dim i As Integer [&]
标签:, , ,
Category: , &&|&
&|&2,683 次阅读
日, 12:30 下午
&分享到微博:
(1 人投票, 平均: 5.00 out of 5)
Loading...
《完美Excel》微信公众账号:excelperfect
在前面的文章中,我们带您认识了Excel的基本对象模型,简单地介绍了常用的Application对象、Workbook对象、Window对象、Worksheet对象、Range对象、Comment对象、Chart对象,以及返回这些常用对象的一些属性:ThisWorkbook属性、ActiveWorkbook属性、ActiveWindow属性、ActiveSheet属性、Selection属性、ActiveCell属性、Cells属性、Rows属性、ActiveChart属性,等等。
通过这些介绍,我们应该对Excel的常用对象有了一定程度的了解,但仅仅这些还不够,我们的目的是充分运用这些对象及其大量的属性、方法,编写操纵Excel的程序代码,来达到我们的要求。因此,接下来的一系列文章,我们将详细介绍这些常用对象及其属性和方法,让您掌握Excel对象模型,并为使用Excel VBA编写实用程序打下坚实的基础。
回顾一下Excel对象模型层次结构示意图:
大多数讲解Excel VBA的图书都是按照上图的顺序自上而下介绍Excel对象,即先讲解Application对象,接着讲Workbook对象、Worksheet对象和Range对象。我们现在反过来,先讲我认为最重要的Range对象。
应该说,绝大多数实用的Excel VBA程序都是对Range对象的操作,理解和掌握了Range对象,我们就可以使用VBA执行各种实用的操作。所以,先讲解Range对象,让您看到各种对单元格的操作实现,能够更好地激发和保持持续学习Excel VBA的动力。况且,在前面的文章中我们已经对Excel的其它对象有所了解,应该不会妨碍我们对Range对象的讲解和您对Range对象的学习理解。
在中,我们介绍了代表或者引用单元格区域(Range对象)的各种方法,包括:Range属性、ActiveCell属性、Cells属性、Selection属性、Columns属性、Rows属性,等等。这些都很容易理解,并且图文对照的方式也能够加强对些属性的理解。在接下来的介绍中,我们也会采取这样的方式,并会配有一些简单的实例。
这里,我们会详细介绍另外两种引用Range对象的属性:UsedRange属性和CurrentRegion属性。在很多时候这两个属性都很有用,能够简化我们的工作。
Union方法可以合并多个单元格区域,Intersect方法可以获得多个单元格区域的重叠部分。在特定情况下,我们会用到这两个方法。
在编程过程中,我们经常需要移动或者定位到特定的单元格,下面的属性或方法有助于完成我们的导航任务:
Offset属性
Resize属性
SpecialCells方法
我们将会对上述属性和方法进行详细的讲解。
有时候,需要使用VBA设置单元格的格式,因此,我们会讲述关于单元格格式设置的一些属性。
在使用计算机时,经常会用到复制、剪切和粘贴操作,在VBA中也有相应的方法来完成这些操作行为:
PasteSpecial方法
我们将会对上述方法进行详细的讲解。
在实际操作中,我们经常会查找特定的单元格,然后对其进行相应的操作。我们也经常会对一些单元格进行替换操作。这些操作在VBA中都有相应的方法来实现:
FindNext方法
Replace方法
这些方法都非常有用,可以说,很多实用程序都是建立在这些方法的基础上的。因此,我们将对这些方法进行详细的讲解。
Excel内置有很多数据处理功能,当然也对应着VBA中的一些方法:
AutoFiter方法
AdvancedFilter方法
我们会逐一介绍这些方法的详细使用。
现在,开始我们掌握Range对象之旅吧!
————————————–
通过下列方式可以更快地了解完美Excel更新:
关注《完美Excel》微信公众账号:
方法1—点击右上角的按钮,选择“查看公众号”,点击关注
方法2—在添加朋友中搜索excelperfect
方法3—微信扫一扫下面网址中的二维码
/wordpress/wp-content/uploads/2014/02/excelperfect.jpg
新浪微博名:完美Excel
个人博客:
文章转载请注明出处!
《完美Excel》微信公众账号:excelperfect
下面继续介绍在满足指定的条件时才执行相应代码块的循环结构,接着来看看Do Until循环。
Do Until循环与Do While循环的结构相似,最本质的区别在于循环条件的判断。顾名思义,在Do While循环中,当条件为真(True)时,就执行循环;而在Do [&]
《完美Excel》微信公众账号:excelperfect
在编写程序时,少不了要使用变量和常量,它们都是程序中很重要的元素,是组织完美程序的基础。
下面是一个简单的VBA程序,用来计算半径为5的圆的面积。
Sub 示例2()
Const PI = 3.1415926
Dim r As Integer
Dim area [&]
《完美Excel》微信公众账号:excelperfect
还记得小时候学习数学的经历吗?很小很小的时候,我们会接触到数字,大人们会教我们数数,认识简单的数字,慢慢地我们会开始学习简单的加减法,再大一点,会学习乘除法,背诵乘法口诀,随着学习的深入,我们会逐渐学习到更复杂的运算和规则。
运算无处不在。在编写程序代码时,很多内容都是在进行各种各样的运算,因此,运算符非常 [&]
《完美Excel》微信公众账号:excelperfect
Excel的某些行为往往会让用户感到疑惑、对VBA不甚了解的人在初次使用代码时也会碰到一些貌似奇怪的问题。下面我们就从最简单的说起。
问题1:为什么在打开有些Excel文件时出现安全警告?
在打开Excel文件时,我们时常会看到下图所示的安全警告消息框。根据Excel的版本不同或者在Excel [&]
《完美Excel》微信公众账号:excelperfect
通过前面两篇文章的学习,我们已经了解了Excel [&]
Category: , &&|&
&|&2,985 次阅读
日, 12:48 下午
&分享到微博:
(11 人投票, 平均: 4.91 out of 5)
Loading...
完美Excel公众号:excelperfect
本文资料来源于,供参考。
工作表有一类最基本的函数是基于某条件统计或汇总结果,例如COUNTIF函数或SUMIF函数,都是相当有用和灵活的函数,但仅局限于单条件。而本文将着重探讨基于多条件获得结果的函数——SUMPRODUCT函数。
SUMPRODUCT函数是Excel中最“多才多艺”的函数之一。其基本功能是,数组中相应的项目相乘并返回结果之和。下面将介绍SUMPRODUCT函数经典的用法。
SUMPRODUCT函数的标准用法
SUMPRODUCT函数的基本用法是:一个数组中的每个值与另一个数组中相应的值相乘,返回乘积的和。
示例1:如果单元格区域A9:A11中分别包含值1、2、3,单元格区域B9:B11中分别包含值10、20、30,那么
=SUMPRODUCT(A9:A11,B9:B11)
返回结果140,或者(1*10)+(2*20)+(3*30)=10+40+90=140。
SUMPRODUCT函数的“进化”用法
在Excel中,有两个非常有用的支持条件统计和求和的函数,分别是COUNTIF函数和SUMIF函数,但仅支持单个条件测试。
举个简单的双条件测试例子。例如,公式=COUNTIF(A1:A10,>=10)-COUNTIF(A1:A10,>20)将得到在单元格区域A1:A10中介于10和20之间有多少项。然而,这种摸拟双条件测试的方法是有局限的,它不能处理不同的单元格区域或者更多的条件。
为了理解SUMPRODUCT函数的使用,先举个例子。示例数据如下:
下面的公式很容易得出“Ford”的数量:
=COUNTIF(A1:A10,”Ford”)
返回的结果为4。
同样,下面的公式直接获得“Ford”销售价格之和:
=SUMIF(A1:A10,”Ford”,C1:C10)
返回的结果为33873。
然而,假设想要统计6月份“Ford”的销售数量,使用下面的数组公式:
=SUM(IF(A1:A10=”Ford”,IF(B1:B10=”June&#),0))
输入后同时按下Ctrl+Shift+Enter键,返回结果3。
同样,要统计6月份“Ford”销售价格之和,使用下面的数组公式:
=SUM(IF(A1:A10=”Ford”,IF(B1:B10=”June”,C1:C10,0),0))
返回结果27000。
下面我们看看使用SUMPRODUCT函数来获取结果的情形。下面的公式:
=SUMPRODUCT((A1:A10=”Ford”)*(B1:B10=”June”))
得到6月份“Ford”的销售数量,结果为3。
下面的公式:
=SUMPRODUCT((A2:A10=”Ford”)*(B2:B10=”June”)*(C2:C10))
得到6月份“Ford”销售价格之和。
“*”号用作AND(与)运算符,公式的其含义是单元格区域A2:A10中的值为“Ford”并且B2:B10中的值为“June”所对应的C2:C10中的值相加。
然而,如果我们想在公式中使用OR(或)运算符呢?使用“+”号来代表OR运算符。例如,下面的公式:
=SUMPRODUCT((A1:A10=”Ford”)+(A1:A10=”Renault”))
计算单元格区域A1:A10中为“Ford”或“Renault”的数量,结果为6。
SUMPRODUCT函数的优点
正如上文所描述的,多条件测试是SUMPRODUCT函数的主要优点。然而,SUMPRODUCT函数还有其它两个优点:一个是它能够处理关闭的工作簿中的数据,不受源工作簿是否关闭的影响;另一个是能够处理文本值以满足需求。
例如,如果想在另一个工作簿中计算“Sumproduct函数.xlsm”工作簿中的数据,那么使用下面的公式计算该工作簿中大于15000的值的和。
=SUMIF([Sumproduct函数.xlsm]Sheet1!$C$2:$C$10,&#″)
此时,如果“Sumproduct函数.xlsm”工作簿关闭,再重新计算工作表是时该公式会返回#VALUE。同样,如果“Sumproduct函数.xlsm”工作簿已经关闭后,再在其它工作簿中使用上面的公式,会返回#VALUE。
然而,使用SUMPRODUCT函数就不会存在上面的问题。无论“Sumproduct函数.xlsm”工作簿是否关闭,将下面的公式输入到其它工作簿中,都会得到正确的结果。
=SUMPRODUCT(–(‘[Sumproduct函数.xlsm]Sheet1’!$C$2:$C$10>15000),–(‘[Sumproduct函数.xlsm]Sheet1’!$C$2:$C$10))
第二个主要的优点是SUMPRODUCT函数能够处理具有不同数据类型文本的列。例子数据如下图所示,在B列的第一行中是文字文本值作为标题,其余行为数值。
如果使用下面的公式:
=SUMPRODUCT((A1:A4=”x”)*(B1:B4))
则会返回错误#VALUE。
要忽略错误,则要使用双一元操作符(两个减号):
=SUMPRODUCT(–(A1:A4=”x”),(B1:B4))
返回正确的结果,本例中是4。
SUMPRODUCT函数的运作原理
理解SUMPRODUCT函数如何工作能够帮助我们决定在什么情况下使用它,以及如何构建公式并扩展其用法。
下面图片中是我们将要使用的示例数据。
图中,A1:A12是商品,B1:B12是分类,C1:C12是销售的数量。本例中,求卖了多少属于类别A的商品Ford。
使用下面的公式可以得到结果:
=SUMPRODUCT((A1:A12=”Ford”)*(B1:B12=”A”)*(C1:C12))
该公式的第一部分(A1:A12=”Ford”)检查值为Ford的商品,返回值为TRUE/FALSE的数组,本例中是:
{TRUE,FALSE,TRUE,TRUE, TRUE,TRUE, TRUE,FALSE, TRUE, TRUE, TRUE, TRUE}
同样,使用(B1:B12=”A”)检查值为A的分类,返回值为TRUE/FALSE的数组,本例中是:
{FALSE,FALSE,TRUE,TRUE,FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE}
最后,(C1:C12)返回含有一系列数值的数组:
{3,4,2,1,4,3,2,8,6,8,7,6}
现在我们获得了3个数组,两个含有TRUE/FALSE值,一个含有数值,如下图所示:
SUMPRODUCT通常处理数值数组,然而我们的公式中既有数值数组,也有含有TRUE/FALSE值的数组。通过使用“*”(乘)运算符,能够获得可以求和的数字值。“*”运算符强制使这两个含有TRUE/FALSE值的数组变为含有1/0值的单个数组。TRUE乘以TRUE将得到1(在工作表中试试,在单元格中输入=TRUE*TRUE,查看结果),任何其它的组合的结果为0。因此,当两个条件都满足时,结果为1,当任一或者两个条件都不满足时,结果为0。第一个数组中的TRUE/FALSE值与第二个数组中的TRUE/FALSE值相乘,结果是一个含有1/0值的数组,即{0,0,1,1,0,1,1,0,1,1,1,1}。这个数组的值接着和销售数量数组的值相乘,结果为满足两个测试条件的销售数量的数组。接下来,SUMPRODUCT函数汇总该数组中的值,得到最终的结果。
上图展示了“*”运算符处理前条件测试所分解的值。
下图展示了TRUE/FALSE值等价于数字值1/0,并分别相乘后的结果。在这里,我们应该能够看到SUMPRODUCT函数是如何运算直至获得最终结果,即35。
下图展示了没有销售数量列时等价的1/0值,即使用SUMPRODUCT函数统计满足两个条件的行数:
按照我们上面的解释,在使用SUMPRODUCT函数时,“*”运算符解决了将多个数组转换成单个的合成数组,剩下由SUMPRODUCT函数来简单地对这个合成数组的成员求和。SUMPRODUCT函数能够处理单个数组(例如,在单元格A1、A2、A3中分别输入数字1、2、3,然后在一个单元格中插入公式=SUMPRODUCT(A1:A3),将返回结果6)。事实上,我们仅需要“*”运算符来强制对特定条件进行测试的数组进行转换,而不需要它来对不是条件测试的数组进行操作。因此,对于上例,我们也可以使用下面的公式:
=SUMPRODUCT((A1:A12=”Ford”)*(B1:B12=”A”),(C1:C12))
在使用SUMPRODUCT函数时,所有的数组都必须有相同的大小,这样每个数组相对应的成员能够彼此相乘。
在使用SUMPRODUCT函数时,数组不能为整列(例如A:A),数组必须是一列里的某个单元格区域。但是,可以使用整行(例如1:1)。
在SUMPRODUCT函数中,数组不能够同时包含列和行区域,它们必须全是列,或者全是行。然而,行数据能够使用函数转置成列,参见后面的示例。
SUMPRODUCT函数的语法格式
到目前为止我们所给出的示例中,SUMPRODUCT函数的格式是:
=SUMPRODUCT((数组1=条件1)*(数组2=条件2)*(数组3))
正如上文所提到的,我们也可以使用:
=SUMPRODUCT((数组1=条件1)*(数组2=条件2),(数组3))
运算符“*”仅需要将条件数组TRUE/FALSE强制转换为数值。
当使用算术运算符强制将TRUE/FALSE值转换为1/0时,我们可以使用一些不同的运算符获得相同的结果。通过给每个条件数组分别乘以1也可以进行这样的强制转换:
=SUMPRODUCT((数组1=条件1)*1,(数组2=条件2)*1,(数组3))
=SUMPRODUCT(1*(数组1=条件1),1*(数组2=条件2),(数组3))
或者为每个条件数组进行1次方:
=SUMPRODUCT((数组1=条件1)^1,(数组2=条件2)^1,(数组3))
或者每个条件数组加0:
=SUMPRODUCT((数组1=条件1)+0,(数组2=条件2)+0,(数组3))
=SUMPRODUCT(0+(数组1=条件1),0+(数组2=条件2),(数组3))
或者通过使用N函数:
=SUMPRODUCT(N(数组1=条件1),N(数组2=条件2),(数组3))
这些方法不同于“*“运算符是它们应用于单个的数组,而“*”运算于两个数组。
上面介绍的方法取决于您的偏好,当然,只有单个条件数组时,不能使用“*”运算符。
还有一种方法是,使用双目操作符:
=SUMPRODUCT(–(数组1=条件1),–(数组2=条件2),(数组3))
对于笔者来说,偏好于使用双目–操作符,因为这样避免了函数调用,并且在所有情形下都工作。
此外,还有另一种变异的方法,使用单目操作符“-”,例如:
=SUMPRODUCT(-(数组1=条件1),-(数组2=条件2),(数组3))
但笔者不提倡使用这种方法,因为它没有实际的优点,并且必须两两配合,否则会返回一个负值。
在单元格中输入“=A1=10”进行测试,通常会返回TRUE或FALSE。如果想将TRUE/FALSE值强制转换为1/0,使用诸如下面的公式:
=SUMPRODUCT(–(B5:B))
SUMPRODUCT数组通常由逗号分隔。因此,为了保持这种格式,如果有多个条件,则可以在条件中使用–,例如:
=SUMPRODUCT(–(B5:B),–(C5:C1953=7))
但是,如果简单地将两个含TRUE/FALSE值的数组相乘,则隐式地将值解析为1/0,然后求和,不需要逗号,例如:
=SUMPRODUCT((B5:B)*(C5:C1953=7))
更进一步,数值数组可以使用相同的运算符,或者恢复为逗号。因此,公式可以写为:
=SUMPRODUCT(–(B5:B),–(C5:C1953=7),(D5:D1953))
=SUMPRODUCT((B5:B)*(C5:C1953=7),(D5:D1953))
=SUMPRODUCT(–(B5:B),–(C5:C1953=7),–(D5:D1953))
=SUMPRODUCT((B5:B)*(C5:C1953=7)*(D5:D1953))
=SUMPRODUCT(–(B5:B),–(C5:C1953=7)*(D5:D1953))
如果结果是将两个条件相乘的乘积,那么最好将两个条件数组相乘,这将TRUE/FALSE强制转换为1/0并求和:
=SUMPRODUCT((条件1)*(条件2))
与上面的公式等价的是:
=SUMPRODUCT(–(条件1),–(条件2))
然而,如果仅有一个条件,则使用双目运算符–强制转换为1/0:
=SUMPRODUCT(–(条件1))
与上面的公式等价的是:
=SUMPRODUCT((1*(条件1)))
在SUMPRODUCT函数中,使用–的情形都能使用”*”,反之,如果在SUMPRODUCT函数中使用TRANSPOSE函数,那么必须使用“*”。
在VBA中的条件统计和求和
到目前为止,我们关于条件公式的所有讨论都是直接在Excel工作表中。有时,我们需要在VBA程序中对一些工作表单元格进行条件统计和求和。在这些情形下,编写简单的循环来遍历所有数据并检查它们是否与条件相匹配,统计汇总相匹配的项。
Excel VBA允许在程序中调用内置的工作表函数,避免让我们再重复创建这些功能,极大地改善了VBA代码的能力。当在VBA中调用Excel函数时,如果不过度使用,那么任何的性能影响应该是最小的,优势也很明显。我们能够利用这种优势很容易地在VBA中获取条件统计和求和,但是要注意一些事项。
作为示例,考虑下表中的数据(与上文中表相同)。
如果需要使用VBA程序求单元格区域A1:A10有多少“Ford”,程序代码如下:
Dim mModel As String
Dim mCount As Long
mModel = &Ford&
mCount = Application.WorksheetFunction.CountIf(Range(&A1:A10&), mModel)
此时,”Ford”的数量将被赋值给mCount变量,其值为4。
同样,我们可以使用SUMIF来计算”Ford”所对应的价格和:
Dim mModel As String
Dim mValue As Long
mModel = &Ford&
mValue = Application.WorksheetFunction.SumIf(Range(&A1:A10&), mModel, Range(&C1:C10&))
此时,”Ford”相对应的价格之和被赋值给变量mValue,其值为33873。
接下来,假设我们能扩展这种技术到上文中已讨论的多条件测试公式。例如,统计在六月份(June)销售了多少Ford,代码如下:
Dim mModel As String
Dim mMonth As String
Dim mCount As Long
mModel = &Ford&
mMonth = &June&
mCount = Application.WorksheetFunction.CountIfs(Range(&A1:A10&), _
mModel, Range(&B1:B10&), mMonth)
代码将结果3赋值给变量mCount。不幸的是,这项技术不能被扩展到数组公式或者条件测试SUMPRODUCT公式。
例如,下面是统计在五月(May)有销售了多少Ford的公式:
=SUMPRODUCT((A2:A10=”Ford”)*(B2:B10=”Feb”))
你可能想使用下面的VBA代码得到相同的结果:
Dim mModel As String
Dim mMonth As String
Dim mCount As Long
mModel = &Ford&
mMonth = &May&
mCount = Application.WorksheetFunction.SumProduct( _
Range(&A1:A10&) = mModel, Range(&C1:C10&) = mMonth)
然而,在编译时会得到错误消息。在这种情况下,VBA试图简单地调用工作表函数,但并不会评估单元格区域并传递正确的数组信息到工作表函数中。
下面是该问题的解决方案。在VBA中使用Evaluate方法评估函数调用,转换Excel名称为值。代码如下:
Dim mModel As String
Dim mMonth As String
Dim mFormula As String
Dim mCount As Long
mModel = &Ford&
mMonth = &May&
mFormula = &SUMPRODUCT((A1:A10=&&& & mModel & _
&&&)*(B1:B10=&&& & mMonth & &&&))&
mCount = Application.Evaluate(mFormula)
虽然需要更多的努力来确保合适地构建函数调用的正确语法,并且合适地使用引号来确保字符串被引号括住,但是这仍然是一项有用的技术,提供了在VBA中使用SUMPRODUCT函数的能力。
Excel 2007及以上版本中的SUMPRODUCT
在Microsoft引入Excel 2007时,主要集中在容易使用以及改善商务分析功能。不幸的是,工作表函数没有得到太多的关注,只是引入了一些新的函数,其中的两个新函数:COUNTIFS和SUMIFS支持多条件测试。
例如,在我们前面的示例中:
=SUMPRODUCT((A1:A10=”Ford”)*(B1:B10=”June”))
=SUMPRODUCT((A1:A10=”Ford”)*(B1:B10=”June”)*(C1:C10))
我们统计单元格区域A1:A10中的内容为“Ford”并且单元格区域B1:B10中的内容为June的项目数,以及统计单元格区域A1:A10中的内容为“Ford”并且单元格区域B1:B10中的内容为June并将单元格区域C1:C10相应单元格求和。在Excel 2007及以上版本中,可以使用COUNTIFS函数和SUMIFS函数代替SUMPRODUCT函数,相应的公式为:
=COUNTIFS(A1:A10,”Ford”,B1:B10,”June”)
=SUMIFS(C1:C10,A1:A10,”Ford”,B1:B10,”June”)
在Excel 2007中,SUMPRODUCT函数的改进是可以取整列的地址。在Excel开发者工具库中,SUMPRODUCT函数仍然保留着其独特的位置,因为COUNTIFS函数和SUMIFS函数仍然不能够计算已关闭工作簿中的值。
双目运算符(–)与*运算符
在大多数情形下,可以使用SUMPRODUCT函数的“*”或”–“版本,并且都能得到正确的功能。然而,也有一些例外。考虑在单元格区域A1:B10中是一个包含姓名和数量的表,其中第一行是文本标题“Name”和“Amount”。公式:
=SUMPRODUCT(–(A1:A10=”Bob”),–(B1:B10)>0),B1:B10)
将正确地计算列A中姓名是“Bob”且列B中为正值的和。然而,公式:
=SUMPRODUCT((A1:A10=”Bob”)*(B1:B10>0)*(B1:B10))
将返回#VALUE!错误。错误的原因是由于B1中是文本,乘以文本值导致错误。为了解决错误,单元格区域不能含标题单元格,应以单元格A2和B2开始。
类似地,如果公式中的一个或多个单元格区域包含多列,则必须使用“*”运算符,而下面的公式将不能运行:
=SUMPRODUCT(–(A1:A10=”Bob”),–(B1:C10>0),–(B1:C10))
下面的公式工作得很好:
=SUMPRODUCT((A1:A10=”Bob”)*(B1:C10>0)*(B1:C10))
事实上下面的公式也可以:
=SUMPRODUCT((A1:A10=”Bob”)*(B1:C10>0),B1:C10)
如果在SUMPRODUCT函数中使用TRANSPOSE函数,那么必须使用“*”运算符。
很多人都知道使用数组公式要付出高的代价,如果过多地使用将明显减弱工作表/工作簿的重新计算速度。
虽然SUMPRODUCT函数不是数组公式,然而它也面临同样的问题。虽然SUMPRODUCT函数通常比等价的数组公式更快,但与数组公式一样,SUMPRODUCT函数比COUNTIF函数和SUMIF函数更慢,因此如果合适的话使用这些函数会更好。
因此,在下面的情形下,不要使用SUMPRODUCT函数:
=SUMPRODUCT((A1:A10=”Ford”)*(C1:C10))
而是使用等价的SUMIF函数:
=SUMIF(A1:A10,”Ford”,C1:C10)
甚至两个COUNTIF函数或SUMIF函数都比一个SUMPRODUCT函数更快,因此下面的公式:
=COUNTIF(A1:A10,>=10)-COUNTIF(A1:A10,>20)
比下面的公式更有效率:
=SUMPRODUCT((A1:A10>=10)*(A1:A10<=20))
大致提高20%。
下面将介绍SUMPRODUCT函数的实际应用示例。
示例1:统计内容为日期的单元格区域A42:A407中早于今天的数量,单元格区域J42:J407是一组变量数组值。
解决方案:使用($A$42:$A$407<TODAY())处理日期测试。在单元格区域中已经设置了变量数组值,需要联合使用MATCH和ISNUMBER函数。
=SUMPRODUCT((ISNUMBER(MATCH(J42:J407,Fred,0)))*($A$42:$A$407<TODAY()))
示例2:统计某给定日期后的数量。
解决方案:如果测试日期在某个单元格中,那么公式为:
=SUMPRODUCT((C5:C309>$A$1)*(H5:H309=”A”))
下面的公式展示了一项在所有版本Excel中,在SUMPRODUCT函数中测试日期的技术,在公式中嵌入日期字符串:
=SUMPRODUCT((C5:C309>(&#8211;(“”)))*(H5:H309=”A”))
示例3:在公式中不输入多个条件判断,而是将它们输入到单元格中,只是在公式中引用这些单元格,可以吗?
解决方案:这似乎是一个简单的问题,使用下面的公式:
=SUMPRODUCT((B5:B63=L1:N1)*(C5:C63))
然而,公式运行失败,因为在列中而不是在行中输入的是条件判断,因此需要使用TRANSPOSE函数来满足SUMPRODUCT函数的要求:
=SUMPRODUCT((B5:B63=TRANSPOSE(P46:P48))*(C5:C63))
由于使用了TRANSPOSE函数,所以必须作为数组公式输入上面的公式。
示例4:初始公式是:
=SUMIF(J2:J196,J209,L2:L196)
但还需要汇总下列单元格区域:R2:R196,U2:U196,V2:V196,Z2:Z196
解决方案:通过为每个单独的测试区域使用单独的SUMPRODUCT函数,很容易解决。但下面的方法别出心裁,在公式中使用“+”运算符:
=SUMPRODUCT(&#8211;(J2:J196=J209),L2:L196+R2:R196+U2:U196+V2:V196+Z2:Z196)
示例5:在单元格区域A1:A100中查找值为“good”的字符串的次数,但一些单元格包含引线或尾部空格,或者HTML非中断空格。
解决方案:基本的字符串统计是非常简单的,在公式中包含TRIM函数处理引线和尾部空格。但TRIM函数不能处理HTML非中断空格,这必须使用SUBSTITUTE函数从被测试的单元格区域中提取:
=SUMPRODUCT(&#8211;(TRIM(SUBSTITUTE(A1:A100,CHAR(160),””))=”good”))
示例6:统计单元格区域中唯一值的数量。
解决方案:如果整个单元格区域是A1:A20,那么公式为:
=SUMPRODUCT(1/COUNTIF(A1:A20,A1:A20))
然而,如果单元格区域中任一单元格为空,那么会返回#DIV/0。公式应修改为:
=SUMPRODUCT((A1:A20””)/COUNTIF(A1:A20,A1:A20 &#038; “”))
最后,为了克服一个Bug,即COUNTIF/SUMIF的第1个参数的隐含交叉区域使用该参数的父工作表的已用区域,也会返回#DIV/0,可以使用下面的公式:
=SUMPRODUCT((A1:A20””)/(COUNTIF(A1:A20,A1:A20)+(A1:A20=””)))
示例7:统计两个条件分别满足两个不同单元格区域的实例。例如,单元格区域A1:A10中的内容是国家,B1:B10中是洲,C1:C10中是代表是否属于G7国家的标志。现在需要统计在欧洲或者是G7国的数量。
解决方案:要统计在欧洲或者是G7国的国家的数量,可以使用:
=SUMPRODUCT((B1:B10=”Europe”)+(C1:C10=”Y”))
问题是上面的公式将双倍统计处于欧洲并且也是G7国的国家,可以使用下面的公式解决:
=SUMPRODUCT((B1:B10=”Europe”)+(C1:C10=”Y”))-SUMPRODUCT(&#8211;(B1:B10=”Europe”),&#8211;(C1:C10=”Y”))
使用SUMPRODUCT函数计算在欧洲且是G7国的国家数,然后减去重复统计的国家数。
当然,还有另一种方法,即:
=SUMPRODUCT(&#8211;((B1:B10=”Europe”)+(C1:C10=”Y”)>0))
这里,允许公式作双倍的统计,但添加了进一步的测试来检查每一个结果是否大于0。因此,在里层的公式返回数据集{0;2;1;1;0;0;0;0;0;0},测试该数据集中大于0的元素,得到数组{0;1;1;1;0;0;0;0;0;0},然后将数组求和得到正确的结果。
示例8:统计给定区域中多于一个值的实例。例如,统计单元格区域A1:A10中有多少“Ford”和“Chrysler”。
解决方案:可以使用下面的公式:
=SUMPRODUCT((A1:A10=”Ford”)+(A1:A10=”Chrysler”))
=SUMPRODUCT(&#8211;(A1:A10={“Ford”,”Chrysler”}))
示例9:单元格区域A1:A10中是货物编码,B1:B10中是相应的存放位置,C1:C10是相应的货物数量,需要统计在特定的位置包含部分货物编码的项数。SUMIF函数可以使用通配符,但仅能进行一次测试,而SUMPRODUCT函数不直接支持通配符。
解决方案:可以使用FIND函数测试是否在货物编码里内嵌有部分编码,ISNUMBER函数用来测试是否找到了匹配的编码(避免出现#VALUE错误)
=SUMPRODUCT(&#8211;(ISNUMBER(FIND(“ATN”,A1:A10))),&#8211;(B1:B10=”Birmingham”),&#8211;(C1:C10))
FIND函数区分大小写,如果不需要区分大小写,那么使用SEARCH函数:
=SUMPRODUCT(&#8211;(ISNUMBER(SEARCH(“ATN”,A1:A10))),&#8211;(B1:B10=”Birmingham”),&#8211;(C1:C10))
示例10:统计两个日期之间某天的数量,排除其中的任何假期。
解决方案:SUMPRODUCT函数可以用来计算两个日期之间某天的数量。例如,假设在单元格A1和A2中分别存放着这两个日期,下面的公式返回这两个日期之间星期三的数量。
=SUMPRODUCT(&#8211;(WEEKDAY(ROW(INDIRECT(A1 &#038; “:” &#038; A2)))=4))
这里利用了Excel以从日起的顺序号存储日期的原理,在INDIRECT函数中使用两个日期来“直接”在行中装载所有的日期,使用WEEKDAY函数和ROW函数来测试以确定这些日期中哪些是指定的日期。
NETWORKDAYS函数提供了一种在统计中排除假期的便利方法。此外,能够添加一个排除假期的测试来达到目的。假设假期存放在名称为holidays的命名单元格中,可以使用:
=SUMPRODUCT(&#8211;(WEEKDAY(ROW(INDIRECT(A1 &#038; “:” &#038; A2)))=4),&#8211;(COUNTIF(holidays,ROW(INDIRECT($A$1 &#038; “:” &#038; A2)))=0))
我们也可以模拟NETWORKDAYS函数来统计两个日期之间的天数,排除星期六、星期日和假期,公式如下:
=SUMPRODUCT(&#8211;(WEEKDAY(ROW(INDIRECT(A1 &#038; “:” &#038; A2)))1),(&#8211;(WEEKDAY(ROW(INDIRECT(A1 &#038; “:” &#038; A2)))7)),&#8211;(COUNTIF(holidays,ROW(INDIRECT($A$1 &#038; “:” &#038; A2)))=0))
看起来似乎没有必要,因为我们可以更容易地使用NETWORKDAYS函数,但相比NETWORKDAYS函数来说,这里提供了一点小小的优势,不用管日期顺序。通过改变星期值,可以使用排除任何的1、2、3或其它天数,不只是星期六和星期天。
注:Excel 2010中已经引入了NETWORKDAYS.INTL函数解决了部分NETWORKDAYS函数的局限。
示例11:仅对匹配某条件的可见单元格求和。例如,对单元格区域B1:B100中含有值“North”的相对应的A1:A100中的值求和,由于在数据中应用了筛选,一些行不可见。
解决方案:公式的第一部分是在单元格区域B1:B100中直接测试是否含有值“North”并求单元格区域A1:A100中的相应的值的和:
&#8211;($B$1:$B$100=“North”),$A$1:$A$100
可见单元格的统计比较复杂,使用SUBTOTAL函数以及联合使用ROW、INDEX和OFFSET函数:
&#8211;(SUBTOTAL(3,OFFSET(INDEX($A$1:$A$100,1,1),ROW($A$1:$A$100)-ROW(INDEX($A$1:$A$100,1,1))=1)
最终的公式如下:
=SUMPRODUCT(&#8211;(SUBTOTAL(3,OFFSET(INDEX($A$1:$A$100,1,1),ROW($A$1:$A$100)-ROW(INDEX($A$1:$A$100,1,1))=1), &#8211;($B$1:$B$100=“North”),$A$1:$A$100)
以前经常利用Chip Pearson的FindAll()函数,在一组数据中查找与条件的一部分相匹配的数据,非常方便。
不过,在Excel VBA中,实现某种结果往往有许多种方法,一些方法会更简洁快速。这不,Excel Hero [&]
本文来自于论坛,详细讲解了大家关注较多也较感兴趣的数组函数——SUMPRODUCT函数,下面是第3部分。
3 更多的条件
SUMPRODUCT函数是一个数组类型的函数,能够计算多个区域的数值相乘后之和。其语法为:
SUMPRODUCT(数组1,数组2,数组3,……)
返回数组(区域)中对应项相乘后的和。
例如下图所示的工作表数据:
要求将列A和列B中同一行的数据相乘后的结果相加,即:
A1×B1+ A2×B2+ A3×B3+…+ [&]
下列Excel函数用于处理矩阵:
MMULT(A,B) 返回两个矩阵乘积的矩阵
MINVERSE(A) 返回矩阵的逆A-1
MDETERM 返回矩阵的中值
示例1:基本使用
下表列出了一些常用的数学函数,供参考。
SUMSQ返回一组数字的平方和。可以是数值、数组、名称,或者是对数值单元格的引用。=SUMSQ(A1:A10)
SUMPRODUCT返回区域或数组对应元素乘积之和
SQRT返回正数的平方根
SQRTPI返回数字与π的乘积的平方根。=SQRTPI(2)等于=SQRT(2*PI())
Category: &&|&
&|&3,758 次阅读
微信订阅号
- 1,773,240 次阅读 - 1,083,402 次阅读 - 984,198 次阅读 - 704,946 次阅读 - 555,477 次阅读
2015年三月 &(1)
2015年一月 &(1)
2014年十二月 &(1)
2014年十一月 &(2)
2014年九月 &(3)
2014年八月 &(4)
2014年七月 &(1)
2014年六月 &(5)
2014年五月 &(4)
2014年四月 &(12)
2014年三月 &(10)
2014年二月 &(5)
2013年十一月 &(3)
2013年十月 &(3)
2013年五月 &(2)
2012年十二月 &(1)
2012年十月 &(1)
2012年九月 &(1)
2012年八月 &(2)
2012年七月 &(1)
2012年五月 &(1)
2012年三月 &(4)
2012年一月 &(4)
2011年十月 &(1)
2011年九月 &(3)
2011年八月 &(3)
2011年七月 &(1)
2011年六月 &(4)
2011年五月 &(8)
2011年四月 &(10)
2011年三月 &(17)
2011年二月 &(7)
2011年一月 &(6)
2010年十二月 &(3)
2010年十一月 &(6)
2010年十月 &(1)
2010年八月 &(2)
2010年七月 &(10)
2010年六月 &(10)
2010年五月 &(9)
2010年四月 &(4)
2010年三月 &(5)
2010年二月 &(5)
2010年一月 &(11)
2009年十二月 &(34)
2009年十一月 &(22)
2009年十月 &(30)
2009年九月 &(15)
2009年八月 &(22)
2009年七月 &(18)
2009年六月 &(18)
2009年五月 &(16)
2009年四月 &(10)
2009年三月 &(14)}

我要回帖

更多关于 如何使用excel表格 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信