您好,欢迎访问三七文档
VBA编程规则1、在自定义函数前加上Private关键字进行声明,该函数将不会出现在Excel的“粘贴函数”对话框中,但仍然可以在公式中运用它们。如果是专门为其他的VBA过程开发的自定义函数,则应该使用Private关键字进行声明。2、通常,用户自定义函数后,在“粘贴函数”对话框中将会出现在“用户定义”类别中。如果希望自定义函数出现在其它的类别中,必须编写和执行VBA代码为自定义函数指定类别。如运行Application.MacroOptionsMacro:=”SumPro”,Category:=4语句后,将自定义的SumPro函数指定给“统计函数”类别。3、与Sub过程不同,自定义函数Function过程并不出现在宏对话框中;当执行VBE编辑器中的“运行——运行子过程/用户窗体”命令时,如果光标位于某Function过程中,就不能获取宏对话框并从中选择要运行的宏。因此,在开发过程的时候,必须采取其它方式对自定义函数进行测试,可以设置调用该函数的过程;如果该函数是用在工作表公式中的,可以在工作表中输入简单的公式进行测试。4、如果在公式中使用了自定义函数,但返回值“VALUE!”,表明函数中有错误。错误的原因可能是代码中的逻辑错误、可能给函数传递了不正确的参数、可能执行了禁用的动作如试图更改单元格的格式。5、在自定义函数中使用参数时,可选参数必须在任何必需的参数之后。在参数名称前加上关键字Optional即可指定一个可选的参数。如果必须确定某可选的参数是否传递给了某函数,应将该参数声明为Variant类型,然后在过程代码中使用IsMissing函数来进行判断。要创建包含不定数量参数的自定义函数,使用一个数组作为最后一个(或惟一的)参数,并在数组前面加上关键字ParamArray。关键字ParamArray只能用于参数列表中的最后一个参数,其数据类型总是Variant并且是一个可选的参数。6、在自定义函数的程序代码中,应确保至少有一次把合适的值赋给了函数的名称。7、函数的名称必须遵循一定的规则(与变量名称相同)。最好不要采取与单元格地址相同的形式,并且还要避免使用与Excel内置函数名称相同的名称,否则,Excel会使用内置函数。8、如果想将Case关键字和相应的语句放在同一行上,在Case语名与相应语句间加上分隔符冒号(:)。9、通常情况下,VBA中对文本进行比较等操作是区分大小写的,若将语句OptionCompareText添加到模块的顶部,则程序执行时不会区分大小写。10、要处理单元格区域,在代码中不必先选项中该单元格区域。二1、编写自定义函数时,必须在VBA模块中,而不是在与ThisWorkbook、工作表和用户窗体关联的代码模块中。2、如果代码要选中单元格区域,则该区域所在的工作表必须是活动的,可以使用Activate方法来激活某工作表。3、尽量在VBA代码中使用命名的单元格区域。4、当通过快捷键选择单元格区域的时候,如果用宏录制器生成代码,则要认真检查代码中是否有对选中的实际单元格录制硬编码的引用。5、如果某个宏应用于当前单元格区域中的每个单元格,但用户可能会选中整行或整列,通常,我们不需要遍历选区中的每个单元格,那么这个宏应创建一个子选区,使其只由非空单元格组成。6、Excel允许同时有多个选区。7、若定义了单元格区域的名称,则在代码中使用定义的名称时,即使在名称单元格区域中添加或删除了行或列,也能确保正确使用该单元格区域。8、在VBA代码中使用注释,可以简要描述编写的每个过程的目的、对过程所做的任何修改、描述变量的目的等。通过使用VBE中“编辑”工具栏的“设置注释块/解除注释块”,也可以将VBA语句暂时设置成注释块,以便于调试。9、在工作表中编辑控件。在拖动控件的同时按Alt键,按钮将与工作表的网格线对齐;在拖动的同时按Shift键,按钮成正方形10、通常,将Application对象的EnableEvents属性设置为False即可禁止事件发生。但要注意的是,这个属性只对真正的Excel对象(如Workbooks,Worksheets,Charts等)的事件产生作用加入收藏网站地图网站搜索简繁默vba首页excelVBA视频教程excel精英论坛ExcelVBA学习资料ExcelVBA术语大全ExcelVBA基础教程VBA字符串处理专辑ExcelVBA图片处理VBA日期与时间处理VBA错误信息详解VBA控件教程ExcelVBA高级编程VBA代码注释集VisualBasic教程excel→ExcelVBA学习资料阅读新闻ForEach...Next语句的示例(VBA)[日期:2010-04-07]来源:作者:[字体:大中小]本示例使用ForEach...Next语句搜寻集合中的所有成员的Text属性,查找“Hello”字符串。示例中,MyObject是面向文本的对象,并且是MyCollection集合的成员,这两个名字只是为示范目的而使用的通用名称而已。DimFound,MyObject,MyCollectionFound=False'设置变量初始值。ForEachMyObjectInMyCollection'对每个成员作一次迭代。IfMyObject.Text=HelloThen'如果Text属性值等于“Hello”。Found=True'将变量Found的值设成True。ExitFor'退出循环。EndIfNext001。用命令按扭打印一个sheet1中B2:M30区域中的内容?我想在Sheet2中制件一个命令按扭,打印表Sheet1中的[B2:M30]区域中的内容?解答:可以将打印区域设为b2:m30,然后打印,如:sheets(sheet1).printarea=b2:m30sheets(sheet1).printout随手写的,你可以试试看。最简单的方法是:你先录制宏,在录制宏过程中,跑到页面设置里面,把打印范围设置到你想要的范围。然后退出,停止录制宏,你就可以得到一些代码!002。能否对一列中的文字统一去掉最后一个字?这些文字不统一,有些字数多,有些字数少。如何处理?我用{&-}不行解答:=REPLACE(A1,LEN(A1),1,)(在过渡列进行)003.能否根据单元格数值自动标记序号?各位大佬,一工作表有两列,“序号”及“金额”,能否将金额不等于0的行自动标上序号呢?如无现成的函数,应怎样设置?解答:DimxuhaoAsIntegerxuhao=1Range(b2).SelectDoWhileSelectionIfSelection0ThenActiveCell.Previous.Value=xuhaoxuhao=xuhao+1EndIfActiveCell.Offset(1,0).Range(a1).SelectLoop004.求教自定义函数查询了一些自定义函数的例子都是单变量的。自定义函数能否建立“(AsRange)AsInterger”的函数,应该可以的,请各位大师赐教!请以“∑x2”为例,万分感谢!(该用ForEach...Next,就是还不知道如何引用Range中的每个值,请高手指点。)解答:参数使用Range而函数值为Integer是可以的用foreachnext循环思路也是对的,应该这样作:dimrgasrangedimivalueasintegerforeachrgin参数区域ivalue=ivalue+rg.valuenext函数=ivalue大概意思如此,但没有加入防错处理,你自己先试试看,有问题在问。又问:试了一天,还是不行。PublicFunctionx2(rngAsRange)AsIntegerDimrngAsRangeDimivalueAsIntegerForEachrngInrng.Rangeivalue=ivalue+rng.value^2Nextx2=ivalueEndFunction还望您的帮助。解答:PublicFunctionSUMX2(rngAsRange)AsInteger'你的错误有几项:'1.函数名不能使用单元格位址的形式,否则在工作表中引用函数产生歧义,excel以为你引用单元格'2.参数名与内部变量名冲突,rng本来是定义参数,在过程中不应出现重名变量'3.rng已被定义为range对象变量,实际意义是一range引用,不能再用rng.Range引用,range的range属性是什么呢,没有吧'函数我已经给你改了,基本能用DimrgAsRangeDimivalueAsIntegerForEachrgInrngivalue=ivalue+rg.value^2NextSUMX2=ivalueEndFunction结果:调试成功!,非常感谢!005.判斷字符串的包含性用什么命令“abcdefg”是否包含“abc”?解答:IfVBA.InStr(1,abcdefg,abc)0ThenMsgBox包含006.利用背景实现套打的解决方案利用背景套打主要在于数据打印位置的确定,关键就是要使图片和实物之间的尺寸保持一致,这里我引入一个中间参照物—空白表(只有表格线的表)。具体操作以套打支票为例说明:(1)将支票扫描成图片。(2)打印一个空白表,使其与支票尺寸一致(需反复调整打印,也可行、列分别打印)。(3)用“画图”的缩放功能调整图片大小,导入excel作背景,并使其与空白表大小一致(亦需反复调整导入,每次均用原图缩放,再另存为一个文件)。(4)根据图片背景调整好单元格,填入数据后套打支票,效果是匹配度达99%。(5)由于每次都是用原图缩放,故可取得缩放比例作为参数,再套打其他表格时,即可直接依参数缩放图片。思路:因为空白表=支票,图片=空白表,所以图片=支票。该方案已证实可行。007.宏放在worksheet和sheet及模块中各有什么区别?解答:放在thisworkbook或sheet中的宏与模块中的宏的主要区别是book或sheet中的过程函数只能是对象所专有的,不能在对象之外的任何地方调用(很显然不能声明Public过程,否则编译报错),而模块中声明Public过程函数可以在任何地方使用。008.关于excel问题在excel中如何用公式实现单元格内容递增?如:AB12AB13AB14.......AB100条件是无法确定储存格中的内容的前面有多少个字符,也就是,可能是2个,也可能是3个,或者更多。解答:為什麼要用公式呢?如A1=AB12,只要你向下拉的複制就可以。公式可參考(條件是AB12不可以是AB02,處理0為首的數字有困難,亦不可以只有英文字)A1=AB12A2=LEFT(A1,LEN(A1)-SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{0,1,2,3,4,5,6,7,8,9},))))&RIGHT(A1,SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{0,1,2,3,4,5,6,7,8,9},))))+1(A1=AB12公式=LEN(SUBSTITUTE(A1,{0,1,2,3,4,5,6,7,8,9},))答案看到的是4,但其實它回傳一個數組{4,3,3,4,4,4,4,4,4,4}公式=LEN(A1)-LEN(SUBSTITUTE(A1,{0,1,2,3,4,5,6,7,8,9},))答案看到的是0,但其實它回傳一個數組{0,1,1,0,0,0,0,0,0,0}公式=SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{0,1,2,3,4,5,6,7,8,9},)))是將{0,1,1,0,0,0,0,0,0,0}加總=2)009.给数组公式、VBA爱好者泼点冷水。数组公式、VBA威力巨大,在某些情形下提高效率非常明显,但各有其弱点。数组公式在大数据的时候,运行速度慢得无法忍受。比如,我日常需要编制得几个报表,原始数据有4-8万行,20——30列,用数组根本无法操作。倒是利用数据透视表及其他一些组合功能,可谓神速。而VBA主要适用与日常比较固定的一些工作,对于一些临时性工作而
本文标题:VBA编程规则
链接地址:https://www.777doc.com/doc-5471426 .html