分享

录制宏并获取有效的代码

 L罗乐 2016-12-31

使用宏录制器是获取ExcelVBA代码最简单的方式,尤其是对于没有任何编程经验的VBA学习者。例如希望在VBA中使用Excel的“高级筛选”功能从图1所示的Database工作表的数据表中获得在图2所示的Result工作表内指定的日期范围内的数据,并将数据复制到以单元格B5开始的单元格区域。


1从中获取数据的数据表图


1要使用的日期范围

Step1:单击选项卡【视图】【宏】【录制新宏】,将显示如图3所示的【录制新宏】对话框。


3“录制新宏”对话框

其中“宏名”文本框显示为默认的名称“宏1”,建议修改为有意义的名称。在【快捷键】文本框中输入的字母将作为运行宏的组合键即<Ctrl 字母>,如果在输入字母的同时按下<Shift>键,运行宏的组合键则为<Ctrl Shift 字母>。在【保存在】下拉列表中列出了保存录制宏的3个位置:当前工作簿,新工作簿和个人宏工作簿,选择【当前工作簿】将宏保存在活动工作簿中,选择【新工作簿】将宏保存在一个新的空工作簿中,选择【个人宏工作簿】将宏保存在名为Personal.xls的特定文件中,启动Excel时会自动地装载该文件。在【说明】文本框中添加宏的注释,即显示在代码顶部的文字,用来提供与该宏相关的信息。

通常在录制宏之前,应规划好操作步骤,尽可能少地录制不必要的操作。

Step2:单击【确定】按钮开始录制宏。(2003版本:此时会出现如图1-4所示的工具栏,包含两个按钮:【停止录制】按钮和【相对引用】按钮。单击【停止录制】按钮将停止录制操作,单击【相对引用】按钮将以相对于当前单元格的方式录制操作。)默认的情况下,Excel采用绝对引用的方式录制宏。

注意:此时工作簿状态栏中会出现“录音”的提示,菜单也由“录制新宏”变为“停止录制”。

Step3:在Excel中进行操作。单击选项卡【数据】【排序和筛选】【高级】,在打开的【高级筛选】对话框中选中【将筛选结果复制到其他位置】单选按钮。

Step4:在【高级筛选】对话框中单击【列表区域】文本框,然后用鼠标选定Database工作表中的A1:F10单元格区域,即原始数据列表。

Step5:在【高级筛选】对话框中单击【条件区域】文本框,然后用鼠标选定Result工作表中的B2:C3单元格区域,即指定的日期范围。

Step6:在【高级筛选】对话框中单击【复制到】文本框,然后用鼠标选定Result工作表中的B5单元格,即目标数据区域的起始单元格。完成选择后的“高级筛选”对话框如图4所示。


图4完成选择后的【高级筛选】对话框

Step7:单击【确定】按钮,获取的数据将复制到单元格B5开始的区域中,结果如图5所示。


图5利用“高级筛选”获取数据

Step8:关闭宏录制,单击选项卡【开发工具】【代码】【Visual Basic】或者按<Alt F11>组合键在VBE中查看录制的代码,如图6所示。


图6录制的代码

Step9:整理或修改代码。录制操作完成,接下来应该在VBE中整理或修改宏录制器所录制的宏代码,使宏更简洁、更灵活且更有效率。

宏录制器将记录步骤3至步骤7所进行的操作,并将其转换成相应的VBA代码。

通常宏录制器会“认真地”记录用户的每一步操作,应用与操作相关的所有属性和方法的所有参数,而实际进行的操作仅仅为其中的一部分,因此可以删除代码中与操作无关的方法参数和属性。

比如在大多数情况下,有关选定对象和激活对象的代码并无实际的用途,而且会降低宏代码的整体效率,所以可以删除。

此外,通过录制而得到的宏代码不够灵活,仅能用于执行某项特定的操作任务;不能做出判断,不能执行循环,不能提示用户输入相关信息,不能使用变量赋值;只能生成Sub过程。因此为了创建功能更强大的宏程序,有必要对录制宏的代码进行改进。

在修改录制的代码时,应及时地调试代码,以免误删所需要的代码。关于优化代码的更多内容请参阅技巧4以及本书第24章的内容。

本例中录制的代码很简洁,没有多余的代码,因此无须整理,在进一步的应用中,需要获取AdvancedFilter方法所在的代码并适当地修改该代码,当用户在Database工作表中增加数据时能查询最新的数据,使代码更灵活。修改后的代码如下:

#001 Sub  GetDatas()

#002 Dim  lLastRow  As  Long

#003 lLastRow=Sheets('Database').UsedRange.Rows.Count

#004 Range('B5:G65536').Clear

#005 Sheets('Database”).Range('A1:F'&lLastRow).AdvancedFilter_

            Action:=xlFilterCopy,_

            CriteriaRange:=Range('B2:C3'),_

            CopyToRange:=Range('B5'),_

            Unique:=False

#010 End  Sub

代码解析:

3行中的代码获取Database工作表中已使用区域的行数并赋值给变量lLastRow

4行中的代码清除了当前工作表中上次查询所获得的数据,以免在本次查询的结果中留下不必要的数据。

5行中的代码修改了宏录制器生成的代码,使用变量lLastRow扩展数据列表,从而可以获取最新的数据。

修改代码后可以在Database工作表中添加数据,重新运行GetData过程。如果新添加的数据满足条件,就会自动地添加到结果数据表中,

注意:运行此段代码时,Result工作表应该为活动工作表。

可以修改Result工作表单元格区域B3C3中的日期范围,然后再次运行GetData过程,从而获得满足该日期范围的数据。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多