第 1页 /总 38页 第23章 365个常见问题答疑
第23章 365个常见问题答疑
问题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(\
问题9:
如何获取当前用户的【发送到】文件夹? 答:用VBA调用脚本语言即可,代码如下:
CreateObject(\
第 2页 /总 38页 第23章 365个常见问题答疑
问题10:
如何获取收藏夹路径? 答:
CreateObject(\问题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种索引色,前者比后者更强大,但后者比前者兼容性好。
第 3页 /总 38页 第23章 365个常见问题答疑
问题21:
相同公式,Excel 2010会不会比2003中计算更快?
答:Excel 2010支持多线程计算,如果您使用多核CPU的话,一定比Excel 2003的运算速度快。
问题22:
如何使用VBA判断单元格是否含有超链接?
答:根据单元格的链接数量来判断,数量为0表示无超链接,代码如下:
MsgBox IIf(Range(\有\没有\问题23:
如何取得一个区域内的已用区域地址?
答:利用Intersect取选区和已用区域的交集即可,代码如下:
on error resume next
Intersect(ActiveSheet.UsedRange, Selection).Address
问题24:
按地址传递(byref)和按值传递(byval)区别是什么?
答:按值传递时,参数的值不产生变化;按地址传递时,该参数值可以修改。 问题25:
如何用VBA打开与陌生人的QQ聊天对话框? 答:通过IE浏览器可以直接开启与非好友聊天的对话框,所以用Shell调用IE地址即可。代码如下:
Shell \ \问题26:
如何判断当前操作系统是否为繁体中文? 答:
Private Declare Function GetSystemDefaultLCID Lib \ '调用API函数 MsgBox (GetSystemDefaultLCID = &H404) '值为&H404表示繁体中文系统
问题27:
VBA可以禁止Excel内部的保存或者另存功能吗?
答:可以做到,不过禁用宏后就可以继续保存或者另存了。
问题28:
可以实现提取姓名的汉语拼音首字母吗?
答:可以实现,但不确保准确度,因为存在很多同音字。所以站在精确度的方位理解,只能说无法实现。
问题29:
能使自动替换只对一个区域生效吗?
答:内置的自动替换功能对所有工作表的所有区域都生效,无法改造,但可以通过工作表事件实现某个区域的自定义替换。
问题30:
如何获取application.inputbox所引用的单元格所在工作表名称? 答:
On error resume next
MsgBox Application.InputBox(\请选择单元格\
问题31:
Exit Sub等于end吗?
第 4页 /总 38页 第23章 365个常见问题答疑
答:有时相等,有时不等。执行end时会释放所有变量的值,Exit Sub仅仅释放私有变量的值。
另外,在VBA中可以使用Exit Sub等于end,但是用VB封装VBA代码时不能使用End,VB不支持End。
问题32:
利用Public声明的变量就是全局变量吗?所有模块都可以引用? 答:不一定,必须在标准模块中声明,且置于所有过程之上。
问题33:
如何用VBA实现缩小功能区?
答:VBA并不提供相关的方法或者属性,但是Excel允许使用【Ctrl+F1】组合键缩小功能区,所以利用SendKeys发送键盘命令即可。 Application.SendKeys \问题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(\
问题38:
AfterSave事件的参数Success是什么意思?
答:代表是否保存成功。如果在保存对话框中点“取消”则返回False。 问题39:
如何判断“Visual Basic for Applicaton”是否拼写正确? 答:CheckSpelling方法用于拼写检查,代码如下:
MsgBox Application.CheckSpelling(\问题40:
如何实现“工程不可查看”? 答:将工作簿共享即可。
问题41:
chr(10)和chr(13)有什么分别?
答:前者是回车符,后者是换行符,显示在msgbox对话框中时效果一样,但若显示在单元格中则不同,后者没有换行效果。

