学习VBA过程中归纳积累的几个比较实用的技巧和方法

拂晓动漫 2018-08-12 13:09:35

一般情况下学习 Excel VBA 的帮手就是软件自带的帮助文档,帮助文档中大部分内容讲得很详细,而且还带有示例代码,看起来还都比较容易理解。不过也有相当部分的帮助内容说得不详细,或缺少示例,而有些即便有示例也无法囊括所有的使用方法,令很多人看过后依然是一头雾水无法真正的掌握。

鉴于这种情况,为集思广益,让更多的人在学习过程中少走一些弯路,节省一些时间,请大家把您在学习中的心得或所掌握的某些有关VBA应用方面的技巧和方法奉献给大家。下面是前阶段在,供分享。

1、在VBA代码中使用注释,可以简要描述所编写的每个过程的目的、对过程所做的任何修改、描述变量的目的、以及语句的作用等。但有时在调试程序代码时,可以暂时将某条或某些语句设置成注释。选择VBE编辑器中的菜单“视图——工具栏——编辑”,调出“编辑”工具条。通过使用该工具条中的“设置注释块/解除注释块”,可以将VBA语句暂时设置成注释块,以便于调试。

2、通过宏录制器录制的代码,一般是先选择后处理,但大多数情况并不需要这样。在VBA中,要处理单元格区域,在代码中不必先选择该单元格区域,例如,在Excel中,我们如果要使第一行变成粗体就必须先选项中它,然后再处理。但在VBA中(除在图表操作时需要选中图表对象外),很少需要这样做,即VBA可以在不选中第一行的情况下,将它变成粗体。

宏录制器的代码:

Rows("1:1").Select
Selection.Font.Bold = True
改编后的代码为:
Row(“1:1”).Font.Bold=True

这样做还可以使程序代码更简洁,并且程序可以运行得更快。

3、如果必须将大量的数据传递到某个工作表,应尽量避免使用循环的方法,而是采用数组进行传递,这样速度会更快。

4、运用Not运算符切换属性值。例如,当我们在工作表中选择单元格或单元格区域后,单击工具栏中的“加粗”按钮加粗,再次单击则取消加粗。语句

Selection.Font.Bold=Not Selection.Font.Bold

即可摸仿这一功能,其中Bold属性的值为True或False,使用Not运算符会将值False改为True,将值True改为False,这样可用于切换所选单元格是否“加粗”。这也是VBA程序编写时的一个技巧,我们可以运用Not运算符模仿工具栏“加粗”、“斜体”等按钮的工作模式来处理其它的操作,例如,下面的代码切换工作表中的行和列的边框:

ActiveWindow.DisplayHeadings=Not ActiveWindow.DisplayHeadings

下面的代码切换是否显示工作表中的网格线:

ActiveWIndow.DisplayGridlines=Not ActiveWIndow.DisplayGridlines

5、在缺省情况下,在VBA中对文本进行比较等操作是区分大小写的,若将语句Option Compare Text添加到模块的顶部,则程序执行时不会区分大小写。

6、在编写VBA代码时,为获得VBA函数列表,可在VBE中键入“VBA”,则会显示出它的所有成员列表,其中前面有绿色图标的就是函数。

7、在代码中可以使用Me代替用户窗体名称,这样若修改用户窗体的名称,也不必修改代码中的引用名称。

8、每个用户窗体和控件都有一个Tag属性,默认情况下为空,可以使用Tag属性来检验控件或窗体标识,或者可用来存储个人信息以便于识别,还可以有来提示必须要进行操作的控件,例如:在一个用户窗体上有一系列文本框控件,用户可能必须要输入文本到某些文本框但不一定是全部的文本框,可以使用Tag属性识别哪些文本框是必须要填写的。如可以将必须输入文本的文本框的Tag属性设置为如Required字符串,以此在代码中进行验证用户输入的有效性。在用户窗体失去焦点或关闭前调用下面的子过程,检查用户窗体UserForm1上的所有文本框控件并返回空的但必需要填写的文本框控件的编号。

Sub CheckEmptyTextbox()
    Dim ctl As Control
    Dim i As Long
    For Each ctl In UserForm1.Controls
        If TypeName(ctl) = "TextBox" Then
            If ctl.Tag = "Required" Then
                If ctl.Text = "" Then
                    i = i + 1
                    MsgBox "第" & i & "个文本框为空,请您在该文本框填入数据."
                End If
            End If
        End If
    Next ctl
End Sub

下面所附示例会提示您在应该输入内容的文本框中输入内容,您可以对程序进行适当修改,例如,用户在必须要输入内容的文本框中要有输入,否则程序会中止。

9、在工作表中编辑控件。例如,对按钮控件操作,在拖动控件的同时按Alt键,按钮将与工作表的网格线对齐;在拖动的同时按Shift键,按钮将成正方形。

