第 6页 /总 38页 第23章 365个常见问题答疑
问题52:
如何将工作簿另存到D盘中,且工作簿名由A1单元格的值决定。 答:使用Workbook.SaveAs方法。
ActiveWorkbook.SaveAs \问题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:
第 7页 /总 38页 第23章 365个常见问题答疑
如何一键删除超链接? 答:
ActiveSheet.Hyperlinks.Delete
问题62:
可以用一句代码实现对二维数组变量赋值吗?
答:公式中的{}可以创建二维数组,添加[]后即可使其在VBA中使用。
Arr = [{1,2,3;4,5,6}] 问题63:
如何计算“D:\\工作”文件夹的大小?
VBA的FileLen只能计算文件大小,使用FSO对象的GetFolder才能获取文件夹的信息,代码如下:
CreateObject(\工作\问题64:
不用循环能计算1到100之间自然数之和吗? 答:直接调用数组公式即可,代码如下:
MsgBox [sum(row(1:100))] 问题65:
可以一句代码实现向下填充所有空白单元格吗? 答:
On error resume next '防止不存在空白单元格时出错
ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = \
问题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 第 8页 /总 38页 第23章 365个常见问题答疑
问题72:
可以用VBA打开控制面板吗? 答:
a = Shell(\
或者
CreateObject(\问题73:
如何取得“d:\\123.xlsm”的创建时间? 答:
FileDateTime只能获取文件最后一次修改的时间,获取创建时间要用FSO对象的DateCreated属性实现。 MsgBox CreateObject(\问题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自带的计算器?
第 9页 /总 38页 第23章 365个常见问题答疑
答:
Shell \
或者
CreateObject(\问题82:
如何获取活动单元格的批注文本? 答:
ActiveCell.Comment.Text
如果活动单元格没有批注则会出错,所以需要配合防错语句使用。 问题83:
如何在状态栏显示今天星期几? 答:
Application.StatusBar = Format(Date, \
其中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常量,表示向上。
第 10页 /总 38页 第23章 365个常见问题答疑
问题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(\开会\End Sub Sub 开会()
MsgBox \开会\End Sub
问题98:
如何为“生成批注”过程指定一个快捷键? 答:
Application.OnKey \生成批注\
以上代码表示按下【Ctrl+q】时执行过程“生成批注”。记住此时要区分大小写。 问题99:
可以让窗体中的文字框换行吗?
答:将文字框控件的MultiLine属性设置True即可。
问题100:
能否判断单元格的值和其显示的值是否一致?
答:有可能单元格中显示2,但其值本身是1。利用以下代码可以判断: