乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > excel 外部vba

excel 外部vba

作者:乔山办公网日期:

返回目录:excel表格制作

如何快速学习Excel VBA?


新手学习Excel VBA的几点建议,你不妨过来

1:调试

经常看到新手学习了很长时间的VBA之后仍然不会使用调试功能,一遇到问题马上就请教他人,这样不利于自身的成长。调试非常重要,是学习代码本身

不可或却的一部分。是诊断,梳理代码逻辑的过程,可以避免逻辑错误的重复性发生。善用调试新手很多的问题都可以得到解决,即可摆脱对他人的依赖性,自身又得到长足的进步,一举两得。

三个窗口,三个功能键:

地方窗口,立即窗口,观察窗口,F1(帮助),F2(属性方法),F8(分步执行)

途中诊断:

断点,stop等等。

2:分拆

(1)语句分拆

长而难懂的句子分拆成基本单元,利用调试功能一个个解决,很容易就理解了它的含义。

如:intRow=Range("A"&Rows.Count).end(xlup).row

立即窗口:?Rows.Count

Range("A"&Rows.Count).Select

Range("A"&Rows.Count).End(xlup).Select

?Range("A"&Rows.Count).End(xlup).row

用眼睛都可以看到每一步Excel选中的哪个单元格,那么自然就不难理解了。这个小范例同时揭示了学习程序过程中一个非常重要的方面:动手尝试。

(2)子程序分拆

把一个冗长的程序按照功能拆分成一个个相对独立的子程序来调用,使得程序具有一定程度的组织性,结构性,规整性大大提高了代码的可维护性,扩展性,重用性。这是贯穿程序语言发展的一条主线,因为它直接指向了程序开发的终极目的之一:开发效率。

3:耐心

学习目的明确≠急于求成。无论学习目的如何直接和明确,学习的过程仍然不是一蹴而就的,"捷径"只能是建立在扎实的阶梯式基础上。有些新手基本代码还没写利落就开始用界面写"系统",甚至还没学会调试,结果是步履维艰,一步一问,三步一错,无以为继。还有的朋友学习VBA是为了研究彩票,还没学习一星期就开始写各种计算方法,自然处处遇"难",大挫学习兴趣,随之放弃。抱着明确的目的学习是好事,不管目的是否"明智"(这是另外一个话题),但明确的目的不等于"急功近利"。学习的进程总是遵循渐进式的规律,跳跃式的一夜暴富只能是空中楼阁,所以耐心在学习过程中就显得尤为重要。

单独说说效率和速度的问题。程序的效率大致包含两层含义

(1):执行效率;

(2)开发效率。

执行效率又可分为时间效率和空间效率,空间效率不在本贴讨论范围内,所以执行效率简化为速度来讨论。之所以单独拿出来说这个问题是因为论坛很多帖子在"速度"追逐上所表现出的"热忱"比较极端,走的路比较偏执,希望初学者能够以一个相对平和的心态来看待效率。

执行效率与开发效率,从字眼上分析就知道,程序的最优目标是两者并重。遗憾的是兼顾并非常态,凸出一者的同时往往伤害到另一者。当两者出现矛盾时,职业代码工人较为普遍接受的原则是:"只有在必须考虑速度的时候才优化执行效率,否则以开发效率为重"。

换句话说,只有在不得不考虑优化速度的时候执行效率的目标高于开发效率因为要保证功能性,有效性。否则只考虑开发效率不考虑执行效率。职业程序员和职业"玩家"在这个问题的认识上经常会产生分歧。

注重效率的程序员

设身处地的想一下,职业程序员在意的是什么?他们在意的是快速,顺利的完成工作,在意的是软件的稳定性,有效性尽量避免老板和客户找他们的麻烦,最终目的就是挣钱,吃饭,养家。花费几个小时来提速几个程序模块,工资没多一分钱,延误了进度,工期老板肯定不干。基于这样的原因,他们顺理成章的注重与可维护性,稳定性,扩展性,重用性相关的开发效率。

