ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1840|回复: 12

[原创] 一个十年VBA爱好者总结的一点学习和开发的心得

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-3-10 22:10 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本文据不完全统计,有五千字左右,请注意控制你的阅读时间和阅读节奏。
本文并不是一个晚上写出来的,所以你也不用想着一口气把它看完。饭一口一口慢慢吃才不会噎着,水一口一口慢慢喝才不会呛着。
楔子
先从吃饭说起。
需求:肚子饿了想要吃饭,才发现米饭没做。
首先要等米饭做好。
等米饭做好,盛到碗里,端到桌上,才发现筷子没拿。
于是得先去拿筷子。
然后才能坐下来吃饭。
吃完饭就满足了肚子饿的这个需求。
吃完饭还要干吗?
洗碗啊!
现在很多人要么在餐厅里吃要么打包回去吃,可能忘记了吃完饭还要洗碗。
碗洗好了还要干吗?
该干嘛干嘛去!

接着说2个思想上的误区
误区1
你以为看到的代码的顺序和程序员写代码的顺序是一样的。
写代码也好,写作也好,写的顺序并不是一行一行往下写的,写的过程是无序的,你看到的代码顺序和程序员写的顺序是完全不一样的。参考楔子中吃饭的案例,你想一下正常的吃饭是什么顺序?
你回想一下打包行李,生活用品放入行李箱中时是什么顺序,再想想从行李箱中取出生活用品时又是什么顺序?
所以很多人写完代码,过了半个月一个月再看时,一脸懵逼。
这是哪个家伙写的?
咦,好熟悉的代码,难道是我自己写的?
天呐,我什么时候写出了这样的代码?
可是为什么我现在大脑一片空白。
所以切记把注释写详细写完整。
正所谓好记性不如烂笔头。
误区2
你以为所有的代码都要自己写。
饭不是你自己做的,你吃得津津有味。手机不是你自己制造的,你也玩得不亦乐乎。为什么代码却想着得自己一个字符一个字符敲出来呢?
我不知道在别人看来,我是什么样的人。但在我自己看来,我不过就像是一个在海滨玩耍的小孩,为不时发现比寻常更为光滑的一块卵石或比寻常更为美丽的一片贝壳而沾沾自喜,而对于展现在我面前的浩瀚的真理的海洋,却全然没有发现。如果说我比别人看得更远些,那是因为我站在了巨人的肩上。——牛顿
写代码的时候,学着做牛顿口中的小孩吧。
你要知道,飞机身上的零件并不是在发明出飞机的那个时候才被创造出来的。
开发时一定要借助外界的力量和智慧(互联网、网友)
附件中如下代码来自录制宏,

Cells.Find(What:=TextBox1.Text, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _        , MatchByte:=False, SearchFormat:=False).Activate

附件中如下代码来自网上,

ListBox1.ColumnCount = 1
ListBox1.List = d.keys
你要做的,就是根据你的需求把这些散乱的元素有机地组合起来而已。

再说2个巨人的指点
大多数情况下,创新并不是突然间实现的结果,而是循序渐进优化的结果。即使是开创性的模式转变,也多半是许多正确方向上的小改变的结果,而不是一个大创意的结果。《卡片笔记写作法》[德]申克.阿伦斯 陈琳 译
你不必看清你去往何处。不必看清你的目的地和沿途的一切。你只需要看清前面的一两米即可。《程序员的思维修炼》  [美] Andy Hunt 崔康 译
上面这句话你想想平时开车是不是就是这样的?
过程中的每一步最优,得到的结果最优。

壹、缘起
在使用Excel自带的查找功能时,感到:
1、Excel自带的查找功能碍事,容易遮住文字;
2、搜索过的关键字无法保存。


TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-11 03:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
贰、目标

注意:目标只是一个方向,并不是一个地址。

目标是由问题产生的,在实际生活中或工作中,遇到了问题,经过思考后,发现了更好的方式,想要实现它,就有了需求。

向着你的目标出发,你可能会发现比预定目标更好的方案,这说明目标到结果之间是有一段距离的。就如你坐公交车到站下车,你的目的地可能在公交车站的前方,也可能在公交车站的后方。

