
我就不抖机灵了,详细说一下我是怎么入门的吧!故事有点长,因为宏涉及到excel基础,我就从我接触excel开始讲,顺便让大家知道学宏需要什么样的条件。我是一个财务人员,做报表,录凭证,给财务系统配基础资料,都是用宏的。
1. 初次接触Excel
1999年8月我到新世纪农业园应聘。孟经理看到我在Word上熟练地画出了他要求的表格,表情都石化了。他说,你在Excel上画?!看到我懵懵的表情,他帮我打开了Excel。我在上面打了几个字后,很干脆地告诉他,我是第一次接触这个软件。
二个月后,我已经能够熟练地画表,设计各种各样公式了,特别是掌握If、Vlookup之后感觉天下之大,皆可去得。
看到财务报告只有干巴巴的文字和表格,我直接添上了柱形图、折线图、饼图。后来有人告诉我领导对图形报表大加赞赏。
有一次月底回财务室,看到两人在抢什么东西。抢到的,兴高采烈,没抢到的,气得直跺脚。我大感惊讶,身边的人告诉我,他们在抢U8端口,做报表要从U8导数据。
两天后我发现了U8自定义报表,高兴地通知大家,不料同事们异口同声地说,“没人会用”。 Excel公式能学会,这个应该也不难,我动手试验,没多久还真给做出来了。
财务软件能够输出报表后,大家都来试用。有人发现,新增明细科目,报表会少数据。我又设计出用一级科目校验二级汇总的报警公式。
你看是个高手了吧?!
2. Excel会计账
2001年7月在紫坭,我第一次见到Excel会计账。账套有两页,一页是凭证明细,另一页是科目汇总。
凭证明细表设置了数据有效性,能用下拉列表选科目。科目汇总表设有公式,更改月份,金额就能随之变化。
公式很奇特,从来没见过,称为数组公式,录完之后按Ctrl+Shift+Enter才会显示正确值。受这个公式启发,我把汇总表的凭证编号也改成了公式。找不到合适的数组公式就采用了另一种公式——嵌套函数。示例如下:
=MAX(IF(凭证明细!H1:H1000=C2,凭证明细!A1:A1000)),这种公式也需要按Ctrl+Shift+Enter才会正确显示。
月末,财务要根据会计账编制资产负债表、利润表和费用表。我做了两次后把它们也加到了Excel会计账中,用公式取数。
后来增值税、增值税附表、所得税、综合纳税申报表等也陆续添加了进来。这类表换算关系复杂,步骤也多,只能一个个地手工填。
为了让Excel会计账更象软件,我用图表设计了一个彩色目录,看着自己的杰作,不禁有些飘飘然了。
这些工作别人都这么做,没觉得有什么不妥。如果没有什么意外,我将凭着一手公式这样做下去,直到天荒地老。
3. 名称公式
有一天兰姐来找我。“小胡,我有个表公式坏了,能帮我弄一下吗?”我答应后,她把表拷贝给我。
我看了一下兰姐给的表,蒙了。这个所谓的公式,只看见四个词“=期初库存”,“=本期入库”,“=本期发出”,“=期末库存”。我熟悉的sum哪里去了?
我很惊讶,自恃对公式尚有几份把握,于是说道:“你告诉一下我这个是在哪里设置的,我帮你看看。” 兰姐打开Excel定义名称对话框让我看了一下。我很快就帮她修正了公式错误。
名称公式与正常公式基本相同,只是以名称显示。用友UFO报表也是这种公式,只是界面和进入方式不太一样。
兰姐是我的贵人,她让我意识到自以为很熟悉的Excel其实还有许多地方不清楚。我决定利用工作空闲把Excel所有地方都看一下,包括说明书。
没多久我就开始尝试以前没有用过的Excel菜单。
我用了一下透视表。这个很有意思,特别是汇总数据,很强大!我也尝试了宏,然而宏就让人郁闷了。它只是把我前面的操作重复一遍,这有什么意义呢?并且太快,看不到任何过程,少了一点美感与优雅,好像很鸡肋!一时之间实在想不出它有什么用。
不过很快机缘就来了!
4. 未婚妻归来
2001年9月12日上午未婚妻突然来找我。到宿舍后,我打开电视,黑屏上一行字,有重要消息要插播。数分钟后江总书记满脸喜气出现了,很快严肃地发表了一项重大消息,双子塔被撞塌了。
我抚摸着妻子手上如同脚板一样厚的老茧,挽留道:“别去修编码机了,天那水有毒,学一下电脑,随便找个工作都比这份强。”
我俩到市桥电脑城花1800元买了一台4K内存1G硬盘的二手电脑。妻子开始学王码五笔。一时找不到打字软件,她就在旁边摆本书,然后在Word上练习码字。
望着妻子的背影,我想,看书多不方便呀,Excel一列列的不是可以对照着练吗?还可以测出速度呢!办公室里Excel实用性远大于Word,用它打字还可以学习一下操作,一举两得多好啊!
一列原文,一列练习,打字总数,打字时间,打字速度。稍作思考,基本雏形就设计出来了。我们开始分工,妻子负责将《道德经》一句话一个单元格按列输入,我则尝试设计公式。
顶部两行显示打字信息,A列原文,B列练习。C列用公式len统计每行字数,C2单元格填上合计公式sum,打字总数就搞定了。A1单元格填开始时间“=now()”,B1单元格计算打字时间“=now()-A1”,B2单元格计算打字速度“=C2/B1”。
填好公式后,试了一下,根本不行,两个时间函数会同时变动,时间差为零。
到底怎么计算时间差?
5. Excel打字软件
我在办公室里试验了好久,计算时间差的公式没找到,方法倒有一个。
把A1单元格公式复制粘贴成数值,就可以计算时间差,但这个方法缺陷明显。每次打字前都要操作一次,麻烦不说,耽搁的时间都足够打十多个字了!
头脑中灵光一闪,我想到了那个可以重复操作动作的宏。
在A2单元格插入一个矩形图形,点鼠标右键,进入指定宏对话框,录制下固定时间的操作,宏按钮就做好了。
打字前用鼠标点一下按钮,每打完一行字回车,打字速度就会显示出来了。
就是这个不起眼的运用,让宏的大门在我面前彻底打开,从此一发不可收拾。
以前录宏觉得没用,我都干完了,它再干一遍有意思吗?现在才发现不是没用,是没有领略正确用法。
解决了时间问题,我信心百倍开始进一步优化。
6. 软件优化
B2单元格显示的打字速度很夸张。检查字数统计,正确!问题应该在时间上。我用两个日期相减,发现单元格中数字1表示一天,一天等于1440分钟。B2单元格公式改成“=C2/B1/1440”,格式设置成“#"字/分钟"”,这样就顺眼多了。
我正考虑在B列设立条件格式检查打字准确性,就察觉到妻子每隔一段时间清空一次数据,从头再练。何必如此麻烦?我录了一个清空数据宏,点按钮就会自动清除。
打着打着字,打字速度不见了,原来妻子清数据是这个原因,用“冻结窗格”固定前两行就没事了。
我做了许多优化。如果只想打打字,顺便学习一下Excel,目的已经达到。如果顺着打字软件这根杆子往上爬,要改进的地方就多了去了。
例如,按钮刚开始添加的文字是“开始打字”, 理论上,启动之后应该是“结束”。我试着用宏切换,弄了好久都没能实现,以前觉得宏没用,现在觉得宏不够用。
人就是这样,当你换一个思路考虑问题,世界就是如此不同;当你换个活法,人生走的就是另一条路。
7. 道可道非常道
“道可道,非常道”,几天之后,学会了五笔打字,妻子非常高兴,一边打一边还念念有词。可我发现了不对劲,怎么每次都从第一句开始?练习材料应该随机抽取,不能一成不变呀!
我首先想到了用鼠标随机选择单元格,录制宏试用了一下,发现活动单元格或上或下,飘忽不定,体验感很差。
我又试验拉滚动条。这下倒好,活动单元格直接不见了。按键盘时,屏幕又飞快地滚回了原来位置,更差了!
我又尝试其他移动单元格方法,比如按home键,按pageup键,滚轮,名称框录入等,也都不行。
一步无法到位,那就两步。先拉滚动条,再用鼠标点一下顶端单元格。这样好像就正常了。事实上正常操作就是这样啊!在尝试中我觉得特别古怪,如果不是为了使用宏,谁会没事去研究移动单元格呢?
我录制了几个同样的宏,所有代码中滚动条值与单元格行都保持一致。反过来,无论怎么改数字,只要值与行一致,运行宏,活动单元格都在最上面。这样一来,如果数字能随机生成,问题就解决了。
滚动条值可以用随机函数Rnd生成,单元格怎么办呢?
8. 茴字有四样写法
我在翻看帮助时有一个重大发现,单元格除了Range("A1")之外,还有Cells(1,1)的写法。Cells第一个参数代表行,与滚动条值对应,第二个参数代表列。
帮助例子用的是激活Activate,不是选择Select。这样随机选位置代码可以修改如下:
至此随机挑素材问题算是解决了。单元格有多种写法,让我想起了孔乙己的梗。
鲁迅先生大作《孔乙己》,孔乙己以会写多个茴字在小店员面前显摆。老师说,这充分说明了孔乙己很迂腐。于是同学之间就互相调侃对方是孔乙己。
为什么微软偏偏学孔乙己呢?比如:[A1]就是Range("A1")的又一种写法。事实上ActiveCell和Selection何尝不是Range("A1")的一种写法?当选择了A1单元格时,它们指的就是同一种东西。
一个字多种写法,是不是很孔乙己不重要,重要的是它们能互换着用。学宏能明白这一点,好处数之不尽。我叫它茴字法则。
随着对编程深入了解,我发现任何一种写法,只要运用得当就可以出奇效,没有什么是鸡肋!只要想让程序看上去更简洁,跑得更快,孔乙己只是浮云。无我相,无人相,无众生相,才是真正的大智慧。
自从知道有如此灵活的写法后,我总是在想:“程序是不是还可以优化?”从此走上了对程序简洁性几近变态地追求之路,只要有空闲就不断地对程序反复修改。
9. VBA
录宏的地方叫什么名字?初学者不会太关心,就象吃鸡蛋不关心下蛋母鸡一样。熟悉了宏,就不得不关心了,有些语句太多了。示例如下:
刚开始充满敬畏,看久了就是杂草,忍不住就想删掉。删着删着,把Select和Selection也干掉了,程序没毛病,速度还更快。心里就冒出了十万个为什么?帮助上没找到答案,我又跑到图书馆翻书,有了小小收获。
编辑宏的地方叫VBA,它与Excel看上去象扑克牌正反面,其实是一个独立程序。
VBA全称Visual Basic for Applications,在Excel中用快捷键ALT+F11进入,办公软件自带,不需另外安装。不须另外安装,这点很宝贵。我大学考了C语言二级证书,除了在学校机房里编过几个小程序外,再也没用过,同样悲剧的还有BASIC,FOXPRO。没方便的平台,从此天涯陌路人。
VBA是一种面向对象程序语言,换成大白话就是围绕对象编程的BASIC语言。
那么什么叫对象呢?录制宏中一个个用点号分隔出来的便是对象。Excel中无论是单元格、表、簿、菜单、状态栏、字体……这些有形的,还是点击鼠标、屏幕刷新……这些无形的,笼统名称就叫对象。
对象在书写时很像俄罗斯套娃,以大套小,以点号显示成员关系,以等号赋值,形式如下:
对象.对象.对象.属性=值
对象.对象.对象.方法 参数1:=值,参数2:=值
录制将套娃拆散,Select和Selection才成对出现,删掉当然没事。更魔幻的是,VBA允许当前对象不玩套娃,默认属性可以省略。参数也不是个个都有,有也不一定非要标上。删掉了当然也没事!这种灵活性也许赵四老爷不喜欢但我喜欢,程序简洁它不香吗?
10. 自由查询(上)
在编出了固定时间的宏后,我坐在办公室里石化了,日常工作中有没有可以用到宏的地方呢?一眨眼,Excel会计账被我挑出了N多缺点。
你看要查个银行存款,要先点下拉条,点“自定义”,然后再输入条件“银行存款”,点确认。太麻烦了!下拉条选项也好不到哪里去,挑得眼花。为什么不能直接选中哪个单元格就筛出哪个来呢?
说干就干,先录个输条件查询的宏。代码如下:
录出来的宏令人惊讶,竟然只有两句话。第一句建立筛选,第二句进行筛选。参数两个,一个列数,一个查询值。我要把它们变成灵活的选择值。
也许是录宏时做过凭证,我在代码里看到了ActiveCell.FormulaR1C1 = "银行存款",立即砰然心动。两个相等!是不是也可以替代?转念一想,犹豫什么,试一下不就知道啦!我将查询值换成了ActiveCell.FormulaR1C1。
换好后,进入Excel选择“银行存款”,点一下宏就全部筛出来了,换成其他科目也行,看来换对了。
回到VBA仔细一看,"= 银行存款"和"银行存款",怎么就当成一样了呢?我又录了下拉选择那种,代码如下:
两个程序,有没有等号效果都一样。后来才知道等号表示精确查找。
怎么让列也可以随机选择呢?
11. 自由查询(下)
在帮助中我看到了ActiveCell.FormulaR1C1的另一种写法ActiveCell.Value。随手换上去试了一下,也行。
看着ActiveCell.Value,我突然品出了不一样的味道,这就是一种非常直白的描述:活动单元格.值,那是否意味着筛选列也可以写成“活动单元格.列”呀?即ActiveCell.Column。
我担心拼错单词还特意查了一下,然后将列数“4”换成了ActiveCell.Column,进入Excel上下左右随便点,选哪一个就能筛哪一个。想法还真就实现了吔!
我没有止步,又将ActiveCell换成Selection,并去掉了两个参数。代码如下:
随着一通眼花缭乱的互换,我的目标顺利达成,对“茴字法则”也信心大增。
这个宏令我激动了好久。以前都是录制为主,删减为辅,从这个开始实现了真正意义上的编程。如同一个只会爬的婴儿,某天突然忽地一下站了起来。
电脑给出的名称“Macro1”太单调,改叫“查找”,晚上睡觉又想:是不是太不文艺?并且菜单中已经有了同样名字。想到这种操作更方便随意,又改成“自由查找”,后来又改成“自由查寻”,反复几次后定了下来“自由查询”。
生过孩子的人最有这种体会了,孩子出生了取什么名字好,是不是好几个晚上都睡不着?
后来我又觉得实际工作中不仅只是筛选固定单元格值,还有模糊选择;不只是筛选某个值,还有挑出几行处理;不是总在一个页上操作,还有其他页;那个撤消筛选也显得很麻烦……一时间,凌乱在了思维风暴之中。
12. 凭证编号
用Excel做会计账,凭证号、日期、摘要、期间需要重复填写。Excel有快捷填充,可惜一次只能填充一张凭证。
一次两次,一天两天,一个星期两个星期。我终于忍不住了,能否从头到尾把所有凭证一次填充完?我开始实践这种想法。
首先要解决的问题是让程序能一行一行地处理下去,专业术语叫:循环。我在帮助中搜索了一下,选中了For...Next 语句。
循环有起始值,标题不需要填充,从第二行开始。至于结束行,可以填个大一点的数字,当D列上没有科目时退出即可。
还有,当凭证号、日期、摘要空着时才需要填充,这种判断,术语叫:条件,最简单的是If...Then... 条件语句。
填充本身很简单,按快捷键Ctrl+D,录制下来。Range("A2:C3"),我录了几个,全都是左上右下两个单元格表示区间,这种怎么写成灵活单元格形式?
我想起当初发现Cells的经历,决定再到帮助里看看。查询“Cells”,出来一串东西,我选了第一个进去,一眼就看到了Range(Cells(1, 1),Cells(5, 3)),当即明白怎么做了。
“期间”也要填充,它其实就是每月第一天,将单据日期减掉天数再加1就行了。
我一边修改一边试验,一个自动填充宏就出来了:
这么简单的一个宏就把手工需要反反复复弄来弄去的填充给完成了,心中顿时充满了甜蜜感!
13. 神奇的触发事件
我在里里外外翻看Excel时,发现VBA代码窗也象Excel表一样有很多页。左上角工程窗口中Sheet1、Sheet2、Sheet3……,双击就会打开一个新窗口。窗口全是空白,没看出来,大意了啊!
代码窗口顶上两个小框,通用和声明,又是干什么的呢?通用框中有一个选择项目:Worksheet,点一下Worksheet,出现两行代码:
Worksheet应该指工作表,SelectionChange是什么东西?我在帮助里查了一下,不太懂。示例也不懂,但它启发了我,可以放一个东西进去看看有什么反应。
我放了一个给单元格填数字的录制宏代码进去。奇迹出现了,只要用鼠标在任何单元格上点一下,数字就会自动填上去。
我兴高采烈地玩了起来,发现这个比以前那些宏有意思多了,不要命令不要运行,只要有动作就可以。
单击鼠标,改动文字,打开关闭工作簿……帮助中称之为事件。后来才知道这种启动方式叫触发,也有说叫事件驱动。
我的心思一下子活焕了起来,是不是以后录凭证可以自动换行,是不是可以自动切换输入法?是不是可以自动开关自动更正?是不是……
太神奇了!
14. 按下葫芦起了瓢
会计科目代码,现金101,银行存款102,管理费用521……十分整齐。看着Excel自动更正对话框,我想到了一个新玩法,录代码出科目,这样可比汉字输入要快多了。
我录了一个往自动更正里加科目的宏,套上循环,程序就编好了,一下子把科目汇总表中65个科目全部加到了自动更正里面。代码如下:
方法很新奇,才用了两天,就发现了一个小麻烦,金额偶尔也会变成会计科目,看来还需要改进!
等我把干掉科目宏都编好了,却有了新发现——触发事件。问题有了转机,让自动更正在会计科目列打开,其他列关闭,这样就没事了!代码如下:
在编程实践中许多问题相互关联,免不了会按下葫芦起了瓢。一个能把所有需求统筹起来的程序会变得复杂。
15. 成长的烦恼
解决数字代码问题后,我还尝试过拼音,现金XJ,银行存款YHCK,管理费用GLFY……
拼音有重码,比如应付账款和预付账款编码都是“YFZK”,这个好解决,把后面一个改成“YFZK2”就行了。
录入时又遇到了问题,要先按大写键,录完科目还要再按回去。有了这两步要麻烦许多。大写键能用宏自动开关吗?
我录了一下宏,什么都没录到。这可怎么办?
我忽然想起,Excel数据有效性可以控制输入法。控制不了大写键,控制输入法也行啊!
在科目明细账上设置输入法模式,试了一下,可行!但我却怎么也高兴不起来,代码要改成难看的小写,重码也让录入磕磕绊绊。
后来我又试了自动换行,会计金额飘忽不定,还要检查借贷平衡。这都不是机械地换一下行那么简单的事。
在这些思考中,我对宏的认知仿佛一夜长大,不知不觉已经来到了深水区,对宏不再是懵懂天真的模样。Excel也不再是一个简单的计算画表工具。
后来我才知道,有烦恼其实是一种极大的幸运。
许多人学了宏却不会用,正是发现不了问题,也就谈不上解决问题了。用不上的知识迟早会还给老师,还给书本。
分析其中原因,仅仅因为从一开始我就是从实用出发。学与用本来就是两回事!