追逐"手筋"的"玩家"~

相比较而言,职业"玩家"写代码并非为了工作,没有项目压力,无需考虑开发时间,开发成本,追逐的是华丽的"手筋",以及速度飙升所带来的愉悦。其次,速度本身的属性决定了它是一把极其规范,可量化的标尺。基于速度为标准的代码具有极强的博弈性和竞技性,不仅可以独乐还可以众乐。

"有意义"和"无意义"

前边我们就曾提过"有意义的快"和"无意义的快","有意义的快"可以包括两种情况分别称作"根本性速度提升"和"规模型速度提升"。

插播小故事:"这事儿不赖我"

某日一油漆工找到一份新工作:刷马路中间的白线。

于是油漆工把一个油漆桶放到了起点上开始工作了。

第一天,油漆工刷了300米,老板大喜,夸奖油漆工:"工作很出色!"

第二天,油漆工刷了150米,老板不露声色,鼓励油漆工:"工作干的不错!"

第三天,油漆工刷了30米,老板大怒,吼道:"今天只刷了第一天的1/10,到底怎么回事?"

油漆工回答:"这事儿不赖我呀!我每天距离油漆桶越来越远了啦!"

这个小故事形象的描绘了这样一个事实:改变工作方式可以带来根本性的效率提高。在遇到类似于上述情况时,初学者可考虑优化代码提升速度。

在VBA中当遇到速度慢的不可忍受的情况时,粗略的说可从以下几点入手:

(1)合理化数据源的结构;

(2)用数组一次读写单元格内容,避免频繁操作单元格对象;

(3)查询搜索改用Collection或字典。

所谓"规模型速度提升"是指对于应用频次高的问题,可以考虑一次优化速度,应用无数次,追求规模效应降低开发效率损失。至于"非根本性速度提升"

的例子可以在论坛看到很多,诸如循环是用指数索引快?还是ForEach索引快?等等,这里就不一一列举了。

用一句话来总结:"程序的本质是用机器来解放劳动力,而不是用劳动力解放机器!"

本来想写很多内容,一来由于没什么初学者看所以无收获可言;二来如果深入的话恐会戕害一些坛友的感情;三来目前此帖已有万余字,再多就不像帖子了。再深入展开下去实属下下策,故此楼略显单薄,但基本意思都点到了。剩下关于算法和数据结构的认识和态度在本楼没有提及。

到该结束的时候了,想必大家能理解本贴的态度:不褒不贬。你用,或者不用它,你喜欢,或者不喜欢它,它就在那里,不远不近,无所谓“强"无所谓”弱"。

一致性,对称性是匹配的原则。对称匹配,你收获你想要的,Excel,VBA发挥应有的效力;反之,错位匹配引发牵强附会,捉襟见肘。既然谈过了VBA的定位,自然不可避免的要谈一下对其宿主Excel的认识。话题就从这里开始吧......

灵活是把双刃剑

相比VBA而言,Excel的边缘性更强。相信大家都积累了多年的使用经验,是Excel的行家里手,提及某某功能如何实现均可娓娓道来。如果问一个这样的问题:"Excel到底是什么?"一言以毕之,"电子表格工具"。这种定义只是给Excel起了个别名(alias),不是一种理解,认识和定位。曾经问过自己这个问题,我发现自己答不上来或者说自己的能力不足以回答这个问题。

边缘性强主要表现在使用范围广泛,尤其它还是一款不断升级的产品并且有诸多第三方插件对其进行功能扩展,这时候你会发现无论怎么回答这个问题都是错的,难免给初学者造成"Excel无所不能"的错觉。但如果不能予以概念上的定位,就无法回答"适度"使用的问题,结果就是一切和表格有关的工作都用Excel来做。

Excel简单易用,功能强大,所见即所得(这可是个不得了的特点),这些都是耳熟能详的特点。个人认为Excel最大的特点来自于灵活:

(1)自由设计用户自己的蓝图,天马行空,个性十足;