要注意任何一个目标可能会是错的,需要在开发的过程中不断地进行调整。坚持正确的目标才会接近目标,而坚持错误的目标这本身就是错的。

在判断对错之前,先辨别真假。

有人告诉你最想见的那个人的地址,你兴冲冲地赶到那个地址去找他,可是怎么也找不到那个人,问了附近的人都说没见过那个人。后来你才知道,那个地址其实是假的,你想见的那个人其实早已在国外定居了。

如果你执着于自己的目标,则可能永远也找不到预定目标,目标是你主观上的东西,而实际结果是客观上的东西,有时候主观与客观相差十万八千里。

就拿代码来说,如果你写的代码执行完,达到了你的预期效果,那么说明主观与客观是统一的;如果你写的代码执行完,不知道结果是什么玩意,那么说明主观与客观是不统一的,代码有它自己的想法了。

需求:

1、输入内容,点击按钮进行查找,调用自带的查找功能;

2、把查找关键字存储在另一个表格中,并显示在列表框中。


叁、涉及到的元素(对象)

元素即是对象,一切皆对象。

要通盘考虑所有可能涉及到的对象。

本次开发涉及到的对象有用户、工作表、按钮、窗体、控件、模块,共6个对象。

1、用户,给我自己使用,最终想要的是点击按钮弹出一个界面,输入关键字,点击查找,调用Excel自带的查找功能,并保存搜索关键字。

2、工作表,涉及到《主页》以及《历史查找关键字》两个工作表。

3、窗体,窗体开发分两部分,一个部分是界面设计,另一个部分是代码开发。

界面设计部分,一开始设计了窗体、列表框、文本框、按钮这4个窗体控件。

这次窗体开发给我最大的启示是,窗体设计并不是一次性完成的,“清除”按钮是最后才加上去的。这是在开发的过程中,根据实际情境和条件增加的。

技术的限制与需求的无限存在着天然的矛盾。

当技术的限制无法突破时,要么增减相关对象,要么修改需求。

窗体是控件的母体,有了窗体,才有地方拖放控件。

文本框的作用,输入文字。

按钮1的作用,点击查询,保存文本框的内容到工作表《历史查找关键字》中,更新列表框的内容。

按钮2 的作用,保存文本框的内容到工作表《历史查找关键字》中,更新列表框的内容,清除文本框的内容。

列表框的作用,显示历史搜索关键字。

4、模块的作用,写SUB宏,显示窗体。

5、工作表按钮的作用,关联显示窗体的SUB宏。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-11 07:32 | 显示全部楼层
肆、开发思路

1、从查询按钮的角度考虑

从查询按钮出发,这是由需求决定的。

按钮怎么能响应鼠标点击呢?

这就需要考虑按钮与你的需求之间的联系,按钮有哪些方法、功能是指向你的需求的。

这就要求,①对窗体、控件的事件、属性和方法要熟悉,不熟悉可先百度,遇事不决问百度;②考虑按钮的单击事件与哪些对象交互。

按钮控件的单击事件能响应鼠标点击,并与工作表互动。

我想要点击查询按钮实现查找,这就用到了按钮的单击事件。

查找是根据输入文本框的内容进行查找,这样就要往前想了,相当于你肚子饿了,发现米饭还没煮,于是你得先把米饭煮了。

2、从文本框的角度考虑

这时,我要考虑根据什么内容来查找,我是要根据文本框输入的内容进行查找,这样我就把注意力转移到了文本框上,从文本框的角度进行考虑。

要考虑文本框是否有输入内容,有输入内容才执行查询,没有输入则不查询。

这里要考虑输入的内容会有几种情况,把所有可能出现的情况都罗列出来一一进行考虑。

由于本次需求较为简单,仅考虑有输入的情况。

①作为查询的依据;

②查询时要与工作表《主页》进行互动,调用自带的查找功能。

③查询结束,保存查询关键字到工作表《历史查找关键字》中,并更新列表框的内容。

④开始一个新的查询,要先保存查询关键字到工作表《历史查找关键字》中,并更新列表框的内容,最后清空文本框的内容。

