求大神解释下这个VBA的函数声明到底在做什么,是做什么的?

求JS大神解释下,为什么我的clientHeight函数返回的是目前页面总内容高度,而不是可视范围的宽度,求解啊啊啊啊
<S相关信息RIPT
LANGUAGE="JavaScript">
="网页可见区域宽:"+
document.body.clientW
s+="\r\n网页可见区域高:"+
document.body.clientH
"\r\n网页正文全文宽:"+
document.body.scrollW
"\r\n网页正文全文高:"+
document.body.scrollH
"\r\n网页正文部分上:"+
window.screenT
"\r\n网页正文部分左:"+
window.screenL
"\r\n屏幕分辨率的高:"+
window.screen.
"\r\n屏幕分辨率的宽:"+
window.screen.
+="\r\n屏幕可用工作区高度:"+
windo......
<S相关信息RIPT
LANGUAGE="JavaScript">
="网页可见区域宽:"+
document.body.clientW
s+="\r\n网页可见区域高:"+
document.body.clientH
"\r\n网页正文全文宽:"+
document.body.scrollW
"\r\n网页正文全文高:"+
document.body.scrollH
"\r\n网页正文部分上:"+
window.screenT
"\r\n网页正文部分左:"+
window.screenL
"\r\n屏幕分辨率的高:"+
window.screen.
"\r\n屏幕分辨率的宽:"+
window.screen.
+="\r\n屏幕可用工作区高度:"+
window.screen.availH
+="\r\n屏幕可用工作区宽度:"+
window.screen.availW
(如果我的回答有用,请设置成有用)
我用innerHeight解决的问题。。。有空我再试试你说的availWidth吧。。。
其他答案(共5个回答)
window.document.body.clientHeight就可以window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeight 返回当前屏幕高度(空白空间) window.screen.width 返回当前屏幕宽度(分辨率值) window.screen.height 返回当前屏幕高度(分辨率值) window.document.body.offsetH 返回当前网页高度 window.document.body.offsetW 返回当前网页宽度 我们这里说说四种浏览器对 document.body 的 clientHeight、offsetHeight 和 scrollHeight 的解释。这四种浏览器分别为IE(Internet Explorer)、NS(Netscape)、Opera、FF(FireFox)。clientHeight大家对 clientHeight 都没有什么异议,都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,一般是最后一个工具条以下到状态栏以上的这个区域,与页面内容无关。offsetHeightIE、Opera 认为 offsetHeight = clientHeight + 滚动条 + 边框。NS、FF 认为 offsetHeight 是网页内容实际高度,可以小于 clientHeight。scrollHeightIE、Opera 认为 scrollHeight 是网页内容实际高度,可以小于 clientHeight。NS、FF 认为 scrollHeight 是网页内容高度,不过最小值是 clientHeight。简单地说clientHeight 就是透过浏览器看内容的这个区域高度。NS、FF 认为 offsetHeight 和 scrollHeight 都是网页内容高度,只不过当网页内容高度小于等于 clientHeight 时,scrollHeight 的值是 clientHeight,而 offsetHeight 可以小于 clientHeight。IE、Opera 认为 offsetHeight 是可视区域 clientHeight 滚动条加边框。scrollHeight 则是网页内容实际高度。同理clientWidth、offsetWidth 和 scrollWidth 的解释与上面相同,只是把高度换成宽度即可。=======================================================================clientHeight与offsetHeight的区别许多文章已经介绍了clientHeight和offsetHeight的区别,就是clientHeight的值不包括scrollbar的高度,而offsetHeight的值包括了scrollbar的高度。然而,clientHeight和offsetHeight的值到底由什么组成的呢?如何计算这两个数的值?1. clientHeight和offsetHeight的值由什么决定?假如我们有以下的DIV,主要显示的文字为"This is the main body of DIV"。如上图所示,clientHeight的值由DIV内容的实际高度和CSS中的padding值决定,而offsetHeight的值由DIV内容的实际高度,CSS中的padding值,scrollbar的高度和DIV的border值决定;至于CSS中的margin值,则不会影响clientHeight和offsetHeight的值。2. CSS中的Height值对clientHeight和offsetHeight有什么影响?首先,我们看一下CSS中Height定义的是什么的高度。如在本文最后部分“APPENDIX示例代码”(注:以下称为“示例代码”)中,innerDIVClass的Height值设定为50px,在IE下计算出来的值如下所示。也就是说,在IE里面,CSS中的Height值定义了DIV包括padding在内的高度(即offsetHeight的值);在Firefox里面,CSS中的Height值只定义的DIV实际内容的高度,padding并没有包括在这个值里面(70 = 50 + 10 * 2)。in IE: innerDiv.clientHeight: 46innerDiv.offsetHeight: 50outerDiv.clientHeight: 0outerDiv.offsetHeight: 264in Firfox:innerDiv.clientHeight: 70innerDiv.offsetHeight: 74outerDiv.clientHeight: 348outerDiv.offsetHeight: 362在上面的示例中,也许你会很奇怪,为什么在IE里面outerDiv.clientHeight的值为0。那是因为示例代码中,没有定义outerDIVClass的Height值,这时,在IE里面,则clientHeight的值是无法计算的。同样,在示例代码中,如果将innerDIVClass中的Height值去年,则innerDIV.clientHeight的值也为0。(注:在Firefox下不存在这种情况)。如果CSS中Height值小于DIV要显示内容的高度的时候呢(当CSS中没有定义overflow的行为时)?在IE里面,整个clientHeight(或者offsetHeight)的值并没有影响,DIV会自动被撑大;而在Firefox里面,DIV是不会被撑开的。如在示例代码中,将innerDivClass的Height值设为0,则计算结果如下所示。IE里面的DIV被撑开,其clientHeight值等于内容的高度与padding*2的和;而Firefox里面,文字将溢出DIV的边界,其clientHeight值正好是padding值的两倍。In IE:innerDiv.clientHeight: 38innerDiv.offsetHeight: 42outerDiv.clientHeight: 0outerDiv.offsetHeight: 256In Firefox:innerDiv.clientHeight: 20innerDiv.offsetHeight: 24outerDiv.clientHeight: 298outerDiv.offsetHeight: 312
希望能帮助到你,麻烦点击“有用”,谢谢!
问题已经解决,最后问题解决用的是innerHeight。。。。你粘的这些都没啥关系。。。。
两个取极限是为了确定函数是不是收敛,收敛函数才有极限
掌握概念,认真理解定义。找出脉络,加适当的联系就可以了
可以更改防火墙的拦截
有IE内核的就可以采用IE兼容模式浏览。至于js特效并未对其他浏览器进行定向开发。
无标题文档
var inputa= tElementById(&#034;a&#034;);
var inputb= tElementById(&#034;b&#034;);
va...
答: b超单上只有一个数据吗?正常情况下都会有些什么数据的啊?
答: IMS在企业发展过程中能起到什么作用呢?
首先,它能够帮助中小物流企业有效降低成本、提升管理效率;
其次,IMS能够帮助中小物流企业显著改善客户服务质量,建立良...
答: 探测实现技术4.1SNMPAgent的实现目前,已经有一些可用的SNMPAgent开发工具包,它们提供一些基本的框架平台,实现了Agent的通用功能,在其基础上...
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415查看: 531|回复: 7
求大神做表格的序列(我手动输的)累死额
阅读权限20
在线时间 小时
求大神,这张excel表如何排序,我的手动输的,筛选了不能直接拉,如何能排到序。建副本公式 还是什么办法??明示啊!大神。
QQ图片09.jpg (10.47 KB, 下载次数: 0)
17:51 上传
阅读权限20
在线时间 小时
这是表,,,,求达达们 帮忙,看看有方法没,不用手输,不胜感激
17:59 上传
点击文件名下载附件
548.41 KB, 下载次数: 14
阅读权限20
在线时间 小时
& & & & & & & &
没看懂,描述清楚点撒
阅读权限20
在线时间 小时
用VBA循环一下就好了&&今天没时间给你搞了
阅读权限20
在线时间 小时
做排序。quantitie是法语量的意思。这行下面的数字这行,排序。 我是手动输的,能用公式或者其他方法吗
阅读权限20
在线时间 小时
& & & & & & & &
做那张表的排序 有什么省事的方法没
阅读权限20
在线时间 小时
yueding_0315 发表于
用VBA循环一下就好了&&今天没时间给你搞了
大神,明天给咱教教吧。
阅读权限20
在线时间 小时
本帖最后由 yueding_0315 于
19:53 编辑
Sub paixu()
Dim arr, r, x, k
r = [c65536].End(xlUp).Row
arr = Range(&c1:c& & r)
For x = 3 To r
If arr(x, 1) = &N°du prix& Then
k = k + 1
Cells(x + 1, 2) = k
If k & 1 Then Cells(x - 1, 1) = k - 1
End If
Next x
Cells(r, 1) = k
End Sub复制代码
19:53 上传
点击文件名下载附件
543.34 KB, 下载次数: 6
最新热点 /1
ExcelHome每周都有线上直播公开课,
国内一流讲师真身分享,高手贴身答疑,
赶不上直播还能看录像,
关键居然是免费的!
厚木哥们都已经这么努力了,
你还好意思说学不好Office。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师先说结论,VBA依旧是办公利器。以我的个人经历而言,在BCG做过三年咨询顾问,写了上万行的VBA程序,每个项目一千至几千行程序不等。最后将Excel用成了中控界面,类似EMACS,在Excel可以随意操控全公司的打印机、Word、Powerpoint等等,自动完成各种任务以及数据更新和抓取。依靠VBA,在效率上是一般同事的数倍甚至是高一个量级,你说VBA还是不是办公利器?&br&&br&不过题主得到的反馈也正常,许多高级程序员确实瞧不上VBA。因为程序员是有鄙视链的:汇编 &C &C++ &Python &Java及C#及PHP(这三者相互撕) &VB &HTML。在这长长的鄙视链中,甚至都没有VBA的位置。&br&&br&但是Office+VBA是图灵完备的,所以被程序员用来耍酷的各类性感语言能实现的大部分功能,VBA都能实现,而且往往是以更高效更快捷的方式,在这里不谈效率和优雅。较之Python等常用语言,VBA各有攻防各有优缺点。Python的优势当然是扩展性强、超越Office环境之后的适用性强、资源丰富以及效率高,而VBA的优点如下:&br&&ul&&li&环境不依赖,只需要打开装机自带的Office,然后按下Alt+F11就自动进入编程和执行环境&/li&&li&上手简单,学习曲线很平缓,甚至可以更简单的通过录制宏来解决写程序的问题,只需要在简单的代码基础上修修补补就可以执行,参考&a href=&/question//answer/& class=&internal&&Excel VBA 如何快速学习? - 何明科的回答&/a&&br&&/li&&li&与办公环境完美兼容,在Excel/Word/Powerpoint/Outlook/Access之间随便穿梭,比胶水语言还要简单易用&/li&&li&分享性和移植性很强,几乎所有测试通过的程序放到别的机器上也可轻易执行(如果不考虑各种本地文件位置)&/li&&/ul&&br&基于以上的优劣势对比,VBA仍然是当之无愧的办公利器之王。而且大家不用太在乎手中的工具(VBA还是Python或者其他),核心还是使用工具的人以及人的思考。&br&&br&下面列举Office+VBA实现的若干功能,真正为职场人士省时省事省力。大部分内容在回答(&a href=&/question//answer/& class=&internal&&Excel 到底有多厉害? - 何明科的回答&/a&)中已经出现过。不愿意点击过去阅读的,直接看下面的克隆内容。&br&&br&&b&1、批量修改格式&/b&&br&下图是利用Powerpoint中录制的宏再加上稍微修改的代码(甚至都称不上是改代码,大部分是改参数),将Powerpoint中所有的字体及字号进行统一修改。常做PPT而且需要根据老板的喜好改来改去的同学们,知道这个批处理功能有多么救命。&br&&img src=&/573d74cb3d835acefab6e_b.png& class=&content_image&&&br&&br&&b&2、批量完成打印&/b&&br&刚进职场的新人,只要爸爸不是李刚,基本都做过影帝影后(影=印,各种复印打印的体力劳动)。特别是咨询投行服务行业,在大忽悠会议之前之后,花数小时或者整晚来打印数个文件,并不是天方夜谭。而且这件事情是对着同样一堆不断修改的文件,会经常不断重复发生。&br&&br&我写的第一个VBA程序就是完成对100多张Excel表格的自动打印,因为是第一个VBA程序,所以比较挫,基本上是宏录制之后来改的,没有使用参考书及搜索引擎,全靠F1和自动提示,所以贴出来特别纪念一下。但也让大家清楚VBA上手也多么容易。实现的功能就是将每周都要做一次的100多张表格的按顺序打印让机器自动做一遍,而且需要防卡纸:按下一个“妞”,就慢慢美妙结果的发生。&br&&img src=&/e7cd68bf4a6f60b935a05f5_b.png& data-rawwidth=&676& data-rawheight=&424& class=&origin_image zh-lightbox-thumb& width=&676& data-original=&/e7cd68bf4a6f60b935a05f5_r.png&&后来这个程序的升级版是:调度多台打印机,进一步提高效率,以及将打印机卡纸造成队列错误的概率降到极小的范围内。&br&&br&&b&3、制作炫目视觉效果(图表、动画及油画)&/b&&br&图表制作是每个Office一族的必备任务,制得一手好表格,绝对是升职加薪和偷懒放风的利器。在回答(&a href=&/question//answer/& class=&internal&&黄焖鸡米饭是怎么火起来的? - 何明科的回答&/a&),就利用Excel+VBA做出数张炫酷的信息地图,利用VBA为每个省的图形涂色。&br&&img src=&/71d4c477d5dcc8ced48cdd_b.png& data-rawwidth=&1373& data-rawheight=&584& class=&origin_image zh-lightbox-thumb& width=&1373& data-original=&/71d4c477d5dcc8ced48cdd_r.png&&(涂色部分来自于网上的一段程序,制作GIF动画的是自己完成的)&br&&br&同时,为了进一步增强炫酷结果,还利用VBA将这些连续变化的图表做成了GIF动画。&br&&img src=&/8a517ecb76ee9144e6beb_b.png& data-rawwidth=&1197& data-rawheight=&589& class=&origin_image zh-lightbox-thumb& width=&1197& data-original=&/8a517ecb76ee9144e6beb_r.png&&&br&另外还可以利用Excel,把心仪妹子的图片拿到手,然后用Excel化成点阵图并进行油画效果的处理,然后送给她撩一撩。&br&&img src=&/ae03578effcf9a205d0ad3c267d9eaa6_b.png& class=&content_image&&&br&&b&4、&/b&&b&撰写&/b&&b&八股文&/b&&br&这是帮朋友实现的一个项目,他们实验室是研究某类事故并对重大事故进行鉴定,最后发布word版的正式报告。之前的工作流程是在专业的软件中完成计算和仿真,最后按照正式报告八股文的行文,把各种关键信息填进去,最后写成Word文件。写报告的过程枯燥而没有技术含量,但却要反复进行。&br&&br&通过下图的Word+VBA,完成主要的交互界面并连接计算软件。在通过简单的交互获取主要信息后,在后台完成计算并将主要信息填写入八股文的Word模版,最终完成报告,同时将结构化的信息存入Access数据库。&br&&img src=&/7ad306a95db0a7197aa7_b.png& data-rawwidth=&866& data-rawheight=&521& class=&origin_image zh-lightbox-thumb& width=&866& data-original=&/7ad306a95db0a7197aa7_r.png&&&br&&b&5、管理项目及同步内容&/b&&br&这是协助某国际大型汽车制造厂完成新品牌及其新款车型上市,面临车型即将断档的窘境,该新车型的上市非常关键,不能错失时间节点。然而,新车型上市涉及到无数分支:制造、产品、市场、渠道、营销、公关、财务等等,同时还要协调欧洲的两个总部以及中国的两个分部。&br&&br&这次咨询的核心任务就是项目管理,总控整个大项目的进度,并每周向中国区的CEO汇报进度并发掘出易出现问题的关键节点以调配资源。我们4个咨询顾问分配下去各自负责几个部门或者项目分支,和团队一起规划流程、画甘特图、确认里程碑及时间点、安排负责人等等。当每天回到办公室大家将进度汇总在一起的时候发现了挑战及难点,每条任务线并不是独立发展的,而是各条任务线交织在一起并互相影响。&br&&ul&&li&某些核心人员在多个任务线出现。比如:负责预算的财务人员,几乎要出现在各条线中负责相关预算的审批环节&/li&&li&某些任务线的里程碑是其他任务线里程碑的必要条件而相互关联。比如:新车的下线时间影响发布会的时间,相关法规测试的通过又影响车辆的下线时间等等&/li&&/ul&&br&当任务线增多以及任务线之间的交叉越发频繁的时候,汇总的任务将会几何级数增加,这就是我们在项目过程中遇到的问题。于是我利用Excel+VBA完成了这个工作的自动化。主要实现的功能:&br&&ul&&li&自动将4个顾问手中分散的Excel文件汇集在一起形成一个大的总表,如下图&/li&&li&各顾问手中的表格是按照部门维度来划分的,汇总后需要按照不同的维度来输出不同类型的表格,比如:按任务线输出表格、按责任人输出表格、所有延误任务的表格、所有需要资源重点投入任务的表格等等&/li&&/ul&&img src=&/735d490e3ccd5ada806bc31_b.png& data-rawwidth=&921& data-rawheight=&663& class=&origin_image zh-lightbox-thumb& width=&921& data-original=&/735d490e3ccd5ada806bc31_r.png&&&br&在此基础之上,还要将上面提到的各种维度下的所有表格(大概有200多张),按要求格式粘贴到PPT中,每周提交给中国区的总部进行汇报和评估。密密麻麻的表格如下图。于是,我又写了一个程序将Excel中的表格输出到Powerpoint中,将一个秘书每次需要数小时才能完成的工作,简化成了一键发布,并可以在Excel中完成对PPT的更新。&br&&img src=&/532ae9df984_b.png& data-rawwidth=&1725& data-rawheight=&745& class=&origin_image zh-lightbox-thumb& width=&1725& data-original=&/532ae9df984_r.png&&&br&这个项目的程序量不小,近似于写了一个迷你版的Microsoft Project来进行项目管理。&br&&img src=&/d327e4e90bd0f33adbffa_b.png& data-rawwidth=&1841& data-rawheight=&813& class=&origin_image zh-lightbox-thumb& width=&1841& data-original=&/d327e4e90bd0f33adbffa_r.png&&&br&最后,下图中密密麻麻的PPT每周需要更新一次,每次都是快100张的工作量,然而基本上都是靠Excel来自动完成更新的。因为PPT的模版每次变化不大,我将这些模版记录下来,每周更新的时候只要根据Excel中最新的数据更改PPT中的数据即可。&br&&img src=&/14ce50e4e2fc80b04ac669d_b.png& data-rawwidth=&1709& data-rawheight=&757& class=&origin_image zh-lightbox-thumb& width=&1709& data-original=&/14ce50e4e2fc80b04ac669d_r.png&&&br&&br&&b&6、海量下载Bloomberg数据并完成分析&/b&&br&通过Bloomberg的VBA API,海量下载数百只目标股票的tick data以及order book。&br&&img src=&/dc2c5a0e7d339fed7ab5979_b.png& data-rawwidth=&930& data-rawheight=&273& class=&origin_image zh-lightbox-thumb& width=&930& data-original=&/dc2c5a0e7d339fed7ab5979_r.png&&&br&并根据实现构建好的数学模型,在后台完成计算,将上述的实时数据转化成每只股票实时的trading cost,实时展现在交易员最常用的Excel界面中,方便交易员评估当下的交易成本以便于优化交易策略。&br&&img src=&/c1ab8cb20657c8_b.png& data-rawwidth=&1205& data-rawheight=&222& class=&origin_image zh-lightbox-thumb& width=&1205& data-original=&/c1ab8cb20657c8_r.png&&&br&&br&&blockquote&更多文章请到&a href=&/hemingke& class=&internal&&数据冰山 - 知乎专栏&/a&&br&更多回答请看&a href=&/people/he-ming-ke& class=&internal&&何明科的主页&/a&&/blockquote&
先说结论,VBA依旧是办公利器。以我的个人经历而言,在BCG做过三年咨询顾问,写了上万行的VBA程序,每个项目一千至几千行程序不等。最后将Excel用成了中控界面,类似EMACS,在Excel可以随意操控全公司的打印机、Word、Powerpoint等等,自动完成各种任务以及…
&b&更新&/b&:谢谢大家的支持。第五步颜色漏写了命名方法,已补充。如果还有问题可以参看本答案或我专栏文章的评论区,里面的讨论基本可以解决大部分人遇到的问题。再次抱歉,08年做的,这次直接放上知乎,漏了一步,确属粗心,记性差,检讨。&br&&br&我在专栏(&a href=&/qianliang28& class=&internal&&钱粮胡同28号&/a&)里写了一篇文章:&a href=&/p/?refer=qianliang28& class=&internal&&用Excel做出强大漂亮的数据地图 - 钱粮胡同28号&/a& 放在这里分享给大家。&br&&br&&b&这个方法的好处是:1)不累,快;2)不需要任何插件,走到哪儿只要有一个Excel就够;3)弹性强&/b&,可以利用同样的方法,很快做出各种各样的热感地图。&br&&br&&b&#正文走起&/b&&br&我个人比较喜欢&b&从零DIY热感地图&/b&,学会了整套流程和方法,以后遇到任何类似问题都好解决。正好有很多知友在我的一些回答中问过我,我的那些热感地图怎么做出来的(&b&我的那些回答请参考这个答案末尾的各种热感图图例&/b&)。借这个机会,&b&我毅然决定&/b&,专写一篇文章来说说我的数据地图是怎么画的。&br&&br&很简单,&b&按照我的方法,六步你就可以画出自己的热感地图&/b&,不需要GIS软件,各种地图都适用。&br&&br&&p&&b&前提:&/b&你要有Excel这个软件啊(否则搞毛),还要能上网啊(能看到这回答说明正在上网吧?)&/p&&br&&b&第一步&/b&:需要一张普通的地图图片&br&&br&&p&这个很简单,网上到处都有。中国的省级地图,地级市地图,甚至县级地图都可以找到。&b&这里两个小要求&/b&:1)尽量找张&b&干净&/b&的图,干净指的是地图的边界清晰;2)svg格式的图(Scalable Vector Graphics)- 别慌,&b&推荐你个下载svg格式地图模板的好去处&/b&: &a href=&///?target=https%3A//commons.wikimedia.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Wikimedia Commons&i class=&icon-external&&&/i&&/a&&/p&&br&&p&在这个网站搜索&b&China provinces&/b&,可以得到下面这些图(上百张),第一张图就很符合我们的要求:&/p&&br&&img src=&/9706acbfce6cf4a75935d_b.png& data-rawwidth=&513& data-rawheight=&484& class=&origin_image zh-lightbox-thumb& width=&513& data-original=&/9706acbfce6cf4a75935d_r.png&&&br&&b&第二步:&/b&打开下载的svg图。这里推荐个&b&免费开源&/b&的软件:&a href=&///?target=https%3A//inkscape.org/en/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Inkscape&i class=&icon-external&&&/i&&/a&。用这个&b&软件打开svg的地图&/b&,然后&b&另存为Enhanced Meta File(emf)格式&/b&的文件。&br&&br&&p&&b&第三步:&/b&用&b&excel导入emf&/b&的文件,然后&b&ungroup这个地图变成freeform&/b&的图形,如下图。&/p&&br&&p&&img src=&/b049aae2b0a8eaf5f4fb_b.png& data-rawwidth=&837& data-rawheight=&728& class=&origin_image zh-lightbox-thumb& width=&837& data-original=&/b049aae2b0a8eaf5f4fb_r.png&&这样我们就得到了excel里面的地图素材。&/p&&br&&b&第四步&/b&:每个省现在对应的名字都没有,我们需要重新命名。比较直观简单的方法:鼠标点击选一个省,在左上角公式旁边的文本框里输入省的名字,如下图:&br&&img src=&/f5f697f5db4c33c787f1db_b.png& data-rawwidth=&401& data-rawheight=&472& class=&content_image& width=&401&&&br&&b&补充1:&/b&评论里总结了一下,命名省份的时候如果出现问题可以选中一个省份,然后在selection pane里面找到对应的图形,重新命名就好。&b&批量命名&/b&也是有方法的,但是略微复杂,有兴趣的话我可以放上来(对于比较了解Excel和vba的盆友,我就点一句:直接用Excel打开svg文件(对的,不是插入图片,是传统数据形式打开svg文件(类xml格式)),剩下就都明白了)。&br&&br&&b&第五步&/b&:在excel里另建一个worksheet(&b&命名为&Data_Province&&/b&),按照下图来设计版面&b&(如果不熟悉VBA,那么版面的行与列等格式一定按照下面的图片)&/b&:&br&&b&更新:&/b&F列每个颜色的单元格漏写了对应的命名,比如白色的单元格,将其命名为对应的J列的值(classpro0)&br&&img src=&/7646ebc151bee935c6345_b.png& data-rawwidth=&902& data-rawheight=&686& class=&origin_image zh-lightbox-thumb& width=&902& data-original=&/7646ebc151bee935c6345_r.png&&&br&&b&渐变颜色可以自己选择&/b&,目前这个例子是从0到5六种类别(颜色),根据你的研究需要(比如各省人均收入水平你按照高低分了10类,那就10种),随便改多少种都可以,&b&唯一注意的就是命名的区域要跟着变&/b&。&b&再啰嗦一下&/b&:根据你自己的分类标准,筛选你的数据,将筛选后的分类结果(比如6种 0-5)对应到之前提到的类别中,这样也就对应好了颜色。&br&&br&&p&&b&第六步&/b&:这些都做完了,&b&在地图那页worksheet里面加个按钮,把下面这段VBA程序copy进去&/b&:&/p&&div class=&highlight&&&pre&&code class=&language-text&&For i = 2 To 32 '这里是省的数量,2代表的是后面连接的数据表起始位是第二行,可以根据你自己的设计更改
Range(&actRegProvince&).Value = Range(&Data_Province!D& & i).Value '按顺序选取数据表中省份
ActiveSheet.Shapes(Range(&actRegProvince&).Value).Select '激活对应的省份地图
Selection.ShapeRange.Fill.ForeColor.RGB = Range(Range(&actRegCodeProvince&)).Interior.Color '将数据表中省份对应的颜色类别赋值给对应的省份地图
&/code&&/pre&&/div&&b&补充说明&/b&:Data_Province!D中Data_Province是第五步建的数据表(worksheet)的名字,D指的是省份名字所在的列(见上面那张截图)。根据自己的需要可以改成你喜欢的名字或位置。&br&&br&&b&第七步&/b&:这步不算了啊!就是六步~&br&&br&&b&点击按钮,享受成果,不谢!&/b&&br&&br&&p&把刚才的地图换成紫色渐变色,效果如下:&/p&&img src=&/6ef7e869c4cc8d2a7bf43_b.png& data-rawwidth=&858& data-rawheight=&728& class=&origin_image zh-lightbox-thumb& width=&858& data-original=&/6ef7e869c4cc8d2a7bf43_r.png&&&br&&br&&b&我过去的研究里用过的一些样图&/b&(ps: 数据原因,有些图未包含台湾)&b&:&/b&&br&&p&&b&地级市级别方言地图,&/b&请参考:&a href=&/question//answer/& class=&internal&&文化对经济有着怎样的影响? - 钱粮胡同的回答&/a&&/p&&p&&img src=&/a617db1cf127f0d935bf_b.png& data-rawwidth=&389& data-rawheight=&259& class=&content_image& width=&389&&&b&地级市层面经济集群图&/b&,请参考:&a href=&/question//answer/& class=&internal&&中国是否真的需要均衡发展? - 钱粮胡同的回答&/a&&/p&&p&&img src=&/b24a0b305a2ec8e0706b5f_b.png& data-rawwidth=&414& data-rawheight=&334& class=&content_image& width=&414&&&b&神经网络算法分类中国地级市&/b&,请参考:&a href=&/question//answer/& class=&internal&&机器学习(machine learning)在经济学领域是否有应用前景? - 钱粮胡同的回答&/a&&/p&&br&&img src=&/440afa32b_b.png& data-rawwidth=&523& data-rawheight=&397& class=&origin_image zh-lightbox-thumb& width=&523& data-original=&/440afa32b_r.png&&&br&&br&&b&同样方法制作县级地图&/b&&br&&img src=&/f786fc32b53e916d4f685f360c8bd1c1_b.png& data-rawwidth=&796& data-rawheight=&650& class=&origin_image zh-lightbox-thumb& width=&796& data-original=&/f786fc32b53e916d4f685f360c8bd1c1_r.png&&&br&&br&如果制作过程中遇到问题,请留言。
更新:谢谢大家的支持。第五步颜色漏写了命名方法,已补充。如果还有问题可以参看本答案或我专栏文章的评论区,里面的讨论基本可以解决大部分人遇到的问题。再次抱歉,08年做的,这次直接放上知乎,漏了一步,确属粗心,记性差,检讨。 我在专栏(
最讨巧的方式是:&br&1)对想实现的功能手工操作一遍,同时录制宏&br&&img src=&/9d4d1edab9a_b.png& class=&content_image&&&br&&br&2)根据录制的宏,更改参数及简单修改代码(加IF或者For循环)。下图是我写的第一个VBA代码,准确说是拿Macro录制后改出来的。&br&&img src=&/e7cd68bf4a6f60b935a05f5_b.png& class=&content_image&&&br&详情见&a href=&/question//answer/& class=&internal&&Excel 有哪些可能需要熟练掌握而很多人不会的技能? - 何明科的回答&/a&&br&&br&3)搜索引擎各种查,加上根据VBA的提示各种改。具体教程和案例,可以关注这个:&a href=&/hemingke/& class=&internal&&粉丝回馈:程序让你更性感 - 数据冰山 - 知乎专栏&/a&&br&&br&————————————————————&br&更多文章关注我的专栏:&a href=&/hemingke& class=&internal&&数据冰山 - 知乎专栏&/a&
最讨巧的方式是: 1)对想实现的功能手工操作一遍,同时录制宏 2)根据录制的宏,更改参数及简单修改代码(加IF或者For循环)。下图是我写的第一个VBA代码,准确说是拿Macro录制后改出来的。 详情见
&p&Excel有个Power Map的功能,5分钟就能搞定一个简单的数据地图。&/p&&p&&b&第一步:下载安装&a href=&///?target=https%3A///en-us/download/details.aspx%3Fid%3D38395& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Power Map Preview for Excel 2013&i class=&icon-external&&&/i&&/a&,下载完后可在工具栏的【插入】选项卡中找到Power Map。&/b&&/p&&p&&b&第二步:准备数据。&/b&这里我准备了一组省市的销售额和利润数据,希望能够在地图上显示各个省的销售额分布,以及每个城市的销售/利润情况。&/p&&p&选择数据,启动Power Map并新建演示。&/p&&img src=&/v2-d431c7905acdc439a8b8bc_b.png& data-rawwidth=&2560& data-rawheight=&1440& class=&origin_image zh-lightbox-thumb& width=&2560& data-original=&/v2-d431c7905acdc439a8b8bc_r.png&&&p&&b&第三步:绘图&/b&&/p&&p&基于以上的目的,在这里我要建立两个图层,一个用于展示各省的销售额分布,另一个用于每个城市的销售/利润对比。&/p&&p&图层一:省销售额&/p&&p&区域选择省,地理和地图级别选择省&/p&&img src=&/v2-48dba49f5_b.png& data-rawwidth=&2554& data-rawheight=&1292& class=&origin_image zh-lightbox-thumb& width=&2554& data-original=&/v2-48dba49f5_r.png&&&p&选择&b&区域可视化&/b&的图表,数据展示销售额。&/p&&img src=&/v2-0fd7962fdd8eb5f2108d3_b.png& data-rawwidth=&2556& data-rawheight=&1303& class=&origin_image zh-lightbox-thumb& width=&2556& data-original=&/v2-0fd7962fdd8eb5f2108d3_r.png&&&p&设置中可以修改颜色和色阶&/p&&img src=&/v2-fd3a8c3c814a_b.png& data-rawwidth=&635& data-rawheight=&985& class=&origin_image zh-lightbox-thumb& width=&635& data-original=&/v2-fd3a8c3c814a_r.png&&&p&&br&&/p&&p&图层二:城市销售利润&/p&&p&区域选择城市,地理和地图级别选择城市&/p&&img src=&/v2-b7e79b712aeba6edf7bb1_b.png& data-rawwidth=&2554& data-rawheight=&1300& class=&origin_image zh-lightbox-thumb& width=&2554& data-original=&/v2-b7e79b712aeba6edf7bb1_r.png&&&p&选择簇状柱形图的图表,数据展示销售额和利润。&/p&&img src=&/v2-0ef2da03a3b01ee3f07accc1da5f6c92_b.png& data-rawwidth=&610& data-rawheight=&872& class=&origin_image zh-lightbox-thumb& width=&610& data-original=&/v2-0ef2da03a3b01ee3f07accc1da5f6c92_r.png&&&p&&b&第四步:播放展示效果&/b&&/p&&img src=&/v2-eb6f0c6e45b4e_b.jpg& data-rawwidth=&1000& data-rawheight=&493& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/v2-eb6f0c6e45b4e_r.jpg&&&p&&br&&/p&&p&如果是复杂的地图比如流向地图、动态地图需要写VBA开发,比如下图这张美国飓风的动效轨迹图&/p&&p&&br&&/p&&img src=&/v2-226ffbc4d98c84bc775c555d2181f42c_b.jpg& data-rawwidth=&1486& data-rawheight=&846& class=&origin_image zh-lightbox-thumb& width=&1486& data-original=&/v2-226ffbc4d98c84bc775c555d2181f42c_r.jpg&&&p&&b&1、素材准备&/b&&/p&&p&① 一张带经纬线的美国·大西洋地图。因为公共服务提供的经纬度并不精确,各大地图工具都不带经纬度。当初翻遍了网络,在德克萨斯大学的地图图书馆&a href=&///?target=http%3A//www.nhc.noaa.gov/tracking_charts.shtml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&NHC Blank Tracking Charts&i class=&icon-external&&&/i&&/a&,找到了这张地图。&/p&&img src=&/v2-b33a01d2e8b67d4cbb1b2cca21fe86b2_b.png& data-rawwidth=&3300& data-rawheight=&2550& class=&origin_image zh-lightbox-thumb& width=&3300& data-original=&/v2-b33a01d2e8b67d4cbb1b2cca21fe86b2_r.png&&&p&②从&a href=&///?target=https%3A///hurricane/atlantic/2017/hurricane-irma%3Fmr%3D1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Hurricane & Tropical Cyclone Details&i class=&icon-external&&&/i&&/a&上下载Irma飓风的移动路径数据,包括日期时间、经纬度、风力等。&/p&&img src=&/v2-d0a4dcf5bac03f521c6581dba053fe98_b.png& data-rawwidth=&1650& data-rawheight=&1120& class=&origin_image zh-lightbox-thumb& width=&1650& data-original=&/v2-d0a4dcf5bac03f521c6581dba053fe98_r.png&&&p&&b&2、处理数据&/b&&/p&&p&经纬度、风速、风压等去单位。&/p&&p&日期和时间要稍作处理转换成Excel便于处理的日期数据。&/p&&p&时间间隔前期基本上都是每6小时的记录一次数据,后期每3小时甚至每小时就记录一次,这里为了便于后期好处理,统一留下每6小时的数据。&/p&&img src=&/v2-1a4e2bbf3da9_b.png& data-rawwidth=&1312& data-rawheight=&999& class=&origin_image zh-lightbox-thumb& width=&1312& data-original=&/v2-1a4e2bbf3da9_r.png&&&p&&b&3、绘制气泡图&/b&&/p&&p&将上面的地图插入到表格中,然后在上面绘制一张气泡图,气泡图的X轴数据就是经度数据,Y轴数据就是纬度数据,气泡大小取自风力大小的数值。&/p&&p&设置绘图区格式,根据经纬度坐标的读数来设置气泡图中坐标轴的最大值和最小值,并且使坐标间隔和地图上的经纬度间隔一致,比如这里间隔是5,这样可以保证气泡图绘制的数据点与地图中实际的经纬度相匹配。&/p&&p&拖拽移动图表绘图区的边框,使它与底层大西洋地图中的坐标轴线相互重合。然后隐去轴数据,边框什么的都设置“无”。&/p&&p&&b&4、制作动效&/b&&/p&&p&&b&【思路】&/b&&/p&&p&要想实现轨迹的动效,这里可以使用滑动条控件来控制时间,每滑动一次,时间就增加6小时。&/p&&p&滑动条所链接的单元格把数据传递给图表左侧的表格区域中,然后通过对时间点的查询得到相应的经纬度数据和风力风压数据。同时再由这个时间数据生成图表的两组数据源,由此构造形成整个控制链,并完成滑动条对图表的最终控制。&/p&&p&进一步,我想实现滑动条的自动控制,这里则需要通过VBA代码来实现,让图表自动播放。&/p&&p&&b&【操作】&/b&&/p&&p&1、用VBA写两个宏,一个控制启动,一个控制停止。&/p&&p&2、绘制4个控件,分别代表启动、停止、循环、滑动条,指定上述宏。&/p&&p&3、滑动条控件格式指定左侧单元格,左侧单元格会记录滑动数据,上方data & time调用此单元格数据。&/p&&p&&b&4、准备动态数据&/b&&/p&&p&为实现以上动态效果,其实在气泡图中准备了两组数据。一组显示当前时间点之前飓风所走过的所有路径点,另一组则标记当前时间点飓风所在位置。&/p&&p&这里需要用到LOOKUP函数,并调用data & time单元格数据。&/p&&p&第一组数据选取小于等于当前时间点的所有数据,并将其他数据点设为#N/A。&/p&&blockquote&=IF($A9&=LOOKUP(map!$C$3,$A$2:$A$55),data!D9,NA())&/blockquote&&p&第二组选取与当前时间相匹配的数据,其他数据也设为#N/A。这里,#N/A不会在图表中显示数据点。&/p&&blockquote&=IF(A9=LOOKUP(map!$C$3,$A$2:$A$55),data!D9,NA())&/blockquote&&img src=&/v2-31a3c66a9cdb6dd2c8a82_b.png& data-rawwidth=&2215& data-rawheight=&1315& class=&origin_image zh-lightbox-thumb& width=&2215& data-original=&/v2-31a3c66a9cdb6dd2c8a82_r.png&&&p&&b&5、气泡图绑定数据源&/b&&/p&&img src=&/v2-29c2fc534bfcc7597bd9_b.png& data-rawwidth=&1142& data-rawheight=&481& class=&origin_image zh-lightbox-thumb& width=&1142& data-original=&/v2-29c2fc534bfcc7597bd9_r.png&&&p&至此,就都搞定了,图表中的文本框则可以通过链接单元格,直接从单元格当中获取数据点的信息。&/p&&p&此外,这里除了气泡图,图表中还添加了一组柱形图来展示风力,数据绑定的操作形式和上面气泡图如出一辙。&/p&
Excel有个Power Map的功能,5分钟就能搞定一个简单的数据地图。第一步:下载安装,下载完后可在工具栏的【插入】选项卡中找到Power Map。第二步:准备数据。这里我准备了一组省市的销售额和利润数据,希望能够在地图上显示…
我还是直接发云盘链接吧。&br&因为我云盘和VBA相关的资源太多,也太杂了&br&有空整理一下继续更新好了。&br&这里先发一小部分资料。&br&一口气发太多反而不好让新人选择了。&br&(不知道是否涉及不规范转载,如有侵权请告知,我直接删除答案)&br&&br&&br&讲真,能把《别怕,Excel VBA其实很简单.pdf》读完。基本做点简单的东西没什么问题。&br&&br&把《兰色幻想vba从入门到进阶80集完整版》&br&认真看完吃透,加上一些积累,基本就是一个高手了……&br&&br&&br&别怕,Excel VBA其实很简单.pdf&br&&a href=&///?target=http%3A///share/link%3Fshareid%3D%26uk%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&兰色幻想vba从入门到进阶80集完整版.zip&br&&a href=&///?target=http%3A///share/link%3Fshareid%3Duk%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&(代码)常用的VBA短句(带注释).doc&br&&a href=&///?target=http%3A///share/link%3Fshareid%3D%26uk%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&Excel+VBA编程入门范例.pdf&br&&a href=&///?target=http%3A///share/link%3Fshareid%3D%26uk%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&千寻千解
VBA编程与实践.pdf&br&&a href=&///?target=http%3A///share/link%3Fshareid%3D%26uk%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&&br&VBA教程入门.pdf&br&&a href=&///?target=http%3A///share/link%3Fshareid%3D%26uk%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&Excel VBA 基础教程.pdf&br&&a href=&///?target=http%3A///share/link%3Fshareid%3D%26uk%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&[从零开始学Excel.VBA]_Excel 2007_.魏汪洋.pdf&br&&a href=&///?target=http%3A///share/link%3Fshareid%3D%26uk%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&Excel VBA 高效办公从入门到精通.pdf&br&&a href=&///?target=http%3A///share/link%3Fshareid%3D%26uk%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
我还是直接发云盘链接吧。 因为我云盘和VBA相关的资源太多,也太杂了 有空整理一下继续更新好了。 这里先发一小部分资料。 一口气发太多反而不好让新人选择了。 (不知道是否涉及不规范转载,如有侵权请告知,我直接删除答案) 讲真,能把《别怕,Excel VBA…
&p&我就不请自来了。&/p&&br&&p&&b&为什么要学VBA?&/b&&/p&&br&&p&用好VBA的话确实可以给你再办公室的工作效率带来质的提升。如果有人跟你说你可以用Python什么的语言处理Excel balabala的,你可以无视他了。毕竟就题主的描述看题主并不是计算机专业人员,只不过是为了提升自己的效率而已,说白了只是为了实用的目的学的。&/p&&br&&p&&b&学VBA学什么?&/b&&/p&&br&&p&那么VBA应该怎么学呢?当然VBA可以有很高级的用法,但是以题主的目的来看,其实VBA对题主有两部分的内容:&b&Visual Basic的语法和Excel的对象模型体系&/b&。如果这两部分都搞懂了,实践中遇到问题,上网搜搜就可以了,推荐Excel Home。&/p&&br&&p&&b&零基础怎么办?&/b&&/p&&br&&p&但是,题主是0基础,这个怎么办呢?嗯,录制宏是个好玩意儿。当你不知道某个要实现的功能该怎么写的时候,先把手动做的过程录下来,再把录制的代码修改修改就可以了。怎么录制宏?以Excel 2010为例“文件-&选项-&自定义功能区”,然后把开发工具勾上。接着点“录制宏”,之后你想做什么就做什么就好了,做完结束录制,你需要的代码就都录制好了。&/p&&img src=&/7d43a9d2f9fcd567fc8b_b.jpg& data-rawheight=&230& data-rawwidth=&266& class=&content_image& width=&266&&&br&&p&嗯嗯,这个做法不错。那么摆在题主面前的最后一倒大关是什么呢——编程的基本概念。那么编程的基本概念是什么呢?那理论多了,大神们可以说个没完没了。不过,题主可以宽心,学个VBA,你需要了解的其实只是&b&一个中心——“变量”,两个基本点——“过程和函数”和三个代表——“顺序、判断、循环”&/b&。只要你建立了这些概念,就可以开始边练边学了。这几个概念建立需要多长时间?读完我的回答就可以了。&/p&&br&&p&好的,我开始BALABALA了。&/p&&br&&p&&b&一个中心——“变量”:&/b&&/p&&br&&p&VBA和C语言一样都是命令式的语言,&b&变量&/b&是你执行计算的中心,也就是我们编程的过程,多数时候是在对变量进行加工。这个概念就好比数学里面的函数,有个原变量,函数加工之后就得到了因变量。比如我要求平方:&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span class=&k&&Dim&/span& &span class=&n&&X&/span& &span class=&ow&&as&/span& &span class=&kt&&Integer&/span&
&span class=&n&&X&/span& &span class=&o&&=&/span& &span class=&mi&&5&/span&
&span class=&n&&X&/span& &span class=&o&&=&/span& &span class=&n&&X&/span& &span class=&o&&*&/span& &span class=&n&&X&/span&
&/code&&/pre&&/div&&p&上面的代码里面X就是个变量,X = 5是给X一个初值,X = X * X就是对X进行的加工,也就是求平方。&/p&&br&&p&&b&两个基本点——“过程与函数”&/b&&/p&&br&&p&VBA区分过程与函数,实际上这两个货基本一样。函数是什么?这里的函数,其实和数学的函数很像,把变量丢进来(&b&参数&/b&),产出就函数的&b&返回值。&/b&还是举平方的例子:&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span class=&k&&Function&/span& &span class=&nf&&Square&/span&&span class=&p&&(&/span&&span class=&n&&Num&/span& &span class=&ow&&As&/span& &span class=&kt&&Integer&/span&&span class=&p&&)&/span&
&span class=&n&&Square&/span& &span class=&o&&=&/span& &span class=&n&&Num&/span& &span class=&o&&*&/span& &span class=&n&&Num&/span&
&span class=&k&&End&/span& &span class=&k&&Function&/span&
&span class=&k&&Sub&/span& &span class=&nf&&Fun1&/span&&span class=&p&&()&/span&
&span class=&n&&Debug&/span&&span class=&p&&.&/span&&span class=&n&&Print&/span& &span class=&n&&Square&/span&&span class=&p&&(&/span&&span class=&mi&&5&/span&&span class=&p&&)&/span&
&span class=&k&&End&/span& &span class=&k&&Sub&/span&
&/code&&/pre&&/div&&p&很简单吧?函数就是Square,和函数同名的变量就是你要返回的值。把变量Square的值设置为你要返回的值就可以了。过程呢,也就是Sub,其实就是不返回值得函数。上面的过程Fun1里面调用了我们写的函数Square,传入了一个&b&参数&/b&5。&br&&/p&&br&&p&&b&三个代表——“顺序、循环、判断”&/b&&/p&&br&&p&既然题主对公式里面的IF什么的比较熟悉了,那么下面的内容应该不难理解。&/p&&br&&p&“顺序”是最基础的语句执行模式,说白了就一句接着一句的执行。上面代码就是顺序执行的一个例子。先赋初值给X,然后再求平方。&/p&&br&&p&“判断”呢,就是说,根据某个判断结果,来选择执行那些语句:&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span class=&k&&If&/span& &span class=&n&&X&/span& &span class=&o&&&&/span& &span class=&mi&&5&/span& &span class=&k&&Then&/span&
&span class=&c&&' Do something &/span&
&span class=&k&&Else&/span& &span class=&c&&' else is optional&/span&
&span class=&c&&' Do elsething &/span&
&span class=&k&&End&/span& &span class=&k&&If&/span&
&/code&&/pre&&/div&&p&“循环”呢,就是重复做某件事情,这大约是最能解放你双手的以中语句了。比如我要求1~100的和,那么我可以X=X+1 X=X+2 …… X=X+100,呃,是不是快累死了?没关系,循环解救你:&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span class=&k&&Dim&/span& &span class=&n&&Sum&/span& &span class=&ow&&as&/span& &span class=&kt&&Integer&/span&
&span class=&n&&Sum&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&
&span class=&k&&For&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span& &span class=&k&&to&/span& &span class=&mi&&100&/span& &span class=&k&&Step&/span& &span class=&mi&&1&/span&
&span class=&n&&Sum&/span& &span class=&o&&=&/span& &span class=&n&&Sum&/span& &span class=&o&&+&/span& &span class=&n&&I&/span&
&span class=&k&&Next&/span&
&span class=&n&&Debug&/span&&span class=&p&&.&/span&&span class=&n&&Print&/span& &span class=&n&&Sum&/span&
&/code&&/pre&&/div&&p&上面的代码应该挺直白,说白了就是设置一个变量Sum,设初值为0,然后从(For)1加到(to)100,然后Debug.Print Sum把最后结果打印出来。如果实在不懂也不必太纠结,具体的语法,你查查语法手册就了解了,用着用着自然也就熟悉了。&/p&&br&&p&&b&接着,该学点儿什么?&/b&&/p&&br&&p&好了,基本思想就是这么地了,没什么神奇的。那接着怎么办?接下去,就要了解怎么用VBA操作Excel了,这一部分是VBA(Visual Basic for Application)中for Application的部分。于是Excel的VBA对象模型就登场了。其实也就是Application代表Excel程序,Workbooks代表所有打开的Excel文件的,Sheets代表Excel文件里面的表单,Range代表一个单元格区域什么的。比如&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span class=&n&&Range&/span&&span class=&p&&(&/span&&span class=&s&&&A1&&/span&&span class=&p&&).&/span&&span class=&n&&Value&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span&
&/code&&/pre&&/div&&p&就是将当前表单的A1单元格的值设置为1。打开VBA的录制宏,试一试你就了解了,很简单的。&/p&&br&&p&如果还是迷糊的话,先看本书吧,把概念捋顺一下。大厚本的不要,《别怕,Excel VBA其实很简单》还不错(不是广告……)。&/p&
我就不请自来了。 为什么要学VBA? 用好VBA的话确实可以给你再办公室的工作效率带来质的提升。如果有人跟你说你可以用Python什么的语言处理Excel balabala的,你可以无视他了。毕竟就题主的描述看题主并不是计算机专业人员,只不过是为了提升自己的效率而已…
&p&其实学习函数本身很容易,但是放在应用场景就会有很多问题,很多时候你会碰到,为什么取不到数,为什么出错,为什么取数错误。这些都能解决,你才算真正掌握vlookup。&/p&&p&有些人的回答给我的感觉就是,何不食肉糜。vlookup不好呀,他和vba比起来差了多少,比index+match差了多少。&/p&&p&我估计这些人根本没接触过Excel的初学者,什么是好用不好用,&b&能最快能解决问题的就是好用&/b&。&/p&&p&我做过很多excel是0基础的培训,第一个教的函数就是vlookup,学会了再学countif,sumif,再学mid,left,right,再学if等等,大部分人的工作用了前3个就已经够了,不过这时候就会冒出一些尖子,他们不满足学这几个函数,会再努力提高。这才是入门函数的作用。&/p&&p&顺便贴一篇最近刚写的教程。&/p&&br&&p&VLOOKUP的基础概念和一些日常碰到的问题。&/p&&p&例一&/p&&img src=&/9cc223a17cff910f23628_b.jpg& data-rawwidth=&474& data-rawheight=&126& class=&origin_image zh-lightbox-thumb& width=&474& data-original=&/9cc223a17cff910f23628_r.jpg&&&br&&p&这里就是一个vlookup函数的最简单的雏形。通过李四名字进行查找到相应的成绩。这里我先解释一下这个函数&/p&&p&=VLOOKUP(E2,A2:B4,2,FALSE)&/p&&p&E2代表了李四,就是用户查找内容的条件,A2:B2代表的是需要查找的区域,2代表的是该区域的第二列,就是成绩列,FALSE是代表了精确查找,和TRUE(模糊查找)相对,但是大多数情况下都是用FALSE,TRUE要使用的时候情况比较特殊。&/p&&p&vlookup的四个参数,第一:单元格。第二:区域(条件所在列必须是所属区域第一列)。第三:数字,必须是正数(不能超出你区域的总列数)。第四,一般用false或0。&/p&&p&这里如果明白了,先恭喜你,你已经踏入了这个函数的门了。&/p&&p&例二:&/p&&p&例一只是引入门,我会在例二部分,充分的讲解该函数的使用和注意事项。&/p&&img src=&/19fc15a9ddcf26efc8a60b_b.jpg& data-rawwidth=&670& data-rawheight=&154& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&/19fc15a9ddcf26efc8a60b_r.jpg&&&br&&br&&p&表格有了变化,大家注意一下,现在问一个问题,如果我要查找李四的年龄怎么办,1,2,3,考虑完了,就是把函数中的列数选中为“3”,这里我要说一些注意事项。&/p&&p&1、这里的“3”不是指该表格的第三列,而是选取范围的第三列,该表格的选取范围是B2:E6,年龄就是为第三列。&/p&&p&2、“李四”是作为函数的检索条件,“李四”所在的列,必须是在该函数的第一列,如果B2:E6我改成A2:E6会是什么结果呢?如图&/p&&br&&img src=&/b692f208b5aa896bf165e0_b.jpg& data-rawwidth=&690& data-rawheight=&207& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&/b692f208b5aa896bf165e0_r.jpg&&&br&&p&是的,它出错了。&/p&&p&&b&3、因为所在列&/b&必须是第一列,所以也就只能提取右边的数值,不能提取左边的,提取可以用index+match或是if(1,0),不过这个不在这个教程内阐述。&/p&&p&4、如果一列里有出现&b&多个&/b&“李四”的情况下,默认只提取&b&第一个&/b&。&/p&&p&5、vlookup查找时注意查找值与查找区域的第一列的&b&格式设置必须一致&/b&。 如果不一致也会出错,如图:&/p&&br&&img src=&/2b493aa7bde1e9871df0e_b.jpg& data-rawwidth=&670& data-rawheight=&213& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&/2b493aa7bde1e9871df0e_r.jpg&&&br&&p&我这里使用学号进行检索姓名,但是A列和H2的格式不同,也无法得出结果。&/p&&p&6、如果要下拉vlookup公式,在第二参数里面加上“$”符号。没加“$”,下拉后,第二参数的区域就变动了。所以需要加“$”把你要查找的区域固定住。如图:一个是没有加“$”的截图,一个是加了“$”的截图。&/p&&img src=&/78e3fd8fb60f_b.jpg& data-rawwidth=&670& data-rawheight=&179& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&/78e3fd8fb60f_r.jpg&&&img src=&/d797d507ce6a3f9ada1cf4_b.jpg& data-rawwidth=&670& data-rawheight=&166& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&/d797d507ce6a3f9ada1cf4_r.jpg&&&br&&p&注意看函数的位置,如果你是横拉就在字母前加“$”,如果是竖拉,就在数字前加“$”。&/p&&p&例三:拓展用法,暂时还没想出太多的拓展情况,我先举出一个例子,就是函数的复合使用。&/p&&img src=&/ad7ae40f2f8edf3d220f54_b.jpg& data-rawwidth=&670& data-rawheight=&196& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&/ad7ae40f2f8edf3d220f54_r.jpg&&&br&&p&注意看我圈起来的部分,如果是直接使用H2进行提取,肯定是无法识别“李四”的成绩,因为有时候各地个人写表格的时候,要求不同,但是碰到不一样的情况怎么办呢,在函数上进行修改,LEFT就是提取该数值的前几位,LEFT(H2,2)就是H2的前2位。所以&/p&&p&LEFT(“李四102”,2)=李四&/p&
其实学习函数本身很容易,但是放在应用场景就会有很多问题,很多时候你会碰到,为什么取不到数,为什么出错,为什么取数错误。这些都能解决,你才算真正掌握vlookup。有些人的回答给我的感觉就是,何不食肉糜。vlookup不好呀,他和vba比起来差了多少,比ind…
现实中的绝大多数VBA程序都是野路子选手本着弄出来凑合能用就行的心态写的,各种逻辑横飞,当然没注释没文档,更没有任何测试流程,高度依赖于运行环境,往往还链接了不同的xls和mdb文件。整个就是个魔法盒,除了作者没人知道该怎么维护,也没人能验证程序结果的正确性。&br&&br&不可持续维护的代码对组织来讲当然是坏事,对个人就未必了。如果你处在一个周围人都是电脑白痴的职场,用VBA处理数据简直是神器。他们会用看猴子的眼神膜拜你,而且等你留下一坨坨屎一样的代码升迁走了以后,办公室里就会留下你的不败传说。&br&当年有你在,需要小工具的时候根本不用找程序员提ticket排队,找你花个几小时就能做出来。你留下的sheet点一个按钮就可以完成之前要做大半天的复杂工作,乃至于所有的人都已经忘了本来的工作手工要怎么做,离了你的工具就不能干活了。现在只是需求有变化需要改改功能,或者只是它不知为何突然崩溃了,全办公室都瘫痪了等着修好这个程序,新来的傻逼却怎么也搞不定。&br&所有的人都会缅怀你的强大,叹息你的离开。哪怕其实你自己也忘了那个程序怎么改,即使把你叫回来一样懵逼,但是无所谓你已经飞到一个崭新的环境创造屎代码或者根本不用再写代码了,这里的麻烦让它们自生自灭吧。&br&&br&然后心满意足的你就可以来知乎说一句:VBA是神器,别听他们搞计算机的瞎逼逼。&br&&br&说的也没错。
现实中的绝大多数VBA程序都是野路子选手本着弄出来凑合能用就行的心态写的,各种逻辑横飞,当然没注释没文档,更没有任何测试流程,高度依赖于运行环境,往往还链接了不同的xls和mdb文件。整个就是个魔法盒,除了作者没人知道该怎么维护,也没人能验证程序…
&p&公司去年新来了一个经理,四大(审计)出身。&/p&&p&听说我会VBA,就来问我能不能帮她开发几个程序,说这些是她曾经工作中一直想做的,奈何做不出来。&/p&&p&我整理一下,也许可以供你参考。&/p&&br&&p&大概最后写了这么几个功能。&/p&&p&1:邮箱类:&/p&&p&a)批量下载附件并生成文件夹&/p&&p&含特定关键词,和特定对象发来的邮件,自动move去某个邮箱的folder(比如银行,商铺房东发来的合同之类),若有附件,自动根据名字和收到的日期在本地盘生成文件夹,然后下载附件存入该文件夹。&/p&&p&(邮箱的Rules功能除了可以move邮件之类的功能,还可以运行自己写的Script,下载附件就是靠运行脚本实现的)&/p&&p&b)批量发送邮件(几百个)。&/p&&p&一般要定期批量发送大量邮件,往往格式差不多,都是通知函类的。&/p&&p&抬头可能不一样,或者其中某个内容不一样,可以在Excel中读取对应内容,自动生成邮件,若需要附件则贴上附件批量发送。&/p&&br&&p&2:Excel类:&/p&&p&a)合同管理,读取文件夹下的所有pdf,生成一个目录管理的表格,并生成超链接。&/p&&p&有些合同需要关注有效期以便及时更新合同,名字中备注的话,可以读取该到期日。&/p&&p&然后可以用宏,也可以用函数进行合同到期管理,到期前进行提醒等。&/p&&br&&p&b)全国400多个店铺的报表每个月会传真过来,会自动存为pdf格式,但经常会有缺页,也会有人忘记传过来。&/p&&p&所以写了一个用vba读取pdf的页数的程序&/p&&p&(原理:每个pdf用二进制读取的话 可以看到一个/Count 标示,后面跟的数字就是页数,抓取这个数字就行了,即便是图片扫描的pdf也可以这样读取页数。二进制读取的语法是&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&Open file
For Binary Access Read As #1
&/code&&/pre&&/div&&p&)&/p&&p&然后根据已经有的完整店铺列表进行匹配检查,快速判断哪些店铺没有提交每个月的报表,是否缺页。&/p&&p&原本要一个团队10号人约1-3天时间检查的工作量,缩短到一个人按一个按钮几分钟可以完成。&/p&&br&&p&c)打印控制,一键整理打印layout,并打印数据。&/p&&p&d)快速对帐,抓取各个不同银行的对帐单,并完成银行余额调节表的余额 检查。&/p&&p&e)将每天各种txt,csv 格式的对账单(上千个),批量转换成xlsx格式。&/p&&br&&br&&p&我没干过审计。&/p&&p&审计需要经常接触不同的公司业务,&/p&&p&但考虑到系统,银行也就那么几个,也许每次业务的获取的财务数据格式不一样。&/p&&p&但无非就那么几个(ERP系统国内常见就是SAP,Ufida,金蝶之类,银行也就是中农工建为主,一般对账单格式都有一个范本)&/p&&p&,比较恶心的银行对账单也就是外资银行(比如花旗的对账单,是竖着排版,导致无法筛选求和之类的操作,我曾经做了一个很麻烦的转换程序才解决)。&/p&&p&如果写一个比较好的常见格式的转换程序,识别对应是什么ERP系统,什么银行,生成一个一目了然的统计格式,应该在整个审计生涯中可以节省不少功夫。&/p&&br&&br&&p&刚回忆了一下,我曾经问过一个审计哥,EY的,因为他名字和闪电侠名字一样,所以莫名想和他多聊几句。&/p&&p&我问他:“你们的询证函是不是宏生成的?能不能代码让我学习一下?”&/p&&p&结果他反问我宏是什么……&/p&&p&我解释一下后,&/p&&p&他说我们有小朋友会做的……&/p&&br&&p&所以,小朋友,实习生,新手审计们&/p&&p&直接消灭了老审计的学习VBA的热情……&/p&&p&因为这些简单重复劳动有新人会处理……&/p&&p&(审计们还有更重要的CPA要考)&/p&&br&&br&&p&我当年每天加班到10点,周末两天也要加班,&/p&&p&在回家路上捧着书,&/p&&p&在厕所蹲坑的那点时间也捧着书。&/p&&p&在到家后吃饭的那一点点时间也捧着书看一眼某个语法,&/p&&br&&br&每次学会一点点也是好的……&br&&br&&p&终于在那段忙到飞起,时间精力都不足的时候,&/p&&p&最终还是学会了vba……&/p&&p&毕竟这技能对当年的我很重要。&/p&&p&因为我有巨量的简单重复劳动。&/p&&br&&p&毕竟,我也没有实习生……可以帮我。&/p&
公司去年新来了一个经理,四大(审计)出身。听说我会VBA,就来问我能不能帮她开发几个程序,说这些是她曾经工作中一直想做的,奈何做不出来。我整理一下,也许可以供你参考。 大概最后写了这么几个功能。1:邮箱类:a)批量下载附件并生成文件夹含特定关键词,…
&b&1、EXCEL必备工具箱(个人常用)&/b&&br&&b&&a href=&///?target=http%3A//.cn/ahzll& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ahzll_新浪博客&i class=&icon-external&&&/i&&/a&&/b&&br&EXCEL必备工具箱是一个的EXCEL/WPS插件,与excel/WPS完全溶为一体。提供了密码去除、阴阳历转换、将选区存储为图片、身份证号码校验、工作表排序及生成目录、人工双面打印、专业水准的套表数据汇总、穿透查询等实用功能。工作表标签上点击右键还增加了轻松隐藏/取消隐藏工作表、工作表导出为文件功能。针对财务人员,还提供了个人所得税、未确认融资费用、按揭贷款/一般贷款利息、各种复利、实际利率法摊销等计算功能。此外,还提供了自动生成分析文档、财务比例计算等模版。&br&&img src=&/9a57c3d994975adb5146fc_b.png& data-rawheight=&250& data-rawwidth=&686& class=&origin_image zh-lightbox-thumb& width=&686& data-original=&/9a57c3d994975adb5146fc_r.png&&&br&&strong&2、慧办公(个人常用)&/strong&&br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&慧办公官方网站&i class=&icon-external&&&/i&&/a&&br&『慧办公』软件是增强Office办公效率的辅助工具,通过该软件可以10倍、100倍的提高你的工作效率。本软件操作简单,就像傻瓜相机一样,只要轻松按一键,就可以将很复杂的数据处理工作交给计算机自动完成,让您事半功倍。里面包含数十个实用的部件,多个批处理功能,如批量合并、批量命名、批量删除、批量打印、批量克隆、批量导出、批量插图等等.&br&&img src=&/204bee4c3dd_b.png& data-rawheight=&376& data-rawwidth=&1094& class=&origin_image zh-lightbox-thumb& width=&1094& data-original=&/204bee4c3dd_r.png&&&br&&b&3、方方格子 Excel工具箱&/b&&b&(个人常用)&/b&&br&&a href=&///?target=http%3A///home/products.aspx%23ffcell& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Excel工具箱 插件&i class=&icon-external&&&/i&&/a&&br&方方格子 Excel工具箱,支持32位和64位Office,支持Excel各版本。软件完全免费。是一款大型Excel插件。功能强大,操作简单,支持撤销,支持DIY工具箱。极大的加强了Excel功能,提高了办公效率。本Excel工具箱提供上百个功能:文本处理、重复值工具、数据对比、汇总拆分、高级排序、颜色排序、合并单元格排序、聚光灯、自定义文本和格式、收藏夹、宏收纳箱、Excel公式中文向导等等。其中&宏收纳箱&,提供了大量常用宏及函数。用户可继续收集自己常用以及网络上的宏和函数,打造属于自己的“武器库”。收纳箱还提供Excel界面DIY功能。具有贴近用户、操作简单、良好的用户体验等特点,获得了众多网友的好评。&u& PS:审计专版excel工具箱名为audtool。&/u&&br&&img src=&/31e4de5fc90dfe939a376c_b.jpg& data-rawwidth=&1196& data-rawheight=&439& class=&origin_image zh-lightbox-thumb& width=&1196& data-original=&/31e4de5fc90dfe939a376c_r.jpg&&&br&PS:个人常用的三个个可以同时用。&br&多个插件同时使用可能会冲突,同时配置不高电脑打开excel会卡机。&br&不建议多个同时安装!!!挑自己最适合的即可。&br&&br&&b&4、Kutools for Excel(收费,和Office Tab 都是extendoffice公司出品)&/b&&br&Kutools for Excel 是款专注于提升您使用微软 Excel
效率的工具集。有了 Kutools,您在处理 Excel 文档时将会事半功倍。Kutools 强化并增加实用的 Excel 功能,让您的 Excel 处理得更加轻松。例如,您可以合并表格以及单元格,删除空白单元格,只要简单的一个点击即可实现批量操作。&br&&img src=&/e882abeb20e16be671e6cd294ae49205_b.png& data-rawheight=&468& data-rawwidth=&1044& class=&origin_image zh-lightbox-thumb& width=&1044& data-original=&/e882abeb20e16be671e6cd294ae49205_r.png&&&br&&strong&5、ExcelHome 论坛出品的excel易用宝&/strong& (楼上的回答,&u&但只支持32位office!!!&/u&)&br&&a href=&///?target=http%3A//yyb.excelhome.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Excel易用宝-做最实用的Excel工具箱-Excel Home&i class=&icon-external&&&/i&&/a&&br&Excel易用宝以提升Excel的操作效率为宗旨,针对Excel用户在数据处理与分析过程中的多项常用需求,开发出相应的功能模块。从而让繁琐或难以实现的操作变得简单可行,甚至能够一键完成。&br&&br&&strong&6、E灵,原Excel百宝箱&/strong&(楼上的回答,&u&但只支持32位office!!!&/u&)&br&&a href=&///?target=http%3A//excelbbx.net/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&excelbbx.net/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&《E灵》是大型的Excel插件,用于强化Excel的功能,提升制表的速度。它包括合并工具、财务工具、图片工具、重复值工具、文件处理工具、打印工具、一键录入公式等等多种类型的工具集合,适用于各行业的办公文员。E灵包含180多个功能,其中20多个功能是自定义函数,属于可选项,在安装时允许不选择,而其 他的功能则是必选项,安装E灵后会产生在Excel的菜单中。&br&&br&&p&&u&PS:微软建议使用Office 64位版本。64位版本的Office更适合处理庞大的数据报表,而且更安全。&/u&&/p&&br&&b&7、Foxtable&/b&&br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Foxtable(狐表) 2016&i class=&icon-external&&&/i&&/a&&br&Foxtable将Excel、Access、Foxpro、VB以及易表的优势融合在一起,无论是数据录入、查询、统计,还是报表生成,都前所未有的强大和易用,普通用户无需编写任何代码,即可轻松完成复杂的数据管理工作,真正做到拿来即用。同时Foxtable又是一个高效开发工具,专门针对数据管理软件的开发作了大量的优化,使得用户在开发过程中只需关注商业逻辑, 无需纠缠于具体功能的实现,这样Foxtable不仅开发效率十倍于其他专业开发工具,而且更加易用,几乎人人都能掌握。让普通人开发出专业水准的管理软件,以前是一个不可思议的想法,而Foxtable的出现,让这成为现实。&br&&img src=&/ab51c5f5aeceeb4bbb0c490a3e303b68_b.png& data-rawheight=&321& data-rawwidth=&732& class=&origin_image zh-lightbox-thumb& width=&732& data-original=&/ab51c5f5aeceeb4bbb0c490a3e303b68_r.png&&&br&excelhome知识树~~~&br&&a href=&///?target=http%3A//club.excelhome.net/tree& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&知识树 -
ExcelHome技术论坛 -&i class=&icon-external&&&/i&&/a&&br&ExcelHome技术社区积累了海量的技术求助帖和分享帖,这里头除了精华帖和技术分帖外,还散落着许许多多具有一定学习价值的知识内容,这些遗珠或蒙尘或遭无视,让人扼腕叹息。有鉴于此,我们希望通过建立知识树系统,一方面系统地分类整理各类高价值的、适合普通大众阅读学习的帖子,另一方面为会员提供Excel的学习路径和导航指引,输出ExcelHome论坛的技术价值观。&br&&br&整天和excel打交道。&br&还有很多已经停止更新的插件包就不推荐啦。其他的想到再更新。
1、EXCEL必备工具箱(个人常用)
EXCEL必备工具箱是一个的EXCEL/WPS插件,与excel/WPS完全溶为一体。提供了密码去除、阴阳历转换、将选区存储为图片、身份证号码校验、工作表排序及生成目录、人工双面打印、专业水准的套表数据汇总、穿透查…
&p&没有过时呀。有个小伙伴一直问我考勤系统脚本的代码。我在这里分享出来。&/p&&p&写这个脚本的背景是CTO和HR商量了下,整个信息中心和业务部门分开做考勤规则。&/p&&p&我们的考勤系统只是记录打卡,但不会判断迟到、漏打卡、加班等等的规则。&/p&&p&之前也是一个程序员帮HR写的程序,此次复杂度加倍。CTO问各位研发总监有木有人要开发下。&/p&&p&无人回应。&/p&&p&做数据的我,弱弱的举了小爪,说我可以帮忙写下。&/p&&p&花了半天就写好了,还设想了各种遇到的情况。HR惊叹于我的速度,说上个程序员花了两周...我汗颜。&/p&&p&HR们,如果还在为考勤烦恼,以下可以下载下来&/p&&p&百度网盘:链接:&a href=&///?target=http%3A///s/1pLuRwoj& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1pLuRwo&/span&&span class=&invisible&&j&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:w47g&/p&&p&以下截图,我的代码都详细写好了注释。大家可以按照注释修改&/p&&img data-rawheight=&660& src=&/v2-4b366ac449a1a77a5f23d636ce70b512_b.png& data-rawwidth=&1355& class=&origin_image zh-lightbox-thumb& width=&1355& data-original=&/v2-4b366ac449a1a77a5f23d636ce70b512_r.png&&&p&&br&&/p&&img data-rawheight=&711& src=&/v2-d5e8daefd355d90e209eb6f7ff4a9e2b_b.png& data-rawwidth=&719& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/v2-d5e8daefd355d90e209eb6f7ff4a9e2b_r.png&&&p&&br&&/p&&img data-rawheight=&732& src=&/v2-67db90bc3e95ef74b74e61b365e8c904_b.png& data-rawwidth=&723& class=&origin_image zh-lightbox-thumb& width=&723& data-original=&/v2-67db90bc3e95ef74b74e61b365e8c904_r.png&&&p&代码如下:&/p&&p&Sub Organize_Attendance()&/p&&p&On Error Resume Next&/p&&p&Application.ScreenUpdating = False&/p&&p&Dim Cus_FirstDay As Date, Cus_Lastday As Date, abcd As Date, Cus_Days, St2_Row, Arr_Pointer, Arr_Pointer2&/p&&p&Dim Sht, St1, St2, St3&/p&&p&Dim Arr(0 To 31000, 1 To 14), Date1, Date2, Date3, Record, Date4, Name&/p&&p&&br&&/p&&p&'整理表页名称,用于判断是否缺失&/p&&p&txt = &&&/p&&p&a = 0&/p&&p&b = 0&/p&&p&c = 0&/p&&p&For Each Sht In Sheets&/p&&p&
If &a href=&///?target=http%3A//sht.name/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sht.Name&i class=&icon-external&&&/i&&/a& = &控制表格& Then a = 1&/p&&p&
If &a href=&///?target=http%3A//sht.name/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sht.Name&i class=&icon-external&&&/i&&/a& = &出勤记录& Then b = 1&/p&&p&
If &a href=&///?target=http%3A//sht.name/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sht.Name&i class=&icon-external&&&/i&&/a& = &输出表格& Then c = 1&/p&&p&Next&/p&&p&&br&&/p&&p&'查找是否有“控制表格”和“出勤记录”两张表&/p&&p&If a && 1 And b = 1 Then&/p&&p&
txt = &没有找到控制表格表页&&/p&&p&ElseIf a = 1 And b && 1 Then&/p&&p&
txt = &没有找到出勤记录表页&&/p&&p&ElseIf a && 1 And b && 1 Then&/p&&p&
txt = &没有找到控制表格、出勤记录表页&&/p&&p&End If&/p&&p&&br&&/p&&p&If txt && && Then&/p&&p&
MsgBox (txt)&/p&&p&
Exit Sub&/p&&p&End If&/p&&p&&br&&/p&&p&'如果有输出表格,则进行清空,如果没有新建一个&/p&&p&If c = 1 Then&/p&&p&
Sheets(&输出表格&).Cells.Delete&/p&&p&Else&/p&&p&
Sheets.Add&/p&&p&&a href=&///?target=http%3A//activesheet.name/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ActiveSheet.Name&i class=&icon-external&&&/i&&/a& = &输出表格&&/p&&p&End If&/p&&p&&br&&/p&&p&Set St1 = Sheets(&控制表格&)&/p&&p&Set St2 = Sheets(&出勤记录&)&/p&&p&Set St3 = Sheets(&输出表格&)&/p&&p&&br&&/p&&p&'定义表头内容&/p&&p&Arr(0, 1) = &工号&&/p&&p&Arr(0, 2) = &姓名&&/p&&p&Arr(0, 3) = &单位名称&&/p&&p&Arr(0, 4) = &考勤日期&&/p&&p&Arr(0, 5) = &班次&&/p&&p&Arr(0, 6) = &上班&&/p&&p&Arr(0, 7) = &下班&&/p&&p&Arr(0, 8) = &是否跨天&&/p&&p&Arr(0, 9) = &在司时间&&/p&&p&Arr(0, 10) = &是否足够9小时&&/p&&p&Arr(0, 11) = &考勤是否合理&&/p&&p&Arr(0, 12) = &是否缺勤&&/p&&p&Arr(0, 13) = &备注&&/p&&p&&br&&/p&&p&'定义节假日、倒休等特殊日期字典&/p&&p&Set Date1 = CreateObject(&Scripting.Dictionary&)&/p&&p&Set Date2 = CreateObject(&Scripting.Dictionary&)&/p&&p&Set Date3 = CreateObject(&Scripting.Dictionary&)&/p&&p&For Each Rng In St1.Range(&H2:H& & St1.Range(&H65536&).End(xlUp).Row)&/p&&p&
Date1.Add Rng.Value, Rng.Value&/p&&p&Next&/p&&p&For Each Rng In St1.Range(&I2:I& & St1.Range(&I65536&).End(xlUp).Row)&/p&&p&
Date2.Add Rng.Value, Rng.Value&/p&&p&Next&/p&&p&For Each Rng In St1.Range(&J2:J& & St1.Range(&J65536&).End(xlUp).Row)&/p&&p&
Date3.Add Rng.Value, Rng.Value&/p&&p&Next&/p&&p&&br&&/p&&p&'记录出勤记录行数&/p&&p&St2_Row = St2.Range(&A65536&).End(xlUp).Row&/p&&p&&br&&/p&&p&'定义月份第一天,当月天数&/p&&p&'Cus_FirstDay = DateSerial(St1.[b2].Value, St1.[b3].Value, 1)&/p&&p&'Cus_Lastday = DateSerial(St1.[b2].Value, St1.[b3].Value + 1, 0)&/p&&p&&br&&/p&&p&For i = 2 To St2_Row&/p&&p&
abcd = St2.Cells(i, 4).Value&/p&&p&
If Cus_FirstDay = #12:00:00 AM# Or Cus_FirstDay & abcd Then&/p&&p&
Cus_FirstDay = abcd&/p&&p&
End If&/p&&p&
If Cus_Lastday = #12:00:00 AM# Or Cus_Lastday & abcd Then&/p&&p&
Cus_Lastday = abcd&/p&&p&
End If&/p&&p&Next&/p&&p&Cus_Days = DateDiff(&d&, Cus_FirstDay, Cus_Lastday) + 1&/p&&p&&br&&/p&&p&'定义当月班次数组&/p&&p&ReDim Date4(1 To Cus_Days, 1 To 2)&/p&&p&For i = 1 To Cus_Days&/p&&p&
a = DateAdd(&d&, i - 1, Cus_FirstDay)&/p&&p&
Date4(i, 1) = a&/p&&p&
If Date1.Exists(a) Then&/p&&p&
Date4(i, 2) = &三倍节假日&&/p&&p&
ElseIf Date2.Exists(a) Then&/p&&p&
Date4(i, 2) = &周末&&/p&&p&
ElseIf Date3.Exists(a) Then&/p&&p&
Date4(i, 2) = &工作日&&/p&&p&
ElseIf WorksheetFunction.Weekday(a, 2) = 6 Then&/p&&p&
Date4(i, 2) = &周六&&/p&&p&
ElseIf WorksheetFunction.Weekday(a, 2) = 7 Then&/p&&p&
Date4(i, 2) = &周日&&/p&&p&
Else&/p&&p&
Date4(i, 2) = &工作日&&/p&&p&
End If&/p&&p&Next&/p&&p&&br&&/p&&p&'定义员工工号字典&/p&&p&Set Name = CreateObject(&Scripting.Dictionary&)&/p&&p&&br&&/p&&p&'定义当前员工第一行指针&/p&&p&Arr_Pointer = -Cus_Days&/p&&p&&br&&/p&&p&'开始按照出勤记录每行循环处理数据,记录工号、姓名、公司、班次、日期、上下班时间、是否跨天的数据&/p&&p&For i = 2 To St2_Row&/p&&p&
'将出勤记录当前行转换为数组&/p&&p&
Record = WorksheetFunction.Transpose(WorksheetFunction.Transpose(St2.Range(&A& & i & &:E& & i).Value))&/p&&p&
'检测是否是录入过该员工&/p&&p&
If Not Name.Exists(Record(1)) Then&/p&&p&
'如果是第一次录入,增加工号字典,更改第一行指针,在数组内添加该员工一整月天数的前5列数据&/p&&p&
Name.Add Record(1), Record(1)&/p&&p&
Arr_Pointer = Arr_Pointer + Cus_Days&/p&&p&
For n = 1 To Cus_Days&/p&&p&
Arr(Arr_Pointer + n, 1) = Record(1)&/p&&p&
Arr(Arr_Pointer + n, 2) = Record(2)&/p&&p&
Arr(Arr_Pointer + n, 3) = Record(3)&/p&&p&
Arr(Arr_Pointer + n, 4) = Date4(n, 1)&/p&&p&
Arr(Arr_Pointer + n, 5) = Date4(n, 2)&/p&&p&
Next&/p&&p&
End If&/p&&p&&br&&/p&&p&
'判断时间属性,填入数组&/p&&p&
Arr_Pointer2 = Arr_Pointer + Day(St2.Cells(i, 4).Value)&/p&&p&
If St2.Cells(i, 5).Value &= TimeValue(&13:00:00&) Then '如果打卡时间超过13点&/p&&p&
If Arr(Arr_Pointer2, 7) = && Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组里还没有记录,则将单元格写入数组&/p&&p&
ElseIf Arr(Arr_Pointer2, 7) & St2.Cells(i, 5).Value Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组的记录小于单元格,则将单元格写入数组(下班打卡取较大数据)&/p&&p&
End If&/p&&p&
ElseIf St2.Cells(i, 5).Value & TimeValue(&6:00:00&) Then '如果打卡时间早于6点&/p&&p&
If Day(Record(4)) = 1 Then&/p&&p&
Arr(Arr_Pointer2, 13) = &上个月末最后一天有加班&&/p&&p&
Else&/p&&p&
Arr_Pointer2 = Arr_Pointer2 - 1 '指针时间提前一天&/p&&p&
If Arr(Arr_Pointer2, 7) = && Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组里还没有记录,则将单元格写入数组&/p&&p&
ElseIf Arr(Arr_Pointer2, 7) &= TimeValue(&13:00:00&) Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组里的记录是前一天晚上的记录,则将单元格写入数组(凌晨打卡要晚于前一天晚上)&/p&&p&
ElseIf St2.Cells(i, 5).Value & Arr(Arr_Pointer2, 7) Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组里的记录是凌晨的,并且小于单元格,则将单元格写入数组(下班打卡取较大数据)&/p&&p&
End If&/p&&p&
Arr(Arr_Pointer2, 8) = &是&&/p&&p&
End If&/p&&p&
Else '如果打卡时间介于6点到13点&/p&&p&
If Arr(Arr_Pointer2, 6) = && Then&/p&&p&
Arr(Arr_Pointer2, 6) = St2.Cells(i, 5).Value '如果数组里还没有记录,则将单元格写入数组&/p&&p&
ElseIf Arr(Arr_Pointer2, 6) & St2.Cells(i, 5).Value Then&/p&&p&
Arr(Arr_Pointer2, 6) = St2.Cells(i, 5).Value '如果数组的记录大于单元格,则将单元格写入数组(上班打卡取较小数据)&/p&&p&
End If&/p&&p&
End If&/p&&p&Next&/p&&p&&br&&/p&&p&For i = 1 To Arr_Pointer + Cus_Days&/p&&p&
'备注周末or节假日&/p&&p&'
If Arr(i, 5) = &周末& Or Arr(i, 5) = &三倍节假日& Then&/p&&p&'
If Arr(i, 6) = && And Arr(i, 7) = && Then Arr(i, 13) = Arr(i, 13) & & 周末or节假日 &&/p&&p&'
End If&/p&&p&
'如果上下班都有时间,则填充在司时间&/p&&p&
If Arr(i, 6) && && And Arr(i, 7) && && Then&/p&&p&
If Arr(i, 8) = &是& Then&/p&&p&
Arr(i, 9) = Arr(i, 7) + 1 - Arr(i, 6)&/p&&p&
Else&/p&&p&
Arr(i, 9) = Arr(i, 7) - Arr(i, 6)&/p&&p&
End If&/p&&p&
Arr(i, 9) = Application.WorksheetFunction.RoundDown(Arr(i, 9) * 24, 2)&/p&&p&
If Arr(i, 9) &= 9 Then Arr(i, 10) = &是&&/p&&p&
End If&/p&&p&
'判断是否缺上下班打卡记录&/p&&p&
If Arr(i, 5) = &工作日& Then&/p&&p&
'判断总部考勤是否合理&/p&&p&
If Arr(i, 3) = &总部& Then&/p&&p&
If Arr(i, 6) = && And Arr(i, 7) = && Then&/p&&p&
Arr(i, 12) = &缺勤&&/p&&p&
ElseIf Arr(i, 6) = && Or Arr(i, 7) = && Then&/p&&p&
Arr(i, 12) = &漏打卡&&/p&&p&
ElseIf Arr(i, 6) &= TimeValue(&08:30:00&) And (Arr(i, 7) &= TimeValue(&17:30:00&) Or Arr(i, 7) &= TimeValue(&06:00:00&)) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
ElseIf Arr(i, 6) &= TimeValue(&09:00:00&) And (Arr(i, 7) &= TimeValue(&18:00:00&) Or Arr(i, 7) &= TimeValue(&06:00:00&)) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
Else&/p&&p&
Arr(i, 11) = &迟到or早退&&/p&&p&
End If&/p&&p&
End If&/p&&p&
'判断金佰达考勤是否合理&/p&&p&
If Arr(i, 3) = &金佰达& Then&/p&&p&
'如果上下班都没打卡,前一天下班时间又不是晚于凌晨两点的,是缺勤&/p&&p&
If Arr(i, 6) = && And Arr(i, 7) = && Then&/p&&p&
If Arr(i - 1, 1) = Arr(i, 1) And Arr(i - 1, 7) &= TimeValue(&06:00:00&) And Arr(i - 1, 7) &= TimeValue(&02:00:00&) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
Else&/p&&p&
Arr(i, 12) = &缺勤&&/p&&p&
End If&/p&&p&
'如果上下班有一次没打卡,前一天下班时}

我要回帖

更多关于 函数声明到底在做什么 的文章

更多推荐

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

点击添加站长微信