(2)Excel分享了数据库的一些特点,具有一定程度的记录和数据存储的功能。虽然可以说Excel缺乏关系结构,但由于灵活的特点,可以用工作表打造出关系结构;

(3)通过各种计算和图表功能,提供多视角数据体验;

(4)腾挪空间广阔,运用水平差异大。

然而灵活性并非是无成本的,灵活的同时就意味着规范性差,同样功能的表格10个人设计出12样儿来,格式,表头,结构,实现方式等等花样百出。

规范性差导致用户交流困难,随着逻辑业务设计复杂程度不断提高,有效性控制繁杂,错误几率增大,急剧加重了设计者的负担。逻辑业务关系越复杂设计成本的增长幅度就越大(呈非线性增长态势)。前些日子看到一位坛友希望把一套表格封装,表格集成了一套用公式表达的复杂逻辑业务关系。其实这套关系本身就是一道加密壁垒,把其中的逻辑梳理清楚比破解还费劲。

个人的一点看法:既然很难在概念上抽象化Excel的定位,只好用一条条描述性的特征来概括Excel,但这种列举是无法穷尽的。

从正面说:

(1)Excel"适用"于:逻辑业务关系相对简单,数据规模不大,一锅端式的集成应用;(可惜无法量化定义"简单","规模")

(2)对于业务逻辑复杂,规模较大的数据,Excel"适合"充当数据库和用户之间的缓冲层(buffer)。致力于数据的展示,整理,综合,"分析"等体现灵活性的职责。

从反面说:(表象)

(1)避免用Excel设计大规模业务关系复杂的"系统";

(2)避免大量数据存储造成Excel文件尺寸过大;(动辄几十上百M的Excel文件经常能够看到)

(3)避免大量公式集成,重算可以导致文件打开速度过慢,运行速度过缓;

(4)避免搭建Excel文件系统;(几十上百Excel文件组成的文件集也是屡见不鲜)

(5)......

上述情况可以适当考虑使用数据库的功能,毕竟他们之间是有本质区别的。这里只是以我的观点来看待Excel,“不适合"不代表Excel不能做到,最终的评判要交给用户,谁用谁有话语权而不是设计者和所谓规范的探索者。在能意识到"隐患"的条件下,如果您觉得好用,完全可以避免庸人自扰式的思考,坚持走自己的路。

既然Excel的特点是灵活,我们就以一个灵活的态度来认识和对待它好了。

至此关于Excel和VBA的话题就告一段落了,最后再补充一句:

对于业务部门职员来说,Excel,VBA解决工作中的问题真的是够用了,也是很好的选择。如果不够用说明您的工作应该是由IT部门来完成的工作。业务部门的员工扛着VBA去干IT部门的工作,无论是工具和还是工作内容都错位的离谱。

最后收录一些经典语录。既然是收集,就是一个开放和相对漫长的过程,先把帖子的架子搭完,对观众有个交代,

【存在即合理】

<评>:理解"合理"的着眼点才能正确的认识,对待,运用好这种存在。一言以毕之不是试图掩盖存在本质的借口就是盲信。

【细节决定成败】

<评>:方向决定"成"是否有意义。

【不管什么,只要学好了都牛】

<评>:愤~青的态度抹杀客观存在的差异性。

只要听到"不管....只要....就...."的句子就是错的?


学习Excel一定要精通VBA才是高手吗?


首先,我对这个问题持否定意见。

我十多年前曾经用VBA+Access编写过一个100多人使用的生产管理系统,带很多UI界面。可能有些人感觉这样水平算比较高了吧,但我自己确实没这种感觉。

一般讲高手是一个相对的概念,是不是高手应该取决于对比对象。但我觉得使用会不会VBA来判断Excel水平,这对比本身就不是公平的。类似于两个人打游戏,其中一个会用外挂,我们显然不能用会不会外挂来评判他打游戏水平高。