根据这个想法在原来设计的基础上增加了一个“清除”按钮。

这时要考虑一个对象发生变化,会对现有各个对象产生什么影响,增减一个对象也要这样考虑。

总结:

①、从哪里来,经过哪里,到哪里去。

②、牵一发而动全身。

③、考虑一个对象的多个方面。

3、从列表框的角度考虑

文本框的问题考虑好了,列表框由原来不紧要问题变成了要紧问题。

①显示历史搜索关键字用于提示;

②点击历史搜索关键字显示在文本框,用于查询。

考虑用列表框的单击事件来实现。

4、从窗体的角度考虑

窗体中所有控件的问题都考虑好了,就回到窗体,从窗体的角度进行考虑。

考虑窗体初始化问题,也就是出厂设置问题,用到了窗体的初始化事件。

先从整体出发考虑各个部分,再依次从各个部分出发考虑部分与部分之间、部分与整体之间的联系,最后再回到整体。

以上思路我们再来一次:

第一步,从“查找”这个按钮出发,考虑按钮与文本框、按钮与列表框之间的联系,同时也要考虑文本框与列表框之间的联系。

第二步,把注意力转移到当前问题的条件上,即从文本框的角度进行考虑,考虑文本框与按钮、文本框与列表框之间的联系,同时也要考虑按钮与列表框之间的联系。

第三步,从列表框的角度进行考虑,考虑列表框与文本框、列表框与按钮之间的联系,同时也要考虑按钮与文本框之间的联系。

第四步,回到窗体,从整体的角度考虑初始化问题。

最后增加的那个“清除”按钮就留给大家来思考。

窗体的功能到此就完成了,后续还要在使用过程中不断地进行调试。

5、从用户的角度考虑

考虑前端工作表与后端VBE之间的交互问题,于是使用工作表按钮控件,实现前端按钮与后端代码的交互。

点击工作表按钮,执行模块中的代码,显示窗体,显示窗体前执行初始化事件,加载列表框的历史搜索关键字。

然后在前端显示窗体,先输入内容,接着点击查找按钮,按钮调用单击事件中的代码执行查找,同时关键字存入到工作表《历史搜索关键字》中,并更新列表框的内容。

从前端要加载这个窗体,就需要在前端添加工作表按钮,与SUB宏交互,插入模块,写显示窗体的代码。

这如同建造一座桥,从两头开始施工,最后在桥中间接龙。

工作表上的按钮类似乘坐电梯时的按钮,一个简单的按钮背后,是一个极其复杂的系统工程。

当我按照我的思路写代码的时候,我写的代码是从实现步骤1的功能开始的,可是我发现要想实现步骤1我得先实现步骤0,也就是步骤1前面的根据和条件。于是我转头先实现步骤0。

当我实现了步骤0,步骤1随即迎刃而解。

接下来要实现步骤2 ,此时的步骤1是在步骤2的前面,这样就要考虑步骤2和步骤1的联系,想要实现步骤2,步骤1是否已经完全实现了?同时还要考虑实现步骤2会对步骤0产生什么影响?

就这样不断地交替往前推进,直到完成代码开发。

要注意一句代码的增加减少,可能会影响到整个开发,需要修改不同的地方。

不要主观地认为自己比别人聪明,也不要盲目地菲薄自己不如人,请相信自己的直觉。

遇事不决,可问春风,春风不语,既随本心。

最后写好的代码要经过反复测试,因为你认为完美无缺的代码,有着很多肉眼看不见的BUG,只是在BUG没有被发现之前是完美无缺的,我想这些BUG就是人类大脑的BUG吧。从VBA中有on error resume next这句代码就能明白。

这就需要考虑出现BUG后如何补救,请准备好你的补丁,这个主要是靠经验积累。

总结:

从设计好窗体到最后完成开发,不是一蹴而就的,而是每一步都在调试,每一步都在调整代码的方向。

开发过程的每一步进入到下一步之前都要考虑当前的情境并结合目标。下棋、打牌也是同样的道理。

先是实现一个简单的需求,然后,再增加条件,直到实现想要的功能。