10.GetOpenFilename 方法FileFilter参数的具体使用方法:

先来一个,抛个砖:

Sub GetFilesName()
    x = Application.GetOpenFilename("Ico Files (*.ico), *.ico,Gif Files (*.gif), *.gif,允许的图片文件(*.ico; _
	*.gif),*.ico; *.gif,所有文件(*.*),*.*", 3, , , ture)
End Sub

2.在VBE中快速得到帮助内容的法子

鼠标定位在语句的某个单词字串中,按F1键。

添加一个

快速显示窗体中某个对象的某个属性的帮助:

在窗体中选中该对象,在属性窗口中选中要查找的属性,按F1键。

3.标签控件标题垂直居中

标签控件提供了一个TextAlign属性可以设置标题在水平方向的对齐方式,但没有提供一个属性来设置标题垂直居中.要达到这个效果,可以使用两个标签控件组合一起来完成.

首先,在窗体中添加一个标签控件Label1,Caption属性设置为空,再设置需要的背景颜色及边框颜色;

然后,再添加一个标签控件Label2,Caption属性设置为您想要的标题,AutoSize属性设置为True,BackStyle=0,TextAligh=fmTextAlignCenter,其它属性不改变;

接着,同时选中两个标签控件并右键,在弹出菜单中选择统一尺寸>>宽度相同,再右击选择对齐>>左对齐,重新右键对齐>>中间对齐.

您可以将两个控件生成组,Ok,现在达到效果了。

4.传递参数到OnTime方法和OnAction属性所调用的宏程序中

在VBA帮助系统的OnTime方法介绍中,只对其参数EarliestTime, Procedure, LatestTime, Schedule进行了说明,并列举了定时运行某过程和撤销OnTime设置的三个代码示例。对OnAction属性的介绍中,也只简要介绍了单击某图形或菜单项时运行指定宏的示例。均没有介绍当OnTime方法或OnAction属性中设置的所要运行的宏带有参数时,如何传递参数到这些宏程序中。下面是自已前阶段所学到的一些参数的传递方法,供分享。

5.传递参数到OnTime方法和OnAction属性所调用的宏程序中

因为运用Application.OnTime或Object.OnAction调用宏程序的语法基本相似,因此,下面介绍的OnTime方法所使用的语法同样适用于OnAction属性。

为了便于理解,以下介绍均使用一段相似的代码,只不过传递给所调用宏程序MyProcedure的参数不同而已,以此来讲解传递给宏程序不同参数的方法。例如,下面的代码将使MyProcedure宏程序在从现在起的2秒后运行:

Application.OnTime Now + TimeValue("00:00:02"), "MyProcedure"

问题1:假设MyProcedure宏程序接受参数,如何传递参数到该宏程序中?有下面几种情形:

(1)所调用的宏程序接受一个参数

如果是在正常代码过程中传递参数给宏程序,可以使用" MyProcedure (42)",其中“42”为传递给MyProcedure程序的参数。但如果这样的传递参数方法用在OnTime方法中,该程序将不会运行。

正确的语法是外层为双引号,内层再加上一组单引号,里面是程序名和程序所接受的参数。如下所示:

'MyProcedure宏程序接受一个数值参数

Application.OnTime Now + TimeValue("00:00:02"), "' MyProcedure 42'"

(2)所调用的宏程序接受多个参数

如果所调用的宏程序接受几个参数,那么在这些参数之间应该用逗号分隔。如下所示:

'MyProcedure宏程序接受两个数值参数

Application.OnTime Now + TimeValue("00:00:02"), "'MyProcedure 42, 13'"

(3)所调用的宏程序接受字符串参数

如果所调用的宏程序所接受的参数是字符串,因为字符串已经带有一对双引号,因此应该将字符串包含在双层双引号中,即字符串参数周围有两对双引号。如下所示:

'MyProcedure宏程序接受一个字符串Hello!作为其参数

Application.OnTime Now + TimeValue("00:00:02"), "'MyProcedure ""Hello!""'"

问题2:当MyProcedure宏程序所接受的参数是变量,如何传递参数到该宏程序中?

(1)该变量为局部变量,用如下所示的方式。

'MyProcedure宏程序接受一个字符串变量strText参数,该变量为局部变量

strText = "Hello!"

Application.OnTime Now + TimeValue("00:00:02"), "'MyProcedure """ & strText & """'"

(2)该变量为全局变量,用如下所示的方式,即不必加双层双引号。

'MyProcedure宏程序接受一个字符串变量g_strText参数,该变量必须声明为公有的

g_strText = "Hello!"

Application.OnTime Now + TimeValue("00:00:02"), "'MyProcedure g_strText'"

注意,在这种情况下变量必须声明为公共变量,否则MyProcedure宏程序将不能找到该变量参数。