问题1:
VBA能开发EXE格式的安装软件吗?
答:不能,但是可以把VBA代码复制到VB中,封装成DLL文件再配合WINRAR或者Inno Setup等软件加工成EXE安装程序。
问题2:代码中所用的变量是否必须声明其数据类型?
答:不声明变量的数据类型也可使用变量。
不过在某些情况下不声明变量以及不指定数据类型将造成程序运行速度变慢,甚至可能得到错误的运算结果。建议所用任意变量前都正确地指定变量的数据类型。
问题3:
Dim 甲,乙,丙 as byte
这句代码能声明三个byte类型的变量吗?
答:变量丙是byte类型,而甲和乙则是默认的Variant型。如果要声明三个byte类型的变量需采用以下代码:
Dim 甲 as byte,乙 as byte,丙 as byte
问题4:
为什么【Visual Basic】和【录制宏】菜单呈灰色禁用状态?
答:安装了绿色版Office,该版本删除了VBA功能。可以重装完整版Office,以补充VBA模块。
问题5:
为什么按【F8】键调试代码会失败,但是单击菜单【逐语句】却能进入调试状态?
答:最可能的原因是快捷键【F8】被别的软件占用。“有道”翻译软件在默认设置下就会占用该键。
问题6:
打开VBE界面,看不到工程资源管理器,如何调出来该对话框?
答:单击菜单【视图】\【工程资源管理器】即可调用,或者使用快捷键【Ctrl+r】也行。
问题7:
Dim FileSys As FileSystemObject
为什么运行此声明语句提示“用户定义类型未定义”?
答:手工引用“scrrun.dll”文件后再执行此语句即可。如果电脑中不存在该文件可以在同事电脑中复制过来置于system32目录中,然后使用以下代码注册,注册后才可以添加引用:
regsvr32 %windir%\system32\scrrun.dll
问题8:
如何实现FSO对象的后期绑定?
答:在“引用”对话框中引用DLL文件属于前期绑定,使用CreateObject创建对象实例则属于后期绑定。代码如下:
CreateObject("Scripting.FileSystemObject")
问题9:
如何获取当前用户的【发送到】文件夹?
答:用VBA调用脚本语言即可,代码如下:
CreateObject("WScript.Shell").SpecialFolders("SendTo")
问题10:
如何获取收藏夹路径?
答:
CreateObject("WScript.Shell").SpecialFolders("Favorites")
问题11:
为什么VBE中的菜单【视图】→【工具箱】是灰色的?
答:插入一个窗体且选中窗体后才会显示工具箱,所以未显示工具箱时需要执行两个步骤:先插入一个窗体;然后选择窗体。
问题12:
如何对VBA代码加密?
答:加密的方式有很多,最简单的方法是VBA自带的保护工程,操作方法为:
在VBE界面中单击菜单【工具】→【VBAProjectn属性】→【保护】,然后录入密码,且勾选“查看时锁定工程”。
问题13:
为什么有的属性在常数列表中看不到?
答:VBA具有部分隐藏属性,需要进入对象浏览器后单击右键菜单【显示隐含成员】才可以显示。
问题14:
如何查询Excel 2010相对2007有哪些新增内容?
答:开启Excel,进入VBE界面后按下F1键,然后选择窗口中的“Excel 2010 开发人员参考”→“新增内容”。
问题15:
工作簿事件相关的代码是否Excel 2003、2007和2010通用?
答:Excel 2003和2007可以通用,但Excel 2010新增了10多个新的事件,这些事件不支持Excel 2003和2007。
问题16:
是否只用低版本的方法、事件、属性就可以确保代码通用?
答:虽然大部分情况下确实如此,但鉴于有些属性或者方法在高版本中被删除了,所以不使用新增功能也无法确保代码总是通用的。例如FileSearch属性。
问题17:
Excel 2010相对2007在VBA方面的变化大吗?
答:不大,所有语法不变,只是新增了一些事件、对象、属性和方法。
问题18:
VBA可以实现不打开工作簿而取其中的值吗?
答:可以,本书中有相关的自定义函数实现。但是打开工作簿后再取值更灵活,更方便。
问题19:
Excel中的所有操作都可以录制吗?
答:90%以上都可以,少部分不支持录制宏。例如按格式查找、屏幕截图、修改批注的边框尺寸等等。
问题20:
单元格的颜色属性Color和ColorIndex是一样的吗?
答:在Excel 2010中,前者可以产生43亿种32位颜色 ,而后者只能产生56种索引色,前者比后者更强大,但后者比前者兼容性好。
问题21:
相同公式,Excel 2010会不会比2003中计算更快?
答:Excel 2010支持多线程计算,如果您使用多核CPU的话,一定比Excel 2003的运算速度快。
问题22:
如何使用VBA判断单元格是否含有超链接?
答:根据单元格的链接数量来判断,数量为0表示无超链接,代码如下:
MsgBox IIf(Range("A1").Hyperlinks.Count > 0, "有", "没有")
问题23:
如何取得一个区域内的已用区域地址?
答:利用Intersect取选区和已用区域的交集即可,代码如下:
on error resume next
Intersect(ActiveSheet.UsedRange, Selection).Address
问题24:
按地址传递(byref)和按值传递(byval)区别是什么?
答:按值传递时,参数的值不产生变化;按地址传递时,该参数值可以修改。
问题25:
如何用VBA打开与陌生人的QQ聊天对话框?
答:通过IE浏览器可以直接开启与非好友聊天的对话框,所以用Shell调用IE地址即可。代码如下:
Shell "explorer.exe ""http://wpa.qq.com/msgrd?v=1&Uin=670218239%site=A&menu=yes"""
问题26:
如何判断当前操作系统是否为繁体中文?
答:
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long '调用API函数
MsgBox (GetSystemDefaultLCID = &H404) '值为&H404表示繁体中文系统
问题27:
VBA可以禁止Excel内部的保存或者另存功能吗?
答:可以做到,不过禁用宏后就可以继续保存或者另存了。
问题28:
可以实现提取姓名的汉语拼音首字母吗?
答:可以实现,但不确保准确度,因为存在很多同音字。所以站在精确度的方位理解,只能说无法实现。
问题29:
能使自动替换只对一个区域生效吗?
答:内置的自动替换功能对所有工作表的所有区域都生效,无法改造,但可以通过工作表事件实现某个区域的自定义替换。
问题30:
如何获取application.inputbox所引用的单元格所在工作表名称?
答:
On error resume next
MsgBox Application.InputBox("请选择单元格", "SheetName", , , , , , 8).Parent.Name
问题31:
Exit Sub等于end吗?
答:有时相等,有时不等。执行end时会释放所有变量的值,Exit Sub仅仅释放私有变量的值。
另外,在VBA中可以使用Exit Sub等于end,但是用VB封装VBA代码时不能使用End,VB不支持End。
问题32:
利用Public声明的变量就是全局变量吗?所有模块都可以引用?
答:不一定,必须在标准模块中声明,且置于所有过程之上。
问题33:
如何用VBA实现缩小功能区?
答:VBA并不提供相关的方法或者属性,但是Excel允许使用【Ctrl+F1】组合键缩小功能区,所以利用SendKeys发送键盘命令即可。
Application.SendKeys "^{f1}"
问题34:
用cells.count计算单元格数量会出错,如何修改代码呢?
答:此代码只在xlsx和xlsm格式的文件中会出错,兼容模式下不会出错。
利用转换函数转换被乘数的类型即可:MsgBox CDbl(Rows.Count) * Columns.Count
当然,也可以采用新的属性或者单元格的数量:Cells.CountLarge
问题35:
Option Private Module是做什么的?
答:限制本模块中的代码不能被其它模块调用,即把过程强制转换为私有。
问题36:
Function过程的代码如何逐语句调试?
答:通过Sub过程调用该Function过程,然后对Sub过程逐语句调试。也可以将Funtion改装成无参数的SUB过程,调试完成后再还原为Function过程。如果Function过程有参数,那么改装成Sub过程时使用变量替换参数即可。
问题37:
录制在单元格输入公式的宏时,产生的是R1C1样式的公式,如何转换成A1引用样式?
答:
MsgBox Application.ConvertFormula("=RC[1]*RC[2]", xlR1C1, xlA1)
问题38:
AfterSave事件的参数Success是什么意思?
答:代表是否保存成功。如果在保存对话框中点“取消”则返回False。
问题39:
如何判断“Visual Basic for Applicaton”是否拼写正确?
答:CheckSpelling方法用于拼写检查,代码如下:
MsgBox Application.CheckSpelling("Visual Basic for Applicaton")
问题40:
如何实现“工程不可查看”?
答:将工作簿共享即可。
问题41:
chr(10)和chr(13)有什么分别?
答:前者是回车符,后者是换行符,显示在msgbox对话框中时效果一样,但若显示在单元格中则不同,后者没有换行效果。
问题42:
VBA可以打开资管源管理器中的文件夹吗?
答:
Shell "explorer.exe d:\123", vbMaximizedFocus
其中参数vbMaximizedFocus表示打开文件夹后窗口最大化。
问题43:
如何删除选区中的所有空格?
答:
Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart
注意LookAt参数要赋值为xlPart,表示部分匹配。
问题44:
VBA可以读写注册表中任意键值吗?
答:VBA自带的Getsetting和Savesetting只能读写指定路径的键值,但VBA调用脚本语言来读写注册表就可以操作任意键值。
问题45:
ontime如何调用具有参数的过程?例如
Sub a(b)
MsgBox b
End Sub
答:将过程名与参数一起作为OnTime的参数,过程的参数要加引号,代码如下:
Application.OnTime Now + TimeValue("0:0:1"), "'a ""你好""'"
问题46:
可以禁止用户插入新表吗?
答:保护工作簿可以实现,在Workbook_NewSheet事件中自动删除工作表也可以实现。
问题47:
如何中途阻止运行过程?
答:使用快捷键 【Ctrl+Break】或者按住【ESC】键不松开。
问题48:
可以屏弊内置的快捷键吗?
答:用OnKey即可,例如禁用【Ctrl+c】用以下代码:
Application.OnKey "^c", ""
问题49:
Range.text与Range.value有何区别?
答:前者表示单元格显示的文本,后者为单元格中真正的值,自定义数字格式后两者会有较大分别。
问题50:
如何一键删除工作表中所有图形对象?
答:
ActiveSheet.DrawingObjects.Delete
此代码可以录制宏产生。
问题51:
VBA可以修改系统日期吗?
答:直接对Date赋值即可,代码如下:
Date = "2011-4-30"
问题52:
如何将工作簿另存到D盘中,且工作簿名由A1单元格的值决定。
答:使用Workbook.SaveAs方法。
ActiveWorkbook.SaveAs "d:\" & [a1].Value, xlWorkbookDefault
问题53:
如何禁用单元格右键菜单?
答:将Cancel 参数赋值为True即可。
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Cancel = True
End Sub
问题54:
可以禁止双击修改单元格吗?
答:将Cancel 参数赋值为True即可。
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Cancel = True
End Sub
问题55:
如何一次性清除工作表中所有公式结果为错误值的单元格?
答:
On Error Resume Next
Cells.SpecialCells(xlCellTypeFormulas, 16) = ""
问题56:
Evaluate方法可以将任意表达式进行转换计算吗?
答:不行,它有参数长度不超过256的限制。
问题57:
可以为自定义函数添加每一个参数的说明吗?
中:Excel 2010可以,通过MacroOptions的最后一个参数实现。Excel 2003和2007的MacroOptions只能添加函数说明,不能对参数添加说明。
问题58:
如何生成包括第X页 共Y页的页眉?
答:在PageSetup对象中使用“第&P页 共&N页”即可,P代表当前页,N代码总数。
ActiveSheet.PageSetup.LeftHeader = "第&P页 共&N页"
问题59:
如何判断当前工作表处于筛选状态?
答:
MsgBox ActiveSheet.FilterMode
如果结果为True则表示处于筛选状态。
问题60:
可以用一句代码实现合并A1:A10的值吗?
答:Join能将数组的值合并成一个字符串,但不支持区域作参数,所以使用工作表函数Transpose将参数转换成数组后再配合Join即可实现:
MsgBox Join(WorksheetFunction.Transpose([a1:a10]), "")
问题61:
如何一键删除超链接?
答:
ActiveSheet.Hyperlinks.Delete
问题62:
可以用一句代码实现对二维数组变量赋值吗?
答:公式中的{}可以创建二维数组,添加[]后即可使其在VBA中使用。
Arr = [{1,2,3;4,5,6}]
问题63:
如何计算“D:\工作”文件夹的大小?
VBA的FileLen只能计算文件大小,使用FSO对象的GetFolder才能获取文件夹的信息,代码如下:
CreateObject("scripting.filesystemobject").GetFolder("D:\工作").Size / 1024 & "KB"
问题64:
不用循环能计算1到100之间自然数之和吗?
答:直接调用数组公式即可,代码如下:
MsgBox [sum(row(1:100))]
问题65:
可以一句代码实现向下填充所有空白单元格吗?
答:
On error resume next '防止不存在空白单元格时出错
ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
问题66:
什么是溢出错误?
答:对变量赋值时,值大于它的有效范围,例如对Byte型的变量赋值300。
问题67:
下标越界是什么意思?
答:参数值超过了参数的上下限。例如工作表数量为3时,用代码访问第4个工作表,或者访问的对象不存在(例如写错了工作表名称、工作簿名称、图片名称等等)。
问题68:
如何禁止合并单元格和删除工作表时弹出提示?
答:在合并单元格或者删除工作表的代码前加“Application.DisplayAlerts = False”;在其后加“Application.DisplayAlerts = True”
问题69:
如何禁止用户中断程序的运行过程?
答:
Application.EnableCancelKey = xlDisabled
问题70:
可以在较单词时不区分大小写吗?
答:在模块的顶部写入以下代码:
Option Compare Text
问题71:
可以让数组的默认下标为1吗?
答:在模块的顶部写入以下代码:
Option Base 1
问题72:
可以用VBA打开控制面板吗?
答:
a = Shell("Control.exe", vbMaximezedFocus)
或者
CreateObject("wscript.shell").Run "Control.exe", 3
问题73:
如何取得“d:\123.xlsm”的创建时间?
答:
FileDateTime只能获取文件最后一次修改的时间,获取创建时间要用FSO对象的DateCreated属性实现。
MsgBox CreateObject("Scripting.FileSystemObject").GetFile("d:\123.xlsm").DateCreated
问题74:
动态变量和静态变量的区别何在?
答:动态变量在结束过程时会释放变量值,静态变量在关闭工作簿时或者使用End时才释放变量值。
问题75:
如何防止程序因出错而弹出错误对话框?
答:使用防错语句:
On error resume next
问题76:
批量删除或者插入行时,如何防止屏幕闪动?
答:使用“Application.ScreenUpdating = False”
但在程序结束时需要恢复此设置。
问题77:
运行窗体时可以只显示窗体,看不到Excel界面吗?
答:在运行窗体前加入以下代码:
Application.Visible = False
再将“Application.Visible = True”代码放在窗体的关闭事件中,使Excel界面还原为显示状态。
问题78:
如果隐藏所有批注,红色箭头也能一起隐藏吗?
答:
Application.DisplayCommentIndicator = xlNoIndicator
问题79:
在对话框中录入字符串时,可以显示为星号吗?
答:使用窗体中的文字框时可以。将其PasswordChar属性设置为True即可,inputbox对话框不可以,除非调用API函数产生一个inputbox类似的对话框。
问题80:
如何取得Excel的安装路径?
答:
MsgBox Application.Path
问题81:
如何打开Windows自带的计算器?
答:
Shell "CALC", vbMaximizedFocus
或者
CreateObject("wscript.shell").Run "CALC", 3
问题82:
如何获取活动单元格的批注文本?
答:
ActiveCell.Comment.Text
如果活动单元格没有批注则会出错,所以需要配合防错语句使用。
问题83:
如何在状态栏显示今天星期几?
答:
Application.StatusBar = Format(Date, "AAAA")
其中AAAA表示中文的星期,如果需要英文的星期需要改用“DDDD”。
问题84:
Worksheet_Change事件中写入“Target = Evaluate(Target.Value)”用于转换表达式,为什么有时会出错?
答:Target代表当前正在录入值的所有单元格,如果用户在一个区域中录入就会出错,可以配合循环语句使用,逐一进行转换。当然Change事件还需要添加防止递归的代码。
还有一种情况也会出错:单元格的字符长度超过256。
问题85:
什么是递归?
答:程序调用自身反复运算,类似于工作表中公式的迭代计算。
问题86:
在SheetChange事件中,如何防止溢出堆栈空间?
答:
Application.EnableEvents = False
但在过程结束时需要还原设置。
问题87:
如何取得已用区域最后一行的行号?
答:
ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
但是已用区域的最后一行可能是空白行。
问题88:
当前区域和已用区域如何区分?
答:当前区域指以空行与空列的组合为边界的包含活动单元格的区域,而已用区域是工作表中所使用的区域,它与当前区域有时重合,有时不重合。
问题89:
什么是数组区域?
答:区域数组公式所占用的区域。录入区域数组公式时,需要选择一个区域,然后录入公式并再按【Ctrl+Shift+Enter】组合键结束。
问题90:
Range.End(3)中的3代表什么?
答:xlUp常量,表示向上。
问题91:
如何获取第一行最后一个非空单元格?
答:
Cells(1, Columns.Count).End(xlToLeft)
问题92:
如何判断活动工作表是否为空表?
答:IsEmpty能判断对象是否已经初始化。如果返回值为True则表示当前表是空表,代码如下:
MsgBox IIf(IsEmpty(ActiveSheet.UsedRange), "空表", "非空表")
问题93:
为什么使用Application.Inputbox后返回值为是Range型?
答:最后一个参数未使用8。
问题94:
自定义函数只能返回值,不能改变单元格的值吗?
答:当然不是,既可以改变单元格的值,也可以删除单元格的值,还可以改变单元格的批注。
使用Replace可以修改任意单元格的值。
问题95:
Format函数和工作表函数TEXT一样的功能吗?
答:大多数功能一样,少数不同。TEXT的功能更强大,工作中可以调用TEXT代替Format使用。
问题96:
VBA能定制Excel启动画面吗?
答:可以增加一个,但是不能编辑原有的启动画面,也不可以关闭该启动画面。
问题97:
如何实现11:00时提示开会?
答:
Sub test()
Application.OnTime TimeValue("11:00:00"), , "开会"
End Sub
Sub 开会()
MsgBox "开会"
End Sub
问题98:
如何为“生成批注”过程指定一个快捷键?
答:
Application.OnKey "^q", "生成批注"
以上代码表示按下【Ctrl+q】时执行过程“生成批注”。记住此时要区分大小写。
问题99:
可以让窗体中的文字框换行吗?
答:将文字框控件的MultiLine属性设置True即可。
问题100:
能否判断单元格的值和其显示的值是否一致?
答:有可能单元格中显示2,但其值本身是1。利用以下代码可以判断:
MsgBox ActiveCell.Text = ActiveCell.Value
问题101:
如何判断活动单元格是否存在条件格式?
答:计算FormatConditions的数量,大于0则表示有条件格式,代码如下:
MsgBox ActiveCell.FormatConditions.Count > 0
问题102:
如何用一句代码删除A列的重复值?
答:
Columns("A:A").RemoveDuplicates Columns:=1, Header:=xlNo
问题103:
可以使自己的SUB过程不出现在宏对话框中吗?
答:通过Private将过程声明为私有过程即可。
问题104:
如何计算活动工作表能打印多少页?
答:
ActiveWindow.View = xlPageBreakPreview
MsgBox ExecuteExcel4Macro("get.document(50)")
问题105:
可以每次打印前将已用区域更新为打印区域吗?
答:将已用区域的地址赋值给PrintArea即可,代码如下:
ActiveSheet.PageSetup.PrintArea = ActiveSheet.UsedRange.Address
问题106:
名称也分作用域吗?
答:定义的名称包括工作表级和工作簿级。工作表级名称的名字中会带有工作表名称,属于私有名称;而工作簿级名称为公有名称,通过Activeworkbook.Names调用即可。
问题107:
为什么代码前面有的空几格,有些不空?是必须的吗?有何规则?
答:在一行代码前添加空格是为了美观,以及便于查看代码的结构。这不是必须的,但可增加方便性。通常由各语句的层级结构决定缩进几个空格。
问题108:
能否多句代码写在一行中?
答:可以,利用冒号分隔即可。
问题109:
多句代码写在一行和写在多行是否在执行过程中没有任何分别?
答:大多数时间没有分别,但在某些条件语句下两种写法会有所差异,本书中有介绍。
问题110:
一句较长的代码如何分多行书写?
答:在需要断开的地方添加“ _”即可,注意第一个字符是空格。
不能将一个单词拆开,例如把“Range”5个字母写在两行中会导致代码执行出错。
问题111:
有些代码中有“VBA.”,这是什么意思?必须的吗?
答:编写代码时,使用“VBA.”是为了调用VBA内部的属性、方法或者函数,便于从中选择需要的单词。
这不是必要的,但会增加便利性。
问题112:
某些代码前有一个撇号,那代表什么?
答:表示将代码转换成注释,注释是不执行的,可以在任何需要的时候将它还原成可执行的代码,删除撇号即可。
也可以使用Rem代替撇号。
问题113:
VBA如何调用DOS命令?
答:
Shell Environ$("comspec") & " /c """ & 您的代码 & """"
例如:
Shell Environ$("comspec") & " /c """ & "md D:\12345" & """"
以上代码表示用DOS命令新建一个文件夹12345,位于D盘。
问题114:
用代码删除文件是否不经过回收站?
答:VBA中的Kill和DOS下的delete删除文件都不经过回收站。
不过如果调用API函数是可以让它从回收站还原的。
问题115:
如何在指定的行插入一个分页符?
答:
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=Range("C10")
问题116:
常量既然在程序运行中不产生变化,为什么不直接使用值本身而要用常量呢?
答:使用常量可以简化输入,而且如果需要修改值时,仅需对常量的赋值作修改即可,不需要逐一修改所有代码中出现的值。
问题117:
为什么部分函数无法通过worksheetfunction调用?
答:通常是因为VBA有内置的具有相同功能的函数可以替代,这种情况下用VBA的函数即可。
问题118:
可以在活动单元格的批注中插入一行,显示当前日期吗?
答:使用以下代码即可,不要要确保单元格已经有批注。
ActiveCell.Comment.Text Text:=ActiveCell.Comment.Text & Date
问题119:
如何判断一个图片是否在D1单元格之上?
答:
MsgBox Not Intersect(Range(Sheet1.Shapes(1).TopLeftCell, Sheet1.Shapes(1).BottomRightCell), [d1]) Is Nothing
问题120:
“信任对VBA工程对象模型的访问”复选框项有何用?
答:通过它可以控制VBA代码对VBE工程的访问权限,在未勾选的状态下,所有VBE相关的代码都禁止执行。例如:
MsgBox Application.VBE.Version
只有勾选“信任对VBA工程对象模型的访问”后才能执行以下代码。
问题121:
如何计算带有“[备注]”的表达式?例如“1200*8[8台诺基亚手机]+3400*5[iphone4]”。
答:将[替换成“*ISTEXT(""["”,将]替换成“]"")”,然后使用Evaluate计算即可。
MsgBox Evaluate(Replace(Replace("1200*8[8台诺基亚手机]+3400*5[iphone4]", "[", "*ISTEXT(""["), "]", "]"")"))
问题122:
如何获取某个盘符的序列号?例如C盘。
答:
CreateObject("Scripting.FileSystemObject").GetDrive("C:").SerialNumber
问题123:
如何获取硬盘的物理序列号?
答:
MsgBox GetObject("winmgmts:").InstancesOf("Win32_PhysicalMedia")("Win32_PhysicalMedia.Tag=""\\\\.\\PHYSICALDRIVE0""").serialnumber
问题124:
VBA中的IIF和IF...Then...Else有何分别?
答:IIF是函数,用于返回值;IF...Then...Else是条件语句,可以在指定条件下执行任何语句,比IIF更强大,不能返回值。
问题125:
IIF是否和工作表函数IF用法一致?
答:语法基础相同,但是IIF有一个BUG:不管第一参数是否为True,它都会计算第二和第三参数。当条件为True但第三参数是错误值时,IIF语句也会出错。
问题126:
单元格右键菜单被禁用时如何恢复?
答:执行以下两句代码即可:
Application.CommandBars("cell").Enabled = True
Application.CommandBars("cell").Reset
问题127:
有什么方法或者属性、函数能检查是否存在某个名称的工作表?
答:没有现成的,可以自己定义一个函数实现。在函数中引用该名称的工作表,然看判断代码是否出错,如果引用出错则表示不存在。
问题128:
如何将一个区域的公式转换成值?
答:
Range("A1:B10") = Range("A1:B10").Value
问题129:
批注框的大小可以调整为自动适应文字的多少吗?
答:
ActiveCell.Comment.Shape.TextFrame.AutoSize = True
问题130:
如何一次性将工作表中所有公式所在单元格标示为黄色?
答:
On error resume next '避免无公式时代码出错
cells.SpecialCells(xlCellTypeFormulas, 23).Interior.Color = 65535
问题131:
如何启动发送邮件的窗口?且向指定用户名发送。
答:
ActiveWorkbook.FollowHyperlink "mailto:excelbbx@163.com"
问题132:
如何禁用窗体右上角的关闭按钮?
答:在窗体的QueryClose事件中写入以下代码:
If CloseMode <> 1 Then Cancel = True
问题133:
如何开启指定文件夹?
答:
ActiveWorkbook.FollowHyperlink Address:="D:\生产表", NewWindow:=True
或者:
shell "explorer.exe D:\生产表",3
问题134:
Alt+F11快捷键被禁用了,如何修复?
答:
Application.OnKey "%{F11}"
问题135:
可以把本工作簿的关闭时间写入注册表吗?
答:
SaveSetting方法能将任意文本存入注册表。
SaveSetting "关闭时间", "Close", "Time", Now
问题136:
如何删除“D:\生产表”?
答:
CreateObject("Scripting.FileSystemObject").DeleteFolder "d:\生产表"
问题137:
如何调用屏保锁定屏幕?
答:
Shell Environ("Systemroot") & "\system32\rundll32.exe user32.dll,LockWorkStation"
问题138:
可以实现暂停0.5秒钟吗?
答:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sleep 500 '500代表0.5秒钟
问题139:
可以一键删除所有“0”所在行吗?
答:将0值替换成计算结果为错误值的公式,然后定位错误公式并整行删除。代码如下:
On error resume next '避免无0值时代码出错
Cells.Replace What:="0", Replacement:="#DIV/0!", LookAt:=xlWhole, SearchOrder:=xlByRows
Cells.SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete
问题140:
如何实现用一句代码将Sheet1的所有数据复制到“总表”中?
答:
Sheet1.UsedRange.Copy Sheets("总表").Cells(Rows.Count, 1).End(3).Offset(1, 0)
问题141:
如何实现将活动单元格最后一个字符设置为上标?
答:需要用到Characters,代码如下:
ActiveCell.Characters(Start:=Len(ActiveCell.Value), Length:=1).Font.Superscript = True
问题142:
可以实现锁定所有公式所在单元格从而防止误修改吗?
答:
Sub test()
Cells.Locked = True '锁定所有单元格
Cells.SpecialCells(xlCellTypeConstants, 23).Locked = False '将公式以外的非空单元格取消锁定
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '保护工作表
End Sub
问题143:
如何取消工作表中所有单元格的隐藏属性?
答:
Cells.EntireColumn.Hidden = False '显示所有列
Cells.EntireRow.Hidden = False '显示所有行
问题144:
如何实现隐藏所有零值?
答:
ActiveWindow.DisplayZeros = False
问题145:
窗体中有两个文本框,能实现文本框中录入数据后敲回车键时执行命令,而不是通过单击按钮来执行命令吗?
答:将需要执行的命令写入TextBox1_Exit事件中即可。
TextBox1_Exit事件表示一个控件即将把焦点转移到另一个控件时触发的事件,当在第一个文字框中按下回车键时会自动转移焦点到另一个文字框。
问题146:
窗体可以永远显示最上层吗?
答:VBA无法做到,窗体本身没有这个属性。不过VBA调用API函数是可以实现的。
问题147:
如何删除d盘中所有Excel文件?
答:
Shell Environ$("comspec") & " /c """ & "del D:\*.xls*" & """"
请小心测试,使用新工作簿或不重要的表格测试代码。
如果需要将子目录中的工作簿一起删除可以对del命令加一个参数“-s”
问题148:
如何实现在状态栏显示动态时间?要求时间可以实时更新。
答:
sub auto_open()
Application.StatusBar = "现在时刻: " & Time
Application.OnTime Now + TimeValue("0:0:1"), "auto_open"
end sub
问题149:
如何实现将选区的数字转换成以“万元”为单位?
答:
Selection.NumberFormatLocal = "#"".""#,万元"
问题150:
如何一键添加已用区域的边框?
答:
ActiveSheet.UsedRange.Borders.LineStyle = xlContinuous
其中xlContinuous表示细边框。
问题151:
如何获取工作簿最后一次的保存时间?
答:
MsgBox ActiveWorkbook.BuiltinDocumentProperties("Last Save Time").Value
问题152:
如何取消所有加载宏?
答:将加载宏文件的Installed属性设置为False即可。
Sub test()
For Each A In Application.AddIns
A.Installed = False
Next
End Sub
问题153:
可以列出工作表能用的所有字体名称吗?
答:字体位于格式工具栏ID为1728的控件中,通过循环语速句读出其子元素即可。
Sub test()
On Error Resume Next
For i = 1 To CommandBars("Formatting").FindControl(ID:=1728).ListCount
Cells(i, 1) = CommandBars("Formatting").FindControl(ID:=1728).List(i)
Next
End Sub
问题154:
如何计算开机到现在用了多少分钟?
答:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub 已用时间()
MsgBox "您的电脑已使用" & Round(GetTickCount / 1000 / 60, 0) & "分钟"
End sub
问题155:
如何实现关闭Excel程序但不弹出保存提示?
答:
Application.Quit
ActiveWorkbook.Close False
问题156:
VBA可以关闭计算机吗?
答:
SHELL "SHUTDOWN.EXE /F /S /T 0"
其中参数0表示立即关闭,采用数字2则表示等两秒钟关闭。
问题157:
如何取消通过Ontime创建的计划任务?
答:对OnTime的Schedule参数赋值为False即可,不过还要注意时间参数EarliestTime与设置时使用的时间保持一致。
问题158:
可以通过“Esc”键关闭窗体吗?
答:在窗体的QueryClose事件中写入以下代码:
If KeyCode = 27 Then Me.Hide
问题159:
如何让窗体显示在Excel窗口的正中间?
答:
Private Sub UserForm_Activate()
Me.Left = (Application.Width - Me.Width) / 2
Me.Top = (Application.Height - Me.Height) / 2
End Sub
问题160:
如何选择已用区域的奇数行?用两句代码实现。
答:
Cells(1, Columns.Count).Resize(ActiveSheet.UsedRange.Rows.Count) = "=if(mod(row(),2),1,"""")"
Columns(Columns.Count).SpecialCells(xlCellTypeFormulas, 1).EntireRow.Select
问题161:
如何判断活动工作簿是否保存?
答:通过文件的路径来判断,如果路径的长度大于1则表示已保存过了。
MsgBox Len(ActiveWorkbook.Path) > 1
问题162:
可以禁止使用U盘吗?
答:修改注册表中对应的键值即可,代码如下:
CreateObject("WScript.shell").regWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Start", 4, "REG_DWORD"
问题163:
如何调用内置命令?例如查找对话框。
答:利用Execute方法可以调用内置命令。
Application.CommandBars(1).Controls(2).Controls(14).Execute
问题164:
可以获取本计算机的名称吗?
答:Environ函数能获取操作系统环境变量,若参数使用COMPUTERNAME可取得计算机名称。
MsgBox Environ("COMPUTERNAME")
问题165:
如何创建一个颜色选择框,并返回颜色值?
答:CommonDialog控件的ShowColor方法可以显示颜色对话框,代码如下:
Sub test()
With CreateObject("MSComDlg.CommonDialog")
.ShowColor
MsgBox .Color
End With
End Sub
问题166:
如何打开“定位条件”对话框?
答:编号为132的对话框即为定位对话框。
Application.Dialogs(132).Show
问题167:
A=10:B=10:C=10
Msgbox A=B=C
为什么以上代码得到的结果不是True?
答:“A=B=C”表达式先计算“A=B”,将结果True和C相比较,结果就是False。正确写法如下:
A = 10: B = 10: C = 10
MsgBox A = B And A = C
问题168:
VBE界面中各窗口排列混乱或者某些窗口不见了,如何恢复默认设置?
答:关闭Excel,进入注册表的以下位置:
[HKEY_CURRENT_USER\Software\Microsoft\VBA\7.0\Common]
然后双击打开Dock,删除里面的值即可。
问题169:
能不能用VBA获取本工作簿的创建者是谁?
答:文件属性中的Author即为创建者信息。
MsgBox ThisWorkbook.BuiltinDocumentProperties.Item("Author")
问题170:
Excel创建新工作簿时总是包括3个工作表,可以修改为默认7个吗?
答:工作簿的SheetsInNewWorkbook属性控制默认工作表的数量。
Application.SheetsInNewWorkbook = 7
问题171:
能否在上午10点时用语音提示“开会时间到”?
答:Ontome配合Application.Speech.Speak即可。
Sub auto_open()
Application.OnTime TimeValue("10:00:00"), "开会"
End Sub
Sub 开会()
Application.Speech.Speak "开会时间到"
End Sub
问题172:
可以获取system32目录的路径吗?
答:用Environ函数即可。
MsgBox Environ("windir") & "\system32"
问题173:
如何创建一个按Delete键无法删除的文件夹?
答:用MkDir。
MkDir "f:\test..\" 或者 MkDir "f:\test \"
问题174:
工作表中所有公式都不显示计算结果,可以让它显示值而不是公式本身吗?
答:将工作簿的DisplayFormulas属性赋值为False。
ActiveWindow.DisplayFormulas = False
问题175:
可以让Excel 2010默认保存文件为2003格式吗?
答:保存时将格式设置为xlExcel8。
Application.DefaultSaveFormat = xlExcel8
问题176:
可以取得D盘的剩余空间吗?
答:FSO对象的AvailableSpace属性表示磁盘的剩余空间,将它转换成MB即可。
MsgBox CreateObject("Scripting.FileSystemObject").GetDrive("D").AvailableSpace / 1024 ^ 2 & "MB"
不过以上算法获取的结果和电脑中显示的值不可能完全一致,因为电脑和硬盘厂商的计算方式稍有不同,两种处理结果只是相近而已,无法相等。
问题177:
VBA执行过程后,可以撤消吗?
答:部分操作可以,但只能撤消一步。请参考帮助中关于“OnUndo”的用法。
问题178:
可以罗列出本工作簿定义的所有名称吗?
答:用ListNames方法即可。
Sub test()
[a1].ListNames
End Sub
问题179:
自定义函数时,如何为参数指定默认值?
答:采用Optional限定参数后该参数才可以指定默认值。例如:
Function A(Optional ByVal B As String = "andysky")
问题180:
如何定义参数个数不确定的自定义函数?
答:使用Param限制该参数,且指定这个参数的类型为Variant。
问题181:
定义函数时,使用Param需要注意什么?
答:不能与ByVal、ByRef或Optional一起使用,只能用于限定函数的最后一个参数。
问题182:
在单元格中录入网址时会自动产生超链接,如果取消该功能?
答:将AutoFormatAsYouTypeReplaceHyperlinks属性设置为False即可。
Application.AutoFormatAsYouTypeReplaceHyperlinks = False
问题183:
Select方法的参数是什么意思?
答:代表是否扩展当前所选内容以包括以前选择的对象。例如以下代码可以选择两个工作表:
Sheet1.Select: Sheet2.Select False
问题184:
本机中安装有多个打印机时,如何获取默认打印机名称?
答:ActivePrinter即为默认打印机。
MsgBox Application.ActivePrinter
问题185:
VBA能实现隐藏文件吗?
答:对文件设置隐藏属性即可。
SetAttr "C:\我的文档\桌面\工作表.xls", vbHidden
问题186:
如何判断用户当前处于兼容模式下使用Excel?
答:
MsgBox Rows.Count = 65536 And Application.Version * 1 > 11
即版本号大于11而工作表行数为65536行。
也可以改用工作簿的Excel8CompatibilityMode属性:
MsgBox IIf(ActiveWorkbook.Excel8CompatibilityMode, "是", "否")
问题187:
如何判断今年是否闰年?
答:
MsgBox IIf(Day(VBA.DateSerial(Year(Date), 3, 0)) = 29, "闰年", "不闰年")
也就是说2月有29天就可以判断今年属于闰年。
问题188:
如何禁用Excel的功能区?
答:需要使用宏表函数:
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
其实就是将功能区隐藏,但是比快捷键【Ctrl+F1】隐藏得更彻底。
问题189:
打开文件时提示“安全警告(宏已被禁用)”如何处理?
答:进入选项对话框的信任中心设置界面,将“宏设置”选项修改为“启用所有宏”。
问题190:
能让工作表中插入的图片具有单击或双击事件吗?
答:直接插入的图片不具备该事件,但是通过Image控件是可以做到的。所以可以先插入一个控件,再将图片导入控件中即可。
问题191:
如何调用“选择和可见性”窗口?
答:可以通过录制宏得到代码:
Sub Auto_open()
Application.CommandBars("Selection and Visibility").Visible = True
End Sub
问题192:
可以限制窗体中的文本框不管录入大写还是小写字母都只能显示为小写状态吗?
答:在 TextBox1_KeyPress事件中录入以下代码:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii >= 65 And KeyAscii <= 90 Then KeyAscii = KeyAscii + 32
End Sub
问题193:
可以修改工作表中的网格颜色吗?
答:ActiveWindow.GridlineColor属性控制网格线颜色,所以对它赋值为颜色值即可。
ActiveWindow.GridlineColor = 255
问题194:
可以终止Excel进程吗?
答:可使用DOS命令taskkill:
shell "taskkill /f /im excel.exe"
其中参数 /f表示强制结束进程,不弹出对话框。
问题195:
【录制宏】按钮呈灰色禁用状态,其它按钮都正常,怎么回事?
答:某个SUB过程正处于调试状态。单击工具栏的【重新设置】按钮即可。
问题196:
录制宏时提示“不能记录”怎么回事?
答:模块中存在不完整的代码,例如只有“End sub”没有“SUB”语句。
问题197:
可以暂时禁用鼠标操作和利用键盘在单元格录入任意字符吗?
答:
Application.Interactive = False '修改为True则可以还原
问题198:
可以让单元格的值按显示的值参与计算吗?
答:
ActiveWorkbook.PrecisionAsDisplayed = True
此状态下,单元格的值1.5可能会当作2处理。
问题199:
如何获取当前操作系统的版本?例如XP、VISTA、WIN 7。
答:
MsgBox CreateObject("WSCRIPT.SHELL").RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" & "\" & "ProductName")
问题200:
用什么方法获取控件的属性值?
答:CallByName,不过它不可以直接判断控件是否具有某属性,需要配合防错语句使用,根据err.number值来判断结果。
CallByName函数除了能获取对象的属性值外,也能执行一些命令,例如移动对象。以下代码用于将窗体中的标签向下移20,向右移30:
CallByName Me.Label1, "Move", VbMethod, 20, 30
问题201:
如何禁止使用右键中的【删除】菜单?
答:将该子菜单的Enabled属性设置为False即可,代码如下:
Application.CommandBars("Cell").Controls("删除(&D)...").Enabled = False
问题202:
如何让宏自动运行?
答:自动运行分很多种,所有事件都可以自动运行。不过,狭义地讲,自动运行是指名为Auto_open或者Workbook_Open的事件过程。所以代码放入Open事件或者将宏的名称命名为Auto_Open即可。过程Auto_Open的代码要放在模块中才行。
问题203:
VBA中\和/两个运算符有什么分别?
答:\表示整除运算,计算结果不带小数;/表示除法运算,结果可能包含小数。
问题204:
单元格不能使用填充功能,如何修复?
答:将CellDragAndDrop属性赋值为True即可,代码如下:
Application.CellDragAndDrop = True
问题205:
符号“+”在VBA中是表示加法算法吗?
答:不一定,当对数字使用+时表示加法,对文本采用+则表示连接。例如:"A"+"B"="AB"
问题206:
True参与运算时表示1,False参与运算时表示0吗?
答:在VBA中,True按-1参与运算。
问题207:
Range.Select和Range.Activate有什么分别?
答:Range.Select命令表示选择一个对象或区域,Range.Activate命令表示激活一个对象或者单元格。可以同时Select多个对象,但只能Activate一个对象。
问题208:
可以不显示最近打开的文件列表吗?
答:将DisplayRecentFiles属性设置为False即可,代码如下:
Application.DisplayRecentFiles = False
问题209:
可以知道本机中有哪些磁盘吗?
答:需要使用FSO技术,遍历所有Drive对象,代码如下:
Sub test()
Dim drive As Object
For Each drive In CreateObject("Scripting.FileSystemObject").Drives
MsgBox drive.DriveLetter
Next
End Sub
问题210:
如何让工作表的单元格根据字符数量自动调整为最合适的行高?
答:使用Range. AutoFit方法妈可,代码如下:
Cells.EntireRow.AutoFit
问题211:
可以通过变量的循环执行一系列SUB过程吗?例如宏1、宏2、宏3。
答:需使用Application.Run方法
Sub test()
For i = 1 To 3
Application.Run "宏" & i
Next
End Sub
问题212:
如何判断是否添加了scrrun.dll文件的引用?
答:获取名为“Scripting”的引用对象对称,获取失败表示没有添加scrrun.dll文件的引用。
Sub test()
On Error Resume Next
a = ThisWorkbook.VBProject.References("Scripting").Name
If Err.Number = 0 Then MsgBox "已添加引用" Else MsgBox "未添加引用"
End Sub
问题213:
如何计算工作簿中的窗体、模块、类模块的总数量?
答:
MsgBox ThisWorkbook.VBProject.VBComponents.Count - Sheets.Count - 1
其中“-1”表示减去Thisworkbook对象自身,否则会多计算一个。
问题214:
“编译错误:找不到工程或库”是什么意思?
答:未正确添加引用。
问题215:
可以使用工作表打印时上下、左右居中吗?
答:CenterHorizontally和CenterVertically控制着居中方式
ActiveSheet.PageSetup.CenterHorizontally = True
ActiveSheet.PageSetup.CenterVertically = True
问题216:
Msgbox 的第二参数64代表什么意思?
答:
第二参数用于指定对话框的按钮和图标,64代表Information Message图标,即一个叹号 。可以用16、32、24分别测试其它图标效果。
问题217:
Sheets和Worksheets有什么分别?
答:前者代表所有表,后者仅代表工作表。表包括工作表和图表、宏表和5.0对话框。
问题218:
为什么使用自定义函数时,没有自动更新计算结果?
答:使用Application.Volatile语句将函数标示为易失性函数即可。
问题219:
如何取消显示的分页符?
答:
ActiveSheet.DisplayPageBreaks = False
问题220:
宏的安全性设置为低时,可以做到打开工作簿而不启用宏吗?
答:打开Excel的状态下,按住Shift键再单击“打开”按钮打开工作簿。
问题221:
如何判断变量的类型?
答:使用Typename函数。
问题222:
VBA中[]括号在配合运算表达式使用时有什么用?
答:类似于Evaluate方法,可以将转换或者计算表达式。不过[]中的文本不需要用引号,Evaluate的参数需使用引号。
问题223:
可以一次插入30个工作表吗?
答:对Sheets.Add 方法的Count参数赋值为30即可:
Sheets.Add Sheets(Sheets.Count), , 30
问题224:
对普通变量赋值和对对象变量赋值有什么分别?
答:对象变量需要用Set进行赋值,否则会出错;对普通变量赋值可用let,也可以忽略,直接通过等号赋值即可。
set 工作表变量=sheets(1) '对象变量赋值
let 普通变量=123 '普通变量赋值
问题225:
变量的作用域如何理解?
答:作用域指变量的可用范围。例如变量可以在本模块中使用,而另一个模块中不可以调用;再如变量只能在本过程中调用,其它过程不能调用。
问题226:
变量有生存周期吗?
答:变量生存周期指变量的可调用的时间范围。当释放变量后就不可能调用。可以手工释放,也可以自动释放。有些变量是过程结束时自动释放变量,有些是工作簿关闭时才释放变量。
问题227:
如何让工作表区域全屏显示?
答:Application.DisplayFullScreen属性赋值为True即可:
Application.DisplayFullScreen = True
问题228:
如何将区域转换成图片放入剪贴板供程序调用?
答:使用Range.CopyPicture方法:
Range("C2:E7").CopyPicture Appearance:=xlScreen, Format:=xlPicture
问题229:
ActiveWorkbook与ThisWorkbook有什么区别?
答:前者为活动工作簿,后者为代码所在工作簿,两者有时表示同一个工作簿,有时表示不同工作簿。
问题230:
如何判断工作表是否处于保护状态?
答:
msgbox ActiveSheet.ProtectContents
如果返回TRUE则表示处于保护状态,否则未保护。
问题231:
为什么使用“Cells.Find(What:="A").Activate”查找包括A的单元格时有时成功有时不成功?
答:使用Find时需要将LookIn和LookAt两个参数都写全,否则就可能不成功,因为Find有记忆功能,会受上一次的设置所影响。
问题232:
为什么“Range("A1048576")”运行有时出错有时可用?
答:Exce 2010在兼容模式下不可以使用,为了让代码通用,可以改用“cells(rows.count,1)”。
问题233:
如何获取两个区域的合集?
答:使用Union方法,例如:
Union([a1], [g2:h20])
问题234:如何获取两个区域的交集?
答:
Intersect([a1:g4], [g2:h20])
如果参数与参数之间不存在交集,那么Intersect返回Nothing。
问题235:
Auto_Open过程与Workbook_Open事件过程有什么区别?
答:两者功能一样,但两者同时出现时,Workbook_Open事件先运行,Auto_Open过程后运行;Workbook_Open事件需要放在Thisworkbook代码窗口中才运行,Auto_Open放于模块中。
问题236:
为什么工作簿保存后再打开代码就不见了?
答:需要使用xlsm格式或者xls格式,保存为xlsx格式时文件中的VBA代码将自动消失。
问题237:
录制宏有哪些限制?
答:Excel的部分操作可以录制,部分操作不能录制;条件语句、循环语句、事件、窗本等等都不能通过录制宏产生。但是录制宏对于编程仍然极其重要。
问题238:
可以取消双击受保护的工作表时弹出的警告对话框吗?
答:在BeforeDoubleClick事件中写入以下代码:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Locked Then Cancel = True
End Sub
问题239:
如何设置每3分钟自动保存?
答:
Application.AutoRecover.Time = 3
问题240:
循环语句中的Step有什么用?
答:它表示步长值,正向循环且步长为1时可以忽略,其它一切情况都必须指定Step参数。例如“for i=100 to 1 Step -1”中的step就是必选项。
问题241:
Show 1和Show 0有什么分别?
答:Show的参数表示窗体显示为有模式还是无模式,通俗的讲就是窗体显示后能不能再操作单元格。此属性对Excel 2000及以前的版本无效。
问题242:
Debug.Print是什么意思?
答:用于调试代码,可在“立即”窗口输出文本,例如“Debug.Print i”表示输出变量i的值。
问题243:
使用正则表达式需要添加哪一个文件的引用?
答:vbscript.dll
问题244:
VBA中可用的正则表达式和其它软件中使用的正则表达式一样吗?
答:大同小异,有些语法是不通用的。例如VBA不支持反向预查。
问题245:
正则表达式中条件“A[BCD]E”支持哪些匹配?
答:ABE、ACE和ADE
问题246:
正则表达式中,匹配条件“\D”是代表字母D吗?
答:表示单个数字以外的字符。例如单个汉字、单个标点符号或者单个字母。
问题247:
正则表达式中的“*”、“?”两个元字符和DOS中的两个同名通配符功能一样吗?
答:原理相近,但功能大大不同,正则表达式中的元字符比DOS中的通配符更强大。
问题248:
VBA中的replace和工作表函数replace功能一样吗?
答:都是替换函数,但替换方式大大不同。VBA中的replace和工作表函数SUBSTITUTE的功能更接近。
问题249:
VBA代码也区分32位和64位吗?
答:要区分的,在32位和64位的Excel中, VBA代码并不通用,特别是API函数部分。
问题250:
VBA可以开发商用的软件吗?
答:仅用VBA编程不行,安全性不够。但是可以VBA配合其它软件实现,生成可注册的加密型安装软件。
问题251:
在一列中取唯一值的方法很多,用什么方法通用性最好,且速度也快?
答:高级筛选中的“选择不重复的记录”。
字典和集合通用性不够,RemoveDuplicates方法的通用性更差。
问题252:
用VBA可以调用功能区中的任何功能按钮吗?
答:可以,但是VBA无法创建功能区按钮。
问题253:
利用OfficeCustomUIEdito开发功能区选项卡时,所有代码都区分大小写吗?
答:引用内置控件名称、ID,以及所有参数名称需要区分大小写,对label和onAction赋值时可以不区分大小写。
问题254:
自定义的功能区选项卡的作用对象是怎样的?
答:普通工作簿中定义的选项卡只对本工作簿有效,如果保存为加载宏则对所有工作簿都生效。
问题255:
可以暂时关闭定制的功能区选项卡吗?
答:没有可隐藏定制的选项卡的VBA代码,唯一方法是关闭该工作簿。
问题256:
如何取得内置选项卡中的按钮的ID?
答:进入“Excel选项”对话框的“自定义功能区”选项卡中,鼠标指向按钮即可看到提示。
问题257:
可以用VBA修改自定义功能区中的按钮的图标吗?
答:可以,但要配合xml代码中的回调函数才可以。对于未使用回调函数的按钮,VBA无法控制它。
问题258:
可以用自己的照片作为功能区按钮的图标吗?
答:可以,而且图片的大小可以自定义。
问题259:
用VB能封装带有创建功能区菜单的VBA代码吗?
答:可以,不过在VB中写代码和使用OfficeCustomUIEditor向工作簿中写入代码的思路大大不同。
问题260:
通过OfficeCustomUIEditor能定制哪些项目?
答:Office文件菜单、快速访问工具栏和功能区。而右键菜单和迷你菜单、状态栏菜单,工作表标签右键菜单等无法定制。
问题261:
可以定制随选区不同而自动变化的功能区下拉菜单或者按钮吗?
答:功能区支持动态菜单dynamicMenu,可以实现实时变化的菜单和按钮。
问题262:
利用OfficeCustomUIEdito定制快速访问工具栏时能保留选项卡吗?
答:不能,但可以手工定制快速访问工具栏时保留选项卡。
问题263:
能否删除OFFICE文件菜单?
答:可以增加、删除菜单,隐藏其所有子菜单,但不能删除整个文件菜单。
问题264:
内置的对话框启动器中可以带图片显示,XML语言定制的新启动器也可以实现吗?
答:不可以。
问题265:
定制功能区选项卡时,对组、按钮或者下拉菜单的ID赋值时有什么要求?
答:不能采用纯数字、不能重复、不能带有标点符号。
问题266:
可以将工作表中插入的图片作为菜单图片吗?
答:早期的CommandBars对象是可以,Ribbon中的子元素则不可以。
问题267:
如何将录制的宏通过工作表中的按钮来执行?
答:单击功能区【开发工具】→【插入】→【按钮(窗体控件)】,然后在工作表中拖放产生一个按钮,此时会弹出“指定宏”的对话框,单击“录制”即可。
问题268:
使用一个带有创建自定义菜单栏的工作簿后,菜单中总有那个定义的按钮,如何删除?
答:可以通过右键手工清除,也可以通过修改代码实现,即创建按钮时将Temporary参数设置为True,表示此按钮为临时按钮。
问题269:
代码提速通常从哪些方面着手?
答:关闭屏幕更新、尽量不使用Select方法、用数组替代区域读写操作、暂时禁用自动计算、使用With减少对象读取次数等等,实际工作中由当时的具体操作而定。
问题270:
封装代码时只能封装成DLL格式吗?
答:有OCX、DLL、EXE等等多种格式可选,不过DLL的COM加载项最常见。
问题271:
COM加载项在执行过程中如果中断了,重新启动时会再也找不到其菜单项,如何再次调用菜单?
答:进入Excel选项对话框中,在“加载项”选项卡的“管理”下拉列表中有一个“禁用项目”,将里面的项目启用即可。
问题272:
找不到【开发工具】选项卡,如何调出来?
答:在Excel选项对话框的“自定义功能区”中,将主选项卡的“开发工具”打勾即可。
问题273:
表单控件与ActiveX控件有何分别?
答:表单控件简单易用,通常单独使用;ActiveX控件使用相对复杂,但功能更强大,配合VBA代码使用。
问题274:
为什么以前使用FileSearch进行文件搜索皆正常,现在不可用了?
答:FileSearch是Excel2003的一个属性,在2007和2010中已经删除该属性,可以用DIR代替。
问题275:
为什么采用Trim函数去除空格后字符串中仍然有空格?
答:VBA中的Trim并非去除空格的函数,它仅仅去除首尾的空格而已,用replace去除空格最好。
问题276:
只想去除首尾空格,中间的完全忽略,如何写代码?
答:RTrim(LTrim(" I love VBA "))或者Trim(" I love VBA ")
问题277:
“Is Nothing”代表什么?
答:通常指变量未初始化,即声明变量后未对变量赋值。
也可能是对象不存在,例如使用Intersect获取两个区域的交集时,两个区域不存在交集,那么Intersect的结果将是Nothing.
问题278:
如何不用循环判断一个一维数组arr中是否包括字母“a”?
答:
Sub test()
arr = (1, 2, 3, 4, 5, "a", 7)
MsgBox IIf(InStr("@" & Join(arr, "@") & "@", "@" & "a" & "@") > 0, "有", "没有")
End Sub
在代码中前面添加“"@"”是为了防错,实现完全匹配,而非局部匹配。
问题279:
为什么两个看起来颜色不同的单元格,用Colorindex取颜色值时却结果一样?
答:在excel 2007和2010中由于颜色太多,而Colorindex只能准确表示56种颜色,所以有时会将相近的颜色返回相同值。可改用Color来获取颜色值。
问题280:
为什么Excel 2003可以通过“CommandBars(32).Controls.Add”在“分页预览”的右键中添加按钮,而在Excel 2010中不可以?
答:在Excel 2010中,分页预览的内部编号为38,和Excel 2003不同。
问题281:
加载宏用xla格式更好还是xlam格式更好?
答:如果需要插件通用性好就要采用xla格式,如果仅仅2007或者2010用户使用,则采用xlam格式,新格式可以采用功能区按钮。
问题282:
加载宏如何安装?
答:通常用快捷键【Alt+T+I】打开“加载宏”对话框,然后单击“浏览”对话框找到加载宏文件并双击即可。最简单的方式是将它复制到自动目录中。
问题283:
Excel 2003的快捷键可以用到Excel 2010中吗?
答:绝大部分可以,少部分不行。例如调用加载项【Alt+t+i】、数据透视表向导【Alt+d+p】、记录单【Alt+d+o】,但页面设置【Alt+f+u】则不通用。
问题284:
Excel 2003的状态栏右键菜单可以定制,2010的也可以吗?
答:不可以,不管用VBA还是xml语言都不能实现。
问题285:
可以做到禁用宏则退出工作簿吗?
答:Excel 2003可以做到,Excel 2010不可能。
问题286:
如何才能知道Range有哪些属性和方法?
答:在代码窗口中录入“Range.”后,会弹出常数列表;而按F2键打开对象浏览器则可以看到更详细的列表,它可以调出Range的一些隐藏参数。
问题287:
cells和Range方式引用单元格有何分别?
答:前者两个参数都可以使用数字,在循环语句中使用很方便;后者在书写时会弹出属性与方法成员列表,而且可以用于引用多区域。两者各有优势。
问题288:
为什么调用硬盘中的ICO图标作为功能区按钮的图标时会偶尔不成功?
答:可以通过OfficeCustomUIEditor软件将它插入至文件中,再调用该图标
如果调用硬盘中的图片,请用bmp或者jpg格式,不支持其它格式。
问题289:
为什么Excel 2010中通过VBA代码插入图片后,文件寄给其他人后,打开文件却看不到图片?
答:在Excel 2010中使用Pictures.Insert方法插入的图片是链接,而非嵌入图片。在Excel 2003或者2007中Pictures.Insert方法能直接嵌入图片。不过3个版本中用Shapes.AddPicture方法插入图片都可以使图片嵌入到工作簿中,所以最好的办法是不用Pictures.Insert方法插入图片(录制宏时都自动调用Pictures.Insert方法)。
问题290:
工作簿中可以嵌入背景音乐吗?
答:可以,不过如果是MP3格式,那么操作过程将十分复杂,需要调用API实现;如果是swf的flash动画则很简单,通过ShockwaveFlashObject控件实现即可。
问题291:
工作表中的控件为何删除不掉?
答:表单控件可以单击右键,选择【删除】菜单,而对于ActiveX控件需要进入设计模式后才可以删除。
问题292:
功能区相对于传统菜单有什么优越性?
答:分类更准确,操作更快速,而且大部分功能可以实时预览,不需要执行就可以看到执行的结果,每一个按钮都有相应的快捷键,而老式菜单做不到。
问题293:
为什么同一个文件保存为xls格式和xlsm格式其大小相差很多?
答:xlsx和xlsm格式皆为压缩格式,所以文件占用的空间相对xls格式更小。
问题294:
用迅雷从网上下载xlsx或者xlsm格式的工作簿时,有时双击打开时不是Excel,而是WINRAR是怎么回事?
答:删除自动产生的后缀名“.zip”再打开即可。
问题295:
定制功能区时,可以将控件、按钮直接放在选项卡中吗?
答:不能,层级关系是固定的。选项卡→组→控件或按钮。
问题296:
能添加新的选项卡,也能添加新的上下文选项卡吗?
答:不能,只能在现有的上下文选项卡中加入新的组和按钮。
问题297:
VBA中的Date和工作表函数Date有什么异同?
答:工作表函数Date有三个参数,用于返回指定年月日的日期;VBA中的DATE不需要参数,它表示系统的当前日期。如果对Date赋值则可以修改系统日期。
问题298:
Excel中选择多个不规则区域时禁止复制和剪切,VBA可突破这个限制吗?
答:可以,使用循环语句逐个区域复制或剪切即可。
问题299:
学会VBA后,以后OFFICE升级是否需要再次学习VBA?
答:VBA的语法不会变化,不管OFFICE如何升级。不过会增加一些新的对象或者属性、事件进来。如果学好了Excel 2010的VBA,那么以后的新增知识点稍加浏览即会。
问题300:
定制功能区选项卡时先写VBA代码更好还是先定义XML代码更好?
答:顺序不重要,只要确保VBA与XML代码中的控件名称对应即可。
问题301:
功能区可以缩小,能否能像Exce 2003的菜单那样拖到工作表下方显示呢?
答:不可以,只能隐藏或者缩小。而且通过CommandBars对象生成的老式菜单同样不能拖到下方显示。
问题302:
OfficeCustomUIEditor软件没有查找与替换功能,写代码时需要批量替换代表应怎么处理?
答:将代码复制到记事本中,替换好再粘贴回去。
问题303:
定制功能区时,代码中“<”、“>”、“”有什么含义?
答:一段完整的标签代码使用“<”标记起始位置,“/>”标记结束位置,它们总是成对出现的,缺一不可。标记也可以嵌套使用。“”表示调用内置的倾斜按钮。
问题304:
动态菜单dynamicMenu能使菜单的样式、数量、名称等等动态变化,能创建动态的组吗?
答:不可以,dynamicMenu是组中的一个控件,只能控制菜单中的元素动态变化,菜单以外的控件无权控制。
问题305:
定义功能区的xml代码中创建注释时,用什么格式?
答:采用以下格式,“”开头,“–>”结尾。例如:
这是一段注释 –>
问题306:
定义功能区的xml代码是否和VBA代码一样,只能保存在xlsm、xlam格式的工作簿中?
答:xlsm、xlam和xlsx格式皆可。如果需要使用回调时,才需要保存为xlsm或者xlam格式,因为回调函数都以VBA形式存在,而xlsx格式的文件无法保存VBA代码。
问题307:
如何确定回调函数的参数?
答:可以参考本书的回调函数列表,也可以通过OfficeCustomUIEditor软件自动生成。
OfficeCustomUIEditor软件的按钮“Generate Callbacks”的功能即为生成回调函数,包括所有参数。
问题308:
当定制的功能区中包括多个组和多个按钮时,启动工作簿会不会很慢?
答:不会,Excel的功能区和老式菜单的创建机制不同,它总在激活订制的功能区时才会调用对应的代码,而不是开启工作簿时就自动运行代码。
例如生成一个名为“NewTab”的选项卡,只有单击该选项卡时才运行创建“NewTab”选项卡中的按钮的代码,以及执行回调函数的代码。
问题309:
如何使用自定义图片作为功能区按钮的图标,图片的大小有何要求?
答:由于按钮只能显示为16*16、32*32两种尺寸,所以在加载图片前尽量将它裁剪到实际显示的尽寸,如此可以减小文件体积,也可以加快加载图片的速度。
问题310:
公式的计算速度快还是VBA更快?
答:不能一概而论,要看公式和VBA代码本身是否编写合理,思路不好时两者皆慢。另外小型计算公式会快于VBA,对于大型计算VBA则快于公式(VBA代码优化的前提下)。
问题311:
VBA代码要区分大小写吗?为什么书中或者网上的代码大多是首字母大写其余小写。
答:默认设置下,使用等号判断字符串是否相等时要区分大小写,对于自定义变量名称、内部保留字等不区分大小写。在使用中,编写代码调用内部的保留字时VBA会自动将它转换成首字母大写。在声明自定义变量时,为了便于阅读建议大家对变量的名称首字母大写,但这不是必须的。
问题312:
开发插件,必须使用菜单或者功能区按钮吗?
答:不一定,例如自定义函数不需使用按钮和菜单调用。
另外,也可以创建快捷键来调用Sub过程,而并非一定要选用菜单。但是当Sub过程较多时用菜单比快键键好,快捷键太多不利于用户记忆。
问题313:
使用类模块最大的好处是什么?
答:减少重复性的代码编写工作。
类模块的用途相当多,但最常见的莫过于通过类实现批量地控制某些对象。例如对100个按钮赋值只需要在类模块中赋值一次,而不是写100句代码对它们分别赋值。
问题314:
鼠标移过单元格时有对应的事件吗?
答:没有,不过通过API配合循环语句可以变通地实现该事件。但它会占用较高的内存资源,所以虽然可以实现,但实际工作中极少人用。
问题315:
在工作表中插入图表时也有相应的事件吗?
答:Excel 2003和2007没有这个事件,Excel2010增加了Workbook_NewChart事件。
问题316:
是否在进行数据运算时尽量调用工作表函数?
答:初学时尽量调用内置的工作表函数,因为调用比开发更简单,但是后期尽量使用VBA的思路实现,而少用工作表函数。
大型数据运算时VBA的数组运算比调用工作表函数更快。
问题317:
Left$和Left有何分别?
答:使用Left获取字符串,那么VBA将字符串作为变体型数据来进行计算,而使用Left$时,则将字符串当作String类型进行计算,而变体型数据在计算时需要更多的内存空间,效率更差。
问题318:
可否让MSGBOX对话框提示用户的同时,让VBA代码继续执行?
答:不可以,但是可以使用Userform替代Msgbox对话框,当窗体以无模式显示时,后面的代码可以继续执行。
问题319:
能否实现单击超链接时,所链接的工作表属于隐藏状态也可以正常跳转到目标工作表?
答:
Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink)
Range(Target.SubAddress).Parent.Visible = xlSheetVisible
Application.Goto Range(Target.SubAddress)
End Sub
问题320:
为什么“Sheets(3).Range("A2").Select”会执行不成功?
答:跨表选择单元格时不能直接使用select方法,需要先选择工作表再选择单元格。
当然也可以改用Goto方法,代码如下:
Application.Goto Sheets(3).Range("A2")
问题321:
自定义函数的所有参数都可以全是可选参数吗?
答:可以,采用Optional将参数限定为可选,再对参数赋予默认值,而且在Function过程中必须指定所有参数皆为默认值时函数所对应的返回值。
问题322:
能用代码生成代码吗?即根据不同条件产生不同的代码,然后执行所产生的代码。
答:可以的。CodeModule.InsertLines方法配合IF语句使用即可,CodeModule.InsertLines方法的功能是在指定的位置插入一行代码。
问题323:
如何调用加载宏工作簿中的数据?例如A1的值。
答:和引用普通工作簿的数据一样,写上完整的路径即可,包括工作簿名称、工作表名和单元格地址:
MsgBox [[自定义函数.xla]sheet1!a1]
问题324:
VBA可以实现屏幕截图并插入到工作表中吗?
答:可以的,采用ExecuteMso方法调用内置命令ID即可(Excel 2010专用)。
Application.CommandBars.ExecuteMso ("ScreenClipping")
问题325:
如何记录某个工作簿的开启次数?
答:如果记录本机开启次数,则在Open事件时使用SaveSetting将开启次数写入注册表中,逐一累加;如果不限机台,要求代码在任何机器中使用都能获取开启次数,则可以通过自定义工作簿的属性,在属性中累加开启次数。
问题326:
为什么将宏的安全性调低,保存文件时仍会出现“无法在未启用宏的工作簿中保存以下功能......”?
答:文件格式不正确,与宏的安全性无关。保存时选择xls或者xlsm皆可。
问题327:
为什么将宏的安全性调低后,代码仍然不执行,提示“不信任到Viisual Basic Project的程序连结”?
答:勾选“信任对VBA工程对象模型的访问”即可。
问题328:
为什么在“工程属性”对话框中录入查看工程属性的密码,且保存工作簿后仍然可以看到VBA代码?
答:工程加密在工作簿重启后才生效。
另一个可能性是输入密码后未勾选“查看时锁定工程”。
问题329:
auto_open过程与Workbook_Open事件有分别吗?
答:如果两者同时存在,先执行Workbook_Open事件,后执行auto_open过程;Workbook_Open事件的代码必须存放在ThisWorkbook窗体中,而auto_open过程只能放在模块中。
问题330:
可以实现工作簿只能在指定的机器中开启吗?
答:可以实现,只不过禁用宏就可以破解此限制,所以严格来说VBA并无法实现。
问题331:
可以用VBA代码生成一个新的功能区选项卡吗?
答:不可以,只能用XML语言。
问题332:
可以在Excel 2010的“文件”菜单中添加子菜单吗?
答:“文件”不属于功能区,它是Backstage视图。可以利用Custom UI Editor For Office 2010软件在Backstage视图中创建子菜单。
问题333:
能用VBA定制Mini toolbar吗
答:只能关闭该工具条,不能修改或者添加新的子菜单。
问题334:
如何在定制功能区的详细屏幕提示中使用换行符?
答:插入代码“ ”即可。
问题335:
如何用VBA开启Word?
答:
Shell "winword", vbMaximizedFocus
也可以调用脚本语言实现:
CreateObject("wscript.shell").Run "winword", 3
问题336:
如何关闭Excel程序且不提示保存工作簿?
答:
Application.DisplayAlerts = False
Application.Quit
问题337:
自定义函数时如何获取公式所在单元格的地址?
答:使用Thiscell表示调用函数的单元格,不过此函数只能在单元格中使用。如果用代码调函数将会出错。
Thiscell.address
问题338:
“Userform1.show 0”代码中的0是什么意思?
答:0表示窗体显示为无模式,即开启窗体时仍然可以操作单元格;如果采用1则只有关闭窗体才可以选择单元格。
问题339:
当运体窗体时提示“显示有模式窗体时,不能显示无模式窗体”是什么意思?
答:通常在已打开一个窗体后再调用另一个窗体时发生。当前窗体以模态方式显示,那么此时禁止以无模式方式调用另一个窗体,去除Show后面的0即可。
问题340:
工作簿“生产表.xlsm”的模块中1中有一个过程“ABC”,在工作簿“财务报表.xlsm”中调用它,用什么代码?
答:
Application.Run "'生产表.xlsm '!模块1. ABC "
问题341:
能实现公历日期转换成农历日期吗?
答:VBA没有直接实现的方法,没有相关的函数,必须用VBA开发自定义函数实现。
问题342:
能否禁止插入图表?
答:不可以,但可以通过NewChart事件删除图表,即每次插入图表时自动删除。不过NewChart事件是Excel2010专用的事件,其它版本无法使用。
问题343:
VBA中等号是什么意思?
答:直接在表达式中使用时表示赋值,例如“[a1]=5”;当表示式作为参数出现时则用于判断,例如“msgbox [a1]=5”,此句中“[a1]=5”是msgbox的参数
问题344:
VBA中“+”表示加法运算吗?
答:不是。准确地讲,“+”有时表示加法运算,有时表示字符连接。数字运算时它表示加法,而文本运算时它表示字符连接,例如“Msgbox "A" +"15"”
问题345:
为什么“MsgBox True + 2”结果等于1?
答:在VBA中True的值为-1,在工作表函数中True的值为1。
问题346:
如何开启指定的网页?
答:
Shell "explorer.exe " & """http://excelbbx.net""", 3
或者:
CreateObject("wscript.shell").Run "http://excelbbx.net", 3
问题347:
为什么本机调用日历控件生成日期可以正常运行,工作簿复制到其它机器后却不执行?
答:一种可能是OFFICE版本不同,它们的日历控件也会不同,所以不能执行。
另一种可能是另一台机没有日历控件。
问题348:
为什么自己的某些工作簿没有设置密码,却不能查看代码?
答:当工作簿共享后就不可以再查看代码。可以取消共享,编辑好代码后再共享,否则不能编辑。
问题349:
如何计算一个数组中的最大值?
答:VBA中没有函数可以计算最大值,但可以调用工作表函数MAX执行计算。例如:
Msgbox WorksheetFunction.Max(Arr)
问题350:
可以在窗体中播放Flash动画吗?
答:在窗体中插入ShockwaveFlash控件,并在其Movie属性中录入swf文件的详细地址即可。
问题351:
列表框如何添加列标题?
答:列表框是否显示标题由它的赋值方式决定的。当将一个区域赋值给列表框时,可以调用区域的上一行作为列表框的列标题。当使用数组为列表框赋值时不可以显示列标题。不过可以使用ListView控件代替列表框使用,可以很方便地在ListView控件中添加列标题。
问题352:
用什么方法批量合并A1:B1、A2:B2、A3:B3、A4:B4......?
答:
Range("A1:B10").Merge True '参数True表示跨越合并,即批量合并多个横向区域。
问题353:
VBA能调用DOS命令,是否也能格式化磁盘?
答:不能,虽然VBA能执行DOS命令,但是对于需要按“Y”或者“N”键确认的命令则无法继续执行下去。
问题354:
对VBA代码创建菜单时使用传统的菜单更好还是功能区按钮更好?
答:这里不存在好与坏之分,而是看需求和使用环境。在Excel 2003中使用时只能用传统菜单,如果自己使用Exel 2010,但客户有可能用2003,为了提升程序的兼容性也需要使用传统的菜单。
如果确定使用代码的人一定不会使用Excel 2003,那么适合使用功能区按钮,它更美观,且操作更简便。
问题355:
为什么以下代码中第二句会出错?变量i的值在100到200之间,并没有超过byte的范围。
Dim i As Byte
For i = 200 To 100 Step -1
答:问题出在Step参数上,-1不在Byte的有效范围内。
问题356:
将代码封装成DLL后,有些什么优点?
答:可以保护代码,避免他人抄袭;可以避免因宏的安全性为中或者高时不执行代码;可以对代码加密,设置限制,从而制作成商业软件。
问题357:
用VB封装代码时可以使用图片作为功能区按钮的图标吗?
答:可以,将该图片插入到VB的资料编辑器中,然后使用GetImage函数调用该资源文件即可。
Function GetImage(control As IRibbonControl) As IPictureDisp
Set GetImage = LoadResPicture(101, vbResBitmap) '调用资源文件中的位图作为功能区的图标
End Function
以上函数表示通过GetImage调用名为101的图片资源文件。在生成功能区代码的xlm代码中对按钮的getImage参数按以下方式赋值即可:
getImage="GetImage"
前一个getImage是按钮的参数名称,后一个getImage是VB中的自定义函数名称,用于获取图片资源,可以改用其它名称。
问题358:
For next...Next和For Each...Next两种循环方式有何区别?
答:前者应用范围更广,使用了后者的代码基本都能改用前者代替,实现相同功能。
For Each...Next仅适用于对对象集合进行循环,例如单元格对象、工作表对象、磁盘对象、图片对象等等。而对于从1循环到100这类问题只有使用For next...Next才能解决。
问题359:
录制宏对于学习VBA有什么帮助?
答:录制宏产生的代码通常不能直接使用,它的效率较低,而且并非所有操作都能录制。但是录制宏对于学习VBA而言至关重要,是无可替代的。
录制宏可以产生操作对象的对象名称、方法、属性等代码,从而为书写代码提供参考,同时也避免手工录入时写错单词的可能性。
例如对“在最右添加一个新工作表,且命名为ABC”录制宏,产生的代码如下:
Sub 宏1()
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet4").Select
Sheets("Sheet4").Name = "ABC"
End Sub
此段代码显然有问题,通用性很不好,无法将它应用在实际的工作中,但是它同时又为编写代码提供了极大的帮助。帮助一是通过录制获得了创建新表和对工作表命名的代码,从而在忘记了代码时照样可以编程。帮助二是对录制宏产生的代码稍作修改即可完美地实现需求,从而大大地缩减了工作量。最后的代码如下:
Sub 宏1()
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "ABC"
End Sub
也可以精简为以下代码:
Sub 宏1()
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "ABC"
End Sub
问题360:
如何实现单元格中输入自定义函数时也产生参数提示?
答:只有内置函数才可以实现,自定义函数只能产生函数名称提示,不可能产生参数提示。
问题361:
能打开工作簿而获取工作簿中某个工作表的已用区域的值吗?
答:不可以。
可以实现不打开工作簿而取该工作簿中指定工作表名和单元格地址的值,但不可能计算工作簿中某个工作表的已用区域是什么。换句话说只有明确的知道工作表名称和单元格地址时才能从未开启的工作簿中取值,如果工作表名称未知或者需要引用的区域地址未知、需要通过对该工作簿进行计算才能获得地址时就无法实现。
问题362:
利用VB 6.0企业版封装有窗体的VBA插件时,使用VB新建一个窗体更好还是直接将Excel中设计好的窗体导入到VB中使用更好?
直接将Excel中设计好的窗体导入到VB中使用更好,因为有些控件只有Excel才有,VB中没有。在少数情况下VB能做到与Excel中设计的窗体效果和功能都一样。
另外,对于复杂的窗体,在VB中再设计一次需要花费较长时间,而且由于控件的默认名称不同,需要逐个修改控件名称,否则VBA代码复制到VB中无法使用。
但是在VB中创建窗体相对于直接调用Excel中设计好的窗体也有一个好处:可以借用API代码美化VB创建的窗体,却不能在VB中使用API函数美化从Excel中导出的窗体。
问题363:
VB中有哪些函数或者语句与工作表函数同名但用法不同?
答:Date语句与工作表函数Date功能不同,用法也不同;
IF语句与工作表函数IF功能不同,用法也不同;
MOD运算符与工作表函数MOD功能相同,用法不同;
Replae方法与工作表函数Replae功能不同,也法也不同;
FIND方法与工作表函数Find功能不同,也法也不同;
Trim函数与工作表函数Trim功能不同,用法相同。
Round函数与工作表函数Round功能不同,用法相同。
问题364:
为什么For Next循环结束后,变量的值不等于循环体的终值(即End参数)?
答:变量的值在循环完成后等于终值加步长值,例如运行以下两句代码后,变量i的值等于4:
For i = 1 To 3
Next
例如运行以下两句代码后,变量i的值等于13:
For i = 1 To 10 Step 3
Next
问题365:
使用VB将Excel VBA代码封装成DLL文件后,再用Inno Setup软件制作成EXE安装文件,在安装该程序时需要注意什么?
答:
1.由于这是Excel插件,所以必须安装了Microsoft Office Excel软件后才能安装插件;
2.不能将它安装在WPS中,因为引用的对象不同;
3.如果是VISTA或者WIN 7、WIN 8,需要将用户帐户控制关闭,否则无法安装成功;
4.必须用管理员用户安装,其它用户无DLL文件的注册权限;
5.必须是完整版OFFICE,采用精简OFFICE时会因为缺少必要的文件而每次开启Excel时都提示补充文件;
6.尽量关闭Excel后再安装。
——罗刚君
2013-3-18
本文来源:https://www.2haoxitong.net/k/doc/c354d07d336c1eb91a375d63.html
文档为doc格式