execl 分类统计高手用VBA解决数据两个统计区域

商品编号:
京 东 价:
[定价:¥]
支  持:
搭配赠品:
服务支持:
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
绝了!Excel可以这样用:Excel效率提升秘笈+Excel数据处理、计算与分析+ExcelVBA编程实战宝典(套装共3册)
加载中,请稍候...
商品介绍加载中...
扫一扫,精彩好书免费看
  ★Excel一直职场人员手中的利器,如何熟练掌握并使用Excel,让其发挥出亮剑般的作用,可以从事李云龙先生潜心打造的这本书中寻找到答案。  ——上海华腾软件系统有限公司副总裁兼首席财务官 金源  ★面对大量的数据,初入职场的人往往不知所措。如累能利用Excel的强大功能去处理这些数据,就会事半功倍,效率大幅提高。本书便是一本能帮助你排忧解难的书,书中的例子都来自于实践,掌握后一定能提升你的Excel专业应用水平。  ——中国会计视野论坛会计Office版面版主 丁志刚  ★这年关,谁的电脑里没有几张Excel表?能不能玩转Excel表格,已成为很多企业招募人员的必备条件,尤其是该职位的人员需要和数据频繁打交道的话。本书关注Excel数据处理的各种常用功能,挖掘被忽略的技巧,不求面面俱到,但求运用之妙,特意推荐绐各位读者。  ——中国会计视野论坛资深版主 水落  ★作者在烦杂的数据处理与分析过程中,享受着不断发现与总结高效必理数据的成就,并将这种快乐分享鲐有类似因扰的朋友。待意推荐此书,期待更多的朋友从烦杂的工作中解脱出来,更希望朋友们能与作者一起分享数据之美,不断享受问题高效解决的成就与乐趣。  ——申舒斯仪表系统(福州)有限公司财务经理 刘岸  ★学习Excel的目的就是为了应用。本书作者正是循着实用的路线,利用自已在论坛和工作中长期积累的Excel问题解决经验,精心为广大Excel用户准备了这桌Excel“盛宴”。我相信每一个Excel用户都会从这本书中受益。  ——Excel精英培训网(EP)站长、微软全球最有价值专家赵志东(网名兰色幻想)  ★Excel向来是职场人士的左膀右臂,在视野论坛上甚至有将Excel列入注册会计师考试的呼声。李云龙版主已经出版的《绝了!Excel可以这样用——数据处理、计算与分析》在论坛的礼品兑换榜中遥遥领先,而即将要出版的这本新书更是灵活运用了思维导图,融理论和技巧于实践操作中,授人以鱼,更授人以渔。  ——上海国家会计学院中国会计视野论坛管理员胡晓栋  ★作为一名从事审计、税审的专业人员,接触过众多的财会人员,有感于多数人对Excel的应用仍处于初级水平,不知如何通过Excel提高财会工作的效率。我友李云龙,即将要出版的这本新书以职场中的Excel效率提升为主题,有助于职场人士解决实际工作中的问题,提高工作效率,培养Excel应用能力。  ——深圳市中税卓越税务师事务所有限公司合伙人马兴伟  ★李云龙版主的这本新书精选了工作中经常要遇到的实用例子,虽不能使你成为高手眼中的“高手”,但却能助你提高工作效率。秘笈在手,工作再无难题。  ——IT部落窝论坛版主、Excel畅销书《早做完,不加班》作者陈锡卢
京东商城向您保证所售商品均为正品行货,京东自营商品开具机打发票或电子发票。
凭质保证书及京东商城发票,可享受全国联保服务(奢侈品、钟表除外;奢侈品、钟表由京东联系保修,享受法定三包售后服务),与您亲临商场选购的商品享受相同的质量保证。京东商城还为您提供具有竞争力的商品价格和,请您放心购买!
注:因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件,本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货!并且保证与当时市场上同样主流新品一致。若本商城没有及时更新,请大家谅解!
权利声明:京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。
注:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
印刷版次不同,印刷时间和版次以实物为准。
价格说明:
京东价:京东价为商品的销售价,是您最终决定是否购买商品的依据。
划线价:商品展示的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:如无特殊说明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算出的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询。
异常问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询。
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
浏览了该商品的用户还浏览了
加载中,请稍候...
七日畅销榜
新书热卖榜
iframe(src='///ns.html?id=GTM-T947SH', height='0', width='0', style='display: visibility:')日, 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: &&|&
&|&1,970 次阅读
日, 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,132 次阅读
日, 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,608 次阅读
日, 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,914 次阅读
日, 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,665 次阅读
微信订阅号
- 1,771,424 次阅读 - 1,083,339 次阅读 - 983,900 次阅读 - 704,883 次阅读 - 555,444 次阅读
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)

我要回帖

更多关于 vc vba execl 的文章

 

随机推荐