考虑按钮与相关对象之间的交互,要逐一了解各个对象的方法、功能,同样要结合目标进行考虑,以目标为导向。

同时要考虑对象之间的平衡,即动态的均衡搭配。


伍、前端与后端

本次开发过程中涉及到5对前端与后端的关系。

电脑桌面上的Excel快捷图标与工作表界面是一对前端和后端的关系。

工作表界面与VBE界面是一对前端和后端的关系。

窗体设计与窗体代码界面是一对前端和后端的关系。

VBA界面与Excel底层代码是一对前端和后端的关系。

工作表《主页》与工作表《历史搜索关键字》是一对前端和后端的关系。

一个前端界面,同时也是后端界面,局中有局,你中有我,我中有你。

东西虽然很简单,但是背后的思想是复杂的。

技术的价值在于技术背后的思想与梦想。


结尾

由于本人的经验和水平有限,以上写的只是我个人在学习和开发过程中遇到的经验,还有很多我没有遇到的,需要大家来发现总结。

如果你得到了启示,就把这份善缘传递下去,让更多的人和你一样得到启示。

我学习VBA有十年了,VBA只是一个工具,君子役物,小人役于物,学习VBA是要让VBA帮助我们提高工作效率,而不是让VBA成为我们的负担,我曾经想着,学会了VBA,走遍天下也不怕,老想着用VBA控制导弹、控制飞机。

直到后来我才明白,在合适的时间、合适的地点,用合适的方式对合适的人做合适的事才能产生合适的效果。

生活中还有很多美好的事情在等着你,如公园里的芳草、湖中的鱼、天上的白云、漂亮迷人的小姐姐,帅气逼人的小哥哥……

如果你觉得以上写的似曾相识的话,你想想你的开发过程,再想想你的生活和工作。

写代码的思想与生活的思想本来无二。

附件《demo1》是最初的代码,附件《demo2》是成品,接下来,大家开始按图索骥吧。

链接:https://pan.baidu.com/s/1BnQircW0NGf2KalXlQAyug?pwd=z0rp

提取码:z0rp





写在最后

还是说吃饭。

需求:肚子饿了想要吃饭,才发现米饭没做。

首先要等米饭做好。

等米饭做好,盛到碗里,端到桌上,才发现筷子没拿。

于是得先去拿筷子。

然后才能坐下来吃饭,这样就满足了肚子饿的这个需求。

吃完饭还要干吗?

洗碗啊!

碗洗好了还要干吗?

该干嘛干嘛去!

TA的精华主题

TA的得分主题

发表于 2023-3-14 23:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-3-15 06:49 | 显示全部楼层
写注释是个好习惯,有些太简单的就没必要了,一般VBA都是解决一些小问题,明眼人一看就明白

TA的精华主题

TA的得分主题

发表于 2023-3-15 08:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我们公司的VBA大神,都是宏加密的

TA的精华主题

TA的得分主题

发表于 2023-3-15 09:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
rocklyman 发表于 2023-3-15 08:07
我们公司的VBA大神,都是宏加密的

加密不一定是为了不给人看,建立者可能是考虑使用的人比较多,容易被误删,或者被弄乱。

TA的精华主题

TA的得分主题

发表于 2023-3-15 11:27 | 显示全部楼层
skiss 发表于 2023-3-15 09:35
加密不一定是为了不给人看,建立者可能是考虑使用的人比较多,容易被误删,或者被弄乱。

因为用拼音变量不想贻笑大方,所以加密。。。我说的是我

TA的精华主题

TA的得分主题

发表于 2023-3-15 12:23 | 显示全部楼层
很好的方法与经验总结,持续向坛子里的各位大佬学习,积累经验.

TA的精华主题

TA的得分主题

发表于 2023-3-15 13:23 | 显示全部楼层
skiss 发表于 2023-3-15 09:35
加密不一定是为了不给人看,建立者可能是考虑使用的人比较多,容易被误删,或者被弄乱。

代码内还设置了计算机用户名限制,不是在名单内的就自动把表给删了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 11:36 , Processed in 0.053046 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表