codecamp

分析及测试修改后的Excel宏代码步骤

分析宏代码

所有宏过程都以关键词“Sub”开始,以关键词“End Sub”结束。在关键词“Sub”之后是宏的真正的名字,然后紧跟着是一对括号。在关键词Sub 和End Sub之间是那些你每次运行宏代码时VB执行的语句。VB从上到下读取语句,忽略那些句前带单引号的语句(参见上节关于注释的内容),读到EndSub时停止。请注意,录制的宏代码里包含许多停顿(译者:英文模式下的句号)。每行代码中都有停顿,用来连接VBA语言中不同的要素。如何阅读这种语言的用法呢?要从最后一个停顿的右边向左读。看看WhatsInACell里的一些语句:


Range("A1:A3").Select


选择A1到A3单元格


Selection.EntireRow.Insert



往选中的区域中插入行。因为前面你选中的是三个单元格(译者:应该说是占据了三行的单元格),VB将插入三行。


ActiveCell.FormulaR1C1 = "Text"



往当前单元格里输入“Text”。因为,之前的代码是Range("B1").Select,选择单元格B1,B1是当前激活的单元格,所有VB往B1单元格里面输入文本。


With Selection.Interior


          .ColorIndex = 3


          

.Pattern = xlSolid


          

.PatternColorIndex = xlAutomatic


End With


这是一段特别的代码块,解释如下:给当前选中的单元格设置单元格填充色为红色(ColorIndex=3),设置填充模式为实心(xlSolid),并且给当前单元格明确为默认的填充模式(xlAutomatic)。



这个代码块以关键词With开始,EndWith结束,它将加速宏代码的执行。宏代码知道走捷径,而不会每次都重复下面的说明:


Selection.Interior.ColorIndex = 3


Selection.Interior.Pattern = xlSolid


Selection.Interior.PatternColorIndex = xlAutomatic



在关键词With后面紧跟重复的Selection.Interior,再以End With结尾。


 

清除宏代码

你已经逐行解析了你宏代码,你会发现Excel录制了许多你并不想要包含进去的信息。例如,在选中了文本单元格后,除了设置字体为粗体和颜色为紫色之外,Excel 还录制了其它在字体页的选项——字体名称,字体大小,删除线,上标,下标,阴影和下划线。请看下列代码片断:


With Selection.Font


          .Name = "Arial"


          

.FontStyle = "Bold"


          

.Size = 10


          

.Strikethrough = False


          

.Superscript = False


          

.Subscript = False


          

.OutlineFont = False


          

.Shadow = False


          

.Underline = xlUnderlineStyleNone


          

.ColorIndex = 13


End With



如果你使用了对话框,Excel总会录制所有的设定。这些多余的代码使得你的宏代码冗长而难以理解。因此,你完成录制宏后,最好检查一遍你录制的代码并删除不必要的行。


1、在下面的代码中,删除带删除线的行:


With Selection.Font


          

.Name = "Arial"


          

.FontStyle = "Bold"


          

.Size = 10


          

.Strikethrough = False


          

.Superscript = False


          

.Subscript = False


          

.OutlineFont = False


          

.Shadow = False


          

.Underline = xlUnderlineStyleNone


          

.ColorIndex = 13


End With


清除后,在关键词With和End With之间只剩下了两句代码,这些才是你在录制宏的时候真正做的设置:



With Selection.Font

          

.FontStyle = "Bold"


          

.ColorIndex = 13


End With


2、找到设置数字单元格格式的代码,依照下面的例子修改代码:


' Find and format cells containing numbers


With Selection


          

.SpecialCells(xlCellTypeConstants, 1).Select


          

.Font.ColorIndex = 11 ' Sets the font color to Violet


End With


Range("C6").Select


3、找到设置公式单元格格式的代码,依照下面的例子修改代码:


' Find and format cells containing formulas


Selection.SpecialCells(xlCellTypeFormulas, 23).Select


With Selection.Font


          

.FontStyle = "Bold"


          

.ColorIndex = 3


End With


4、找到下述两行代码:


Range("A1:A3").Select


Selection.EntireRow.Insert


5、用下面的一句代码取代上面的两句代码:


Range("A1:A3").EntireRow.Insert


注意,Excel使用了R1C1形式来设置选中单元格个公式:


ActiveCell.FormulaR1C1 = "Text"


ActiveCell.FormulaR1C1 = "Numbers"


ActiveCell.FormulaR1C1 = "Formulas"


宏录制器使用了一次“ActiveCell”和一次“Selection”来选择当前单元格。这两个词都称为属性。你将在第二章里学习属性。当仅有一个单元格被选中时,你可以随意使用“ActiveCell”或者“Selection”。




测试修改好的宏

当你修改宏的时候,很可能会带入一些错误。例如,你可能会删除一行重要的代码,或者可能不注意清除或忽略了一个逗点(停顿)。为了确保你的宏在你修改之后还能正确地工作,你必须运行它。在VBE窗口,将光标放在宏代码WhatsInACell的任意行,选择“运行”-“运行模块/窗体”



如果你在修改代码的时候,没有带入任何问题,那么宏将顺利运行,而不会有任何报错。你需要切换到Excel界面取看你的宏运行的结果。你可以点击任务栏,或者按Alt+F11回到Excel界面。


如果宏在运行的过程中遇到错误,你将会看到一个对话框显示发现的错误类型。在你运行宏命令之前,你必须确保你的宏可以在当前激活的工作表里面运行。例如,你当前电脑上激活的时一个空的Excel工作表,你试图运行WhatsInACell,这时你将看到一个错误信息:“运行时间错误‘1004’-找不到单元格”。点击“结束”按钮,在你重新运行宏之前,确保选择了正确的工作表。


如果选择的工作表只含有文本,你在运行WhatsInACell的时候,VB试图选择含有数字的单元格时会遇到同样的“找不到单元格”的错误。


如果你忽略了WithSelection.Font中的逗点,VB会出现“运行时间错误‘424’-需要对象”的信息。点击信息框上的“调试”按钮,你将进到代码窗口。同时,VB会进入“中断”模式,并且将有问题的行用黄色突出出来。在你更正代码后,VB可能会弹出信息:“这个操作将会重置你的工程,继续?”点击确定。尽管你可以在中断模式修改代码,但是,有些修改会终止宏的继续执行。更正宏代码后,重新运行它,也许你会需要解决更多的错误,之后才能顺利地运行它。


修改Excel宏代码及添加注释的步骤
完善Excel宏代码的步骤及技巧
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }