VBA加载宏制作攻略
本文所述加载宏是指使用EXCEL VBA制作的加载宏,这类文件的后缀默认为xla,因此又称XLA加载宏。内容划分为五部分,第一部分为概述,简单介绍加载宏的一般知识;第二部分至第四部分介绍制作加载宏函数、过程和事件主要技巧;第五部分为制作加载宏的其它方面。
一、概述
1.制作加载宏的一般步骤
(1)创建一个新的工作薄,在其中添加代码。
(2)在“文件”菜单上单击“属性”。在“文件名 属性”对话框中,单击“摘要信息”选项卡,然后在“标题”框中为加载宏指定一个您希望在“加载宏”对话框中出现的名称,在“备注”框中输入您希望当用户从“加载宏”对话框选择该加载宏时在“加载宏”对话框下方出现的说明信息。
(3)在“文件”菜单上单击“另存为”。在“另存为”对话框中,从“保存类型”框中选择“Microsoft Office Excel 加载宏(*.xla)”,然后再选择保存路径,并可在“文件名”框中修改文件名。
2.加载宏的加载和卸载
通过在“工具”菜单上单击“加载宏”,可以加载制作好的加载宏文件,如果它不在列表中,可以在“加载宏”对话框中单击“浏览”找到它,当某个加载宏名称前的复选框被选中时,说明它已经加载,取消选中复选框即为卸载该加载宏。
3.加载宏的作用
加载宏可以扩展EXCEL的功能,将代码写在加载宏中和写在普通的工作簿中相比,有如下优点:
(1)加载宏对所有打开的EXCEL文件都生效。普通工作簿的代码一般只在特定的工作簿中才生效。
(2)加载宏不受宏安全级的限制,也不会有宏运行的提示。即使将安全级设为“非常高”,加载宏就象EXCEL本身固有的功能一样工作。同样,它也不会被按住的Shift屏蔽。
特别提请不习惯使用加载宏而专门VBA代码书写的朋友们注意的是,加载宏的所有好处和优点,都是属于EXCEL的常规操作者的,虽然加载宏中的代码可以被其他工作簿(中的代码)调用,但这样做是繁琐而低效的,千万不要把它当成了C中的“头”文件或链接库。也许不会有很多人这样认为,但笔者初学VBA的时候,真的这样天真过。
(3)加载宏在运行时其工作簿窗口是隐藏的,因此普通用户并不会感觉到它的存在。
呵呵,也不能全怪我,因为几乎所有的公开的资料都是这样介绍的,事实上,实现函数的说明和分类根本用不着明示的代码,这意味着在open事件中使用MacroOptions根本就是多余的。因为EXCEL会记录并保存MacroOptions的操作,你只需在设计阶段,在立即窗口,执行需要的MacroOptions操作,或者写一段MacroOptions操作代码,然后再删除它就可以了。要记住的是,执行后一定别忘了在VBE中点击保存。结果竟然如此简单!请参考我在后面给你提供的附件实例。
3.函数规范
有些朋友认为:Function和Sub的区别仅仅在于是否有返回值,在Sub中使用的代码同样可以在Function中使用。这种认识最多对了一半。是的,对于在代码中调用的Function和Sub,除了“返回值”,它们几乎没有区别,但是,全局宏的函数是准备给用户在工作表中使用,象我们前面的做的函数,用户在使用时,通常会在工作表的B2单元格中输入“=dx(A1)”,如果一个函数是为工作表准备的,代码就要受到限制。先来看一个错误的函数:
Function TTT(rg As Range) As String
rg.Value = rg.Value + 1
TTT = rg.Value
End Function
上面的函数试图将参数区域的值先加1,然后返回其值。如果你在代码中使用
N=TTT([a1])
不会有任何问题,现在,你在A2单元格输入公式“=ttt(A1)”看看。
限于篇幅,本文不再探讨理论问题,而是直接给出这些应该注意的结论:
(1)严格遵循“黑匣子”理论,不要试图去改变外部对象的属性,包括参数对象,即使它们是传址方式的。对外部对象值的改变,会导致函数的结果错误,如你在上面看到的“#VALUE!”,其它属性的改变,通常会被忽略。
(2)不要使用Volatile 方法,除非你要构建的函数确实是象RAND类型的易失性函数。在函数中加入:
Application.Volatile
会告诉系统该函数是易失性函数,则当工作表的任何区域发生改变时,该函数都会被重算。这将严重影响系统的效率。要做到这一点,应当将所有影响函数值变动的区域都作为参数,即使某些区域是固定的也要作为参数传递。
(3)函数中可以使用可选参数,但可选参数应避免为Range类型。因为使用Range类型的可选参数,将不可避免地使用Application.Volatile。
三、处理加载宏过程
加载宏的另一个重用功能就是提供扩展的操作,这通常是写在模块中的Sub过程。设计加载宏过程应注意两个方面,一是代码实体,二是提供适当的接口方式以便用户可以使用这些操作。
在代码实体的设计上,加载宏代码与其它VBA代码看上去也许没有太多的差别,但它要求设计者更为密切地注意加载宏的运行环境,对象成员的使用也更应规范和严谨。比如,喜欢混用ThisWorkbook和ActiveWorkbook的朋友要好好看看帮助文档中二者的差别了。
现在请在模块中粘贴下面的代码:
Sub HVCenter()
\' 这段代码的含义很简单,让选定区域文字水平垂直居中
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
End Sub
在接口处理上,一般有3种处理方式。
1.快捷键
为过程设置快捷键可以在另存为加载宏文件前在“工具”菜单上单击“宏”-“宏”,在“宏”对话框中,单击“选项”按钮完成。也可使用前面介绍过的MacroOptions方法设置。
Application.MacroOptions Macro:="", HasShortcutKey:=True, ShortcutKey:="A"
2.菜单
通过在系统菜单上增加菜单项可以将操作提供给使用者,加载宏是对EXCEL基本功能的扩充,一般不提倡使用自定义菜单来代替系统菜单。
3.工具栏
可以使用EXCEL现有的工具栏上增加按钮也可以通过新建工具栏来完成。下面代码将前面的过程关联到新建的菜单项和工具栏上。
Private Sub Workbook_AddinInstall()
On Error Resume Next
\'新建菜单
With Application.CommandBars(1).Controls.Add(Type:=msoControlPopup)
.Caption = "测试(&T)"
With .Controls.Add(Type:=msoControlButton)
.Caption = "居中"
.OnAction = "HVCenter"
End With
End With
\'新建工具栏
With Application.CommandBars.Add(Name:="myCmdbar")
.Position = msoBarTop
With .Controls.Add
.FaceId = 352
.Caption = "居中"
.OnAction = "HVCenter"
End With
.Visible = True
End With
End Sub
由于工具栏和菜单生成后不会随EXCEL的关闭而消失,因此创建工具栏和菜单的代码一般应写在AddinInstall事件中,并且在加载宏卸载时随之卸载。下面代码卸载前面创建的工具栏和菜单。
Private Sub Workbook_AddinUninstall()
On Error Resume Next
Dim ctl As CommandBarControl
\'卸载工具栏和菜单
Application.CommandBars("myCmdbar").Delete
For Each ctl In Application.CommandBars(1).Controls
If ctl.Caption = "测试(&T)" Then ctl.Delete
Next ctl
End Sub
四、处理加载宏事件
原则上讲,加载宏事件应对所有打开工作簿发生的事件进行处理。加载宏事件的设计相对函数和过程的设计而言通常要复杂得多,它要求设计者具有一定的类知识和良好的代码组织能力。具体设计主要应解决两方面问题,一是事件代码本身,二是将预作的“事件代码”和对象关联。我们仍通过实例,继续前面的设计来介绍。
任务:让加载宏实现当用户在活动工作簿的活动工作表选择某一区域时,状态栏显示该区域的范围。
1.设计事件代码
(1)分析要用的对象和事件
不难知道,本例需要Workbook对象的SheetSelectionChange的事件。首先使用WithEvents关键字定义一个Workbook对象。
Dim WithEvents wkb As Workbook
注意,WithEvents关键字不能在标准模块中使用,因此,代码一般写在Thisworkbook中。
(2)书写事件代码
Private Sub wkb_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Application.StatusBar = "你选择的区域:" & Replace(Target.Address, "$", "")
End Sub
2.关联对象
(1)分析需要关联的所有情况
写好了上面的代码,如何将它与活动工作簿关联呢?首先应该分析可能进行关联的时机。以本例,大体我们将需要(改变)关联,即活动工作簿发生变化的情况列示如下:
a.当新建工作簿时,关联对象为新建的工作簿
b.当新打开工作簿时,关联对象为新打开工作簿
c.当在两个工作簿之间切换时,关联对象为新切换到的工作簿
(2)完成关联代码
上面的分析知道,需要用到Application级的事件。定义Application对象,写入相应的事件,然后在Open事件中将它关联到当前的Application即可。汇合前面的代码如下:
Dim WithEvents app As Application
Dim WithEvents wkb As Workbook
Private Sub app_NewWorkbook(ByVal Wb As Workbook)
Set wkb = Wb
End Sub
Private Sub app_WorkbookOpen(ByVal Wb As Workbook)
Set wkb = Wb
End Sub
Private Sub app_WorkbookActivate(ByVal Wb As Workbook)
Set wkb = Wb
End Sub
Private Sub wkb_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Application.StatusBar = "你选择的区域:" & Replace(Target.Address, "$", "")
End Sub
Private Sub Workbook_Open()
\'关联到Application
Set app = Application
End Sub
还有一个问题,上面处理的都是加载宏加载后的关联,当加载宏加载时,调用加载宏的工作簿呢?你是否认为可以在上面的Open事件中加入:
Set wkb = ActiveWorkbook
就可以了呢?答案是否定的。正确的做法是使用属性过程和Auto_Open,首先在ThisWorkbook中加入下面的属性过程:
Property Let ActiveWkb(ByVal wk As Workbook)
Set wkb = wk
End Property
然后再在模块代码中加入Auto_Open过程:
Private Sub Auto_Open()
ThisWorkbook.ActiveWkb = ActiveWorkbook
End Sub
我把这个放在最后,目的是提请你注意Open和Auto_Open的区别。
五、加载宏制作的其它技巧
1.静态和动态数据
我们一直没有提到加载宏的工作表,它们可用来做什么呢?利用加载宏的工作表隐藏而具有良好的保护性,它们可以用来存储“系统”使用的大量数据(包括格式),从而实现所谓代码和数据的分离,使代码更清晰简洁。这些数据是静态的,在运行过程中允许加载宏中使用代码对它们进行修改(包括增删工作表),从而实现动态数据的要求。然而,这些修改在EXCEL关闭的时候,不会象普通文件那样给出类似“加载宏文件已经修改,是否保存?”之类的提示,当你下次打开EXCEL时,加载宏工作表仍然会回到它最初的样子。呵呵,是不是有点象“模板”啊?只有一种情况例外,就是在加载宏中使用了明示的保存代码如Thisworkbook.Save。
2.加载宏的调试
当加载宏文件需要修改的时候,有些朋友习惯于先关闭所有的EXCEL文件,然后单独打开加载宏文件进行修改。其实是不必要的,加载宏可以在加载的状态下调试并且进行修改,必要时可以先将它的IsAddin属性设置为False(调试结束记得改回去),完成后在VBE中点击“保存”(注意不能在主界面下保存)。
3.使用窗体
加载宏可以使用窗体为用户提供友好的界面。其设计和普通工作簿没有什么区别,不再赘述。
VBA加载宏制作攻略相关推荐
- 弹弹堂服务器响应时间过长,弹弹堂游戏加载问题全攻略
新闻公告/NEWS 当前位置: 7k7k小游戏 > 弹弹堂 > 新闻公告 弹弹堂游戏加载问题全攻略 更新日期:2016-07-21 来源:7k7k 作者:7k7k卡卡 关于 ...
- Excel开发个人工具箱-VBA加载宏
在Excel中某些经常用到的功能,可以制作为加载宏,以快速调用. 以公式转文本为例,正常操作流程是:1)单元格赋值.2)粘贴为文本 这样的方式在复制大量单元格时,Excel会发生卡顿. step1:新 ...
- 10张精美可视化大屏模板分享,加极简制作攻略!抓紧收藏
这两年随着大数据的发展,数据可视化大屏项目渐渐从原来的政府企事单位逐渐应用到了企业端,从事数据行业这么多年,我也参与过不少大屏项目的开发,也感知到了企业大屏需求的不断变化. 两年前,大家都喜欢用&qu ...
- 加载宏(Addin)使用方法
Office VBA Addin加载宏是一种使用VBA编写的程序,它通过加载设置,可以随Office程序启动而自动加载运行,是制作Excel自定义函数.Office菜单和功能区按钮.添加常用辅助功能的 ...
- 图表添加特定横轴数据_Excel图表学习61: 编写一个给多个数据系列添加趋势线的加载宏...
学习Excel技术,关注微信公众号: excelperfect 在<Excel图表学习60:给多个数据系列添加趋势线>中,我们手工给多个散点图系列添加了一条趋势线,如下图1所示. 图1 在 ...
- wpsppt加载项在哪里_《wps表格加载项在哪里》 WPS版的EXCEL中 加载宏和数据分析在哪?...
wps表格里的查找功能在哪? 以WPS 2019版本为例: 可以在工具栏中单击"查找"功能哦. WPS中的excel表格将字段分组在哪 我在wps表格中了一个关于成绩的表格面我们来 ...
- wpsppt加载项在哪里_wpsppt加载项在哪里_《wps表格加载项在哪里》 WPS版的EXCEL中 加载宏和数据分析在哪?......
wps表格里的查找功能在哪? 以WPS 2019版本为例: 可以在工具栏中单击"查找"功能哦. WPS中的excel表格将字段分组在哪 我在wps表格中了一个关于成绩的表格面我们来 ...
- 他山之石——封装函数与COM加载宏
继续学习VBA! '如果想用com加载宏的形式替代在excel的写EXCEL对象事件,可以在VB里编写好事件程序,封装到dll里,然后注册dll '和函数封装不同,com加载宏需要在VB里添加&quo ...
- ppt如何查看加载宏
很多人一定有疑问,为什么可以使用vb编辑器查看自己录制的宏的代码,却无法查看加载的宏的代码.下面让我来简单的说一下解决方法. 使用组合键WIN+R打开运行对话框,输入regedit打开注册表编辑器. ...
最新文章
- 选择PHP,选择自由与开源
- Boostrap技能点整理之【网格系统】
- Spring Data JPA 从入门到精通~@PreUpdate异常场景分析
- python-带参数的装饰器
- insert执行成功 没有数据_Python—接口测试数据库封装实现原理
- 2022年考研数据结构_3 栈和队列
- listary——一个强大的windows高效工具
- 小白白红队初成长(7)win权限提升
- Operator 基础原理和概念
- 5G技术领先的华为还是输了,小米在618热销5G手机榜居首
- EfficientDet-BiFPN
- flask_alchemy多对多关系注意事项
- 终于明白了,为什么会有经济危机
- vue 能拿到对象 打印对象 但获取不到具体属性 属性 undefined
- 微信小程序后台持续定位功能使用
- 牛客网面试高频题top100(11~20)
- 罗辑思维的「逻辑」问题 - 谈独立思考
- 【教程】使用U盘制作Win10系统启动盘(重装系统准备工作)
- 菜鸡打卡 算法训练 递归 (含dfs深搜解法)——振兴中华 来自第四届蓝桥杯A组第三题
- LBG 矢量量化算法