excel的365个常见问题答疑 - 答案

发布时间:2014-03-01 18:45:31   来源:文档文库   
字号:

第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("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 200320072010通用?

答:Excel 20032007可以通用,但Excel 2010新增了10多个新的事件,这些事件不支持Excel 20032007

问题16

是否只用低版本的方法、事件、属性就可以确保代码通用?

答:虽然大部分情况下确实如此,但鉴于有些属性或者方法在高版本中被删除了,所以不使用新增功能也无法确保代码总是通用的。例如FileSearch属性。

问题17

Excel 2010相对2007VBA方面的变化大吗?

答:不大,所有语法不变,只是新增了一些事件、对象、属性和方法。

问题18

VBA可以实现不打开工作簿而取其中的值吗?

答:可以,本书中有相关的自定义函数实现。但是打开工作簿后再取值更灵活,更方便。

问题19

Excel中的所有操作都可以录制吗?

答:90%以上都可以,少部分不支持录制宏。例如按格式查找、屏幕截图、修改批注的边框尺寸等等。

问题20

单元格的颜色属性ColorColorIndex是一样的吗?

答:在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代码时不能使用EndVB不支持End

问题32

利用Public声明的变量就是全局变量吗?所有模块都可以引用?

答:不一定,必须在标准模块中声明,且置于所有过程之上。

问题33

如何用VBA实现缩小功能区?

答:VBA并不提供相关的方法或者属性,但是Excel允许使用【Ctrl+F1】组合键缩小功能区,所以利用SendKeys发送键盘命令即可。

Application.SendKeys "^{f1}"

问题34

cells.count计算单元格数量会出错,如何修改代码呢?

答:此代码只在xlsxxlsm格式的文件中会出错,兼容模式下不会出错。

利用转换函数转换被乘数的类型即可: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自带的GetsettingSavesetting只能读写指定路径的键值,但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.textRange.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 20032007MacroOptions只能添加函数说明,不能对参数添加说明。

问题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:\工作”文件夹的大小?

VBAFileLen只能计算文件大小,使用FSO对象的GetFolder才能获取文件夹的信息,代码如下:

CreateObject("scripting.filesystemobject").GetFolder("D:\工作").Size / 1024 & "KB"

问题64

不用循环能计算1100之间自然数之和吗?

答:直接调用数组公式即可,代码如下:

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

一句较长的代码如何分多行书写?

答:在需要断开的地方添加“ _”即可,注意第一个字符是空格。

不能将一个单词拆开,例如把“Range5个字母写在两行中会导致代码执行出错。

问题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中的KillDOS下的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中的IIFIF...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

可以列出工作表能用的所有字体名称吗?

答:字体位于格式工具栏ID1728的控件中,通过循环语速句读出其子元素即可。

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创建的计划任务?

答:对OnTimeSchedule参数赋值为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”,将结果TrueC相比较,结果就是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需要注意什么?

答:不能与ByValByRefOptional一起使用,只能用于限定函数的最后一个参数。

问题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

如何获取当前操作系统的版本?例如XPVISTAWIN 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参与运算时表示1False参与运算时表示0吗?

答:在VBA中,True按-1参与运算。

问题207

Range.SelectRange.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

可以使用工作表打印时上下、左右居中吗?

答:CenterHorizontallyCenterVertically控制着居中方式

ActiveSheet.PageSetup.CenterHorizontally = True

ActiveSheet.PageSetup.CenterVertically = True

问题216

Msgbox 的第二参数64代表什么意思?

答:

第二参数用于指定对话框的按钮和图标,64代表Information Message图标,即一个叹号 。可以用163224分别测试其它图标效果。

问题217

SheetsWorksheets有什么分别?

答:前者代表所有表,后者仅代表工作表。表包括工作表和图表、宏表和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

ActiveWorkbookThisWorkbook有什么区别?

答:前者为活动工作簿,后者为代码所在工作簿,两者有时表示同一个工作簿,有时表示不同工作簿。

问题230

如何判断工作表是否处于保护状态?

答:

msgbox ActiveSheet.ProtectContents

如果返回TRUE则表示处于保护状态,否则未保护。

问题231

为什么使用“Cells.Find(What:="A").Activate”查找包括A的单元格时有时成功有时不成功?

答:使用Find时需要将LookInLookAt两个参数都写全,否则就可能不成功,因为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 1Show 0有什么分别?

答:Show的参数表示窗体显示为有模式还是无模式,通俗的讲就是窗体显示后能不能再操作单元格。此属性对Excel 2000及以前的版本无效。

问题242

Debug.Print是什么意思?

答:用于调试代码,可在“立即”窗口输出文本,例如“Debug.Print i”表示输出变量i的值。

问题243

使用正则表达式需要添加哪一个文件的引用?

答:vbscript.dll

问题244

VBA中可用的正则表达式和其它软件中使用的正则表达式一样吗?

答:大同小异,有些语法是不通用的。例如VBA不支持反向预查。

问题245

正则表达式中条件“A[BCD]E”支持哪些匹配?

答:ABEACEADE

问题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,以及所有参数名称需要区分大小写,对labelonAction赋值时可以不区分大小写。

问题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格式吗?

答:有OCXDLLEXE等等多种格式可选,不过DLLCOM加载项最常见。

问题271

COM加载项在执行过程中如果中断了,重新启动时会再也找不到其菜单项,如何再次调用菜单?

答:进入Excel选项对话框中,在“加载项”选项卡的“管理”下拉列表中有一个“禁用项目”,将里面的项目启用即可。

问题272

找不到【开发工具】选项卡,如何调出来?

答:在Excel选项对话框的“自定义功能区”中,将主选项卡的“开发工具”打勾即可。

问题273

表单控件与ActiveX控件有何分别?

答:表单控件简单易用,通常单独使用;ActiveX控件使用相对复杂,但功能更强大,配合VBA代码使用。

问题274

为什么以前使用FileSearch进行文件搜索皆正常,现在不可用了?

答:FileSearchExcel2003的一个属性,在20072010中已经删除该属性,可以用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 20072010中由于颜色太多,而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

cellsRange方式引用单元格有何分别?

答:前者两个参数都可以使用数字,在循环语句中使用很方便;后者在书写时会弹出属性与方法成员列表,而且可以用于引用多区域。两者各有优势。

问题288

为什么调用硬盘中的ICO图标作为功能区按钮的图标时会偶尔不成功?

答:可以通过OfficeCustomUIEditor软件将它插入至文件中,再调用该图标

如果调用硬盘中的图片,请用bmp或者jpg格式,不支持其它格式。

问题289

为什么Excel 2010中通过VBA代码插入图片后,文件寄给其他人后,打开文件却看不到图片?

答:在Excel 2010中使用Pictures.Insert方法插入的图片是链接,而非嵌入图片。在Excel 2003或者2007Pictures.Insert方法能直接嵌入图片。不过3个版本中用Shapes.AddPicture方法插入图片都可以使图片嵌入到工作簿中,所以最好的办法是不用Pictures.Insert方法插入图片(录制宏时都自动调用Pictures.Insert方法)。

问题290

工作簿中可以嵌入背景音乐吗?

答:可以,不过如果是MP3格式,那么操作过程将十分复杂,需要调用API实现;如果是swfflash动画则很简单,通过ShockwaveFlashObject控件实现即可。

问题291

工作表中的控件为何删除不掉?

答:表单控件可以单击右键,选择【删除】菜单,而对于ActiveX控件需要进入设计模式后才可以删除。

问题292

功能区相对于传统菜单有什么优越性?

答:分类更准确,操作更快速,而且大部分功能可以实时预览,不需要执行就可以看到执行的结果,每一个按钮都有相应的快捷键,而老式菜单做不到。

问题293

为什么同一个文件保存为xls格式和xlsm格式其大小相差很多?

答:xlsxxlsm格式皆为压缩格式,所以文件占用的空间相对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 2010VBA,那么以后的新增知识点稍加浏览即会。

问题300

定制功能区选项卡时先写VBA代码更好还是先定义XML代码更好?

答:顺序不重要,只要确保VBAXML代码中的控件名称对应即可。

问题301

功能区可以缩小,能否能像Exce 2003的菜单那样拖到工作表下方显示呢?

答:不可以,只能隐藏或者缩小。而且通过CommandBars对象生成的老式菜单同样不能拖到下方显示。

问题302

OfficeCustomUIEditor软件没有查找与替换功能,写代码时需要批量替换代表应怎么处理?

答:将代码复制到记事本中,替换好再粘贴回去。

问题303

定制功能区时,代码中“<”、“>”、“”有什么含义?

答:一段完整的标签代码使用“<”标记起始位置,“/>”标记结束位置,它们总是成对出现的,缺一不可。标记也可以嵌套使用。“

《excel的365个常见问题答疑 - 答案.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式