对于普通程序员,学习VBA难度很小,极短的时间就可以上手,但他很可能Excel很多函数都还用不好。事实上,一个人会了VBA,很可能遇到问题首先去想VBA怎么实现,反而降低了探索Excel自身功能的动力。对于不会VBA的使用者来讲,更有动力去挖掘Excel自身的各种功能。

我的意见仅针对这个问题本身,并非劝大家不要学习VBA。Excel功能无论多强大,但仍有靠自身无法实现的功能。熟练掌握Excel后,再有VBA作辅助,生产力会更上一个台阶。

以上都是个人意见,如果对我回答有兴趣或异议,欢迎评论指正。

操控excel,选择Python还是vba?


数据量大更建议用Python,vba一般都是将数据存放在内存中,当数据不拆分电脑配置又不高,就会显得比较卡,数据处理完毕后,不释放下内存电脑用起来也会比较卡,vba一般只会启动2个cpu核心进行数据计算,运算效率也比较低,现在微软已经停止对vba的更新,更建议学习Python,如果只是操作excel,这两个学习难度差别不大,但是Python发展空间会更好


还有一种更加便捷的方法,就是使用power bi的三大组件进行数据处理,使用power query进行数处理,powerpivot进行分析,power view进行数据可视化,优点就是学习周期短,数据可实现自动刷新,上手比较快,使用这个方法,效率可能会比excel快一些,但是速度仍然不及python,当然了为了长久可持续更建议学习Python,但是上手周期会比较长

Excel VBA引用单元格区域有哪些方法?


一、强烈建议初学者理清Excel对象模型,在学写vba代码时,按层级来书写

本问题相关的对象层级为workbook - worksheet - range

二、关于引用单元格

Dim oBook As Workbook

Dim oSheet As Worksheet

Dim oRange As Range

Set oBook = Application.Workbooks("目标工作簿") '这里的Application指当前VBA代码所属的工作簿所在的Excel程序进程实例

Set oSheet = oBook.Worksheets("目标工作表")

'以下开始引用单元格

'1.引用单个单元格

Set oRange = oSheet.Range("A1") '常规方式

Set oRange = oSheet.Range("A" & 1) '动态列号

Set oRange = oSheet.Cells(1, 1) '行号+列号,可动态

Set oRange = oSheet.Cells(1, "A") '行号+列号

Set oRange = oSheet.[A1] '不建议使用

'Cells方法的缺点是无成员提醒

'2.引用连续单元格区域

Set oRange = oSheet.Range("A1:B2") '常规方式

Set oRange = oSheet.Range(oSheet.Cells(1, 1), oSheet.Cells(2, 2)) '长是长一点,某些时候还挺实用

Set oRange = oSheet.Range("A1", "B2") '使用率低

Set oRange = oSheet.Range("A1").Resize(2, 2) '极其灵活,配合Offset方法使用会更灵活

'3.引用不连续单元格区域

Set oRange = oSheet.Range("A1, B2:C3, D4")

Set oRange = Application.Union(oSheet.Range("A1"), oSheet.Range("B2:C3"), oSheet.Range("D4"))

'4.当前选定的单元格

Set oRange = Selection.Range

'5.行和列

Set oRange = oSheet.Rows(1)

Set oRange = oSheet.Columns(1)

'6.常用应用

Set oRange = oSheet.UsedRange '已使用的矩形单元格区域

Set oRange = oSheet.Range("A" & oSheet.Rows.Count).End(xlUp) '第A列,最后一个非空白单元格

Set oRange = oSheet.Cells(1, oSheet.Columns.Count).End(xlToLeft) '第1行,最后一个非空白单元格

希望回答对你有帮助

本文标签:

相关阅读

  • excel 外部vba

  • 乔山办公网excel表格制作
  • 如何快速学习Excel VBA? 新手学习Excel VBA的几点建议,你不妨过来 1:调试 经常看到新手学习了很长时间的VBA之后仍然不会使用调试功能,一遇到问题马上就请教他人,这样不利于自身的成
关键词不能为空

ppt怎么做_excel表格制作_office365_word文档_365办公网