资源描述
第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%system32scrrun.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 nextIntersect(ActiveSheet.UsedRange, Selection).Address问题24:按位置传递(byref)和按值传递(byval)区别是什么?答:按值传递时,参数的值不产生变化;按位置传递时,该参数值可以修改。问题25:如何用VBA打开与陌生人的QQ聊天对话框?答:通过IE浏览器可以直接开启与非好友聊天的对话框,所以用Shell调用IE位置即可。代码如下:Shell explorer.exe bbb:/wpa.qqaaa/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 nextMsgBox 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(=RC1*RC2, 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 bEnd 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 = TrueEnd Sub问题54:可以禁止双击修改单元格吗?答:将Cancel 参数赋值为True即可。Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)Cancel = TrueEnd Sub问题55:如何一次性清除工作表中所有公式结果为错误值的单元格?答:On Error Resume NextCells.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-1C问题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:如何获取活动单元格的批注文本?答:ActiveCellaaament.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 SubSub 开会() 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 = xlPageBreakPreviewMsgBox 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:可以在活动单元格的批注中插入一行,显示当前日期吗?答:使用以下代码即可,不要要确保单元格已经有批注。ActiveCellaaament.Text Text:=ActiveCellaaament.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*88台诺基亚手机+3400*5iphone4”。答:将替换成“*ISTEXT(”,将替换成“)”,然后使用Evaluate计算即可。MsgBox Evaluate(Replace(Replace(1200*88台诺基亚手机+3400*5iphone4, , *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:单元格右键菜单被禁用时如何恢复?答:执行以下两句代码即可:ApplicationaaamandBars(cell).Enabled = TrueApplicationaaamandBars(cell).Reset问题127:有什么方法或者属性、函数能检查是否存在某个名称的工作表?答:没有现成的,可以自己定义一个函数实现。在函数中引用该名称的工作表,然看判断代码是否出错,如果引用出错则表示不存在。问题128:如何将一个区域的公式转换成值?答:Range(A1:B10) = Range(A1:B10).Value问题129:批注框的大小可以调整为自动适应文字的多少吗?答:ActiveCellaaament.Shape.TextFrame.AutoSize = True问题130:如何一次性将工作表中所有公式所在单元格标示为黄色?答:On error resume next 避免无公式时代码出错cells.SpecialCells(xlCellTypeFormulas, 23).Interior.Color = 65535问题131:如何启动发送邮件的窗口?且向指定用户名发送。答:ActiveWorkbook.FollowHyperlink mailto:excelbbx163aaa问题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) & system32rundll32.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:=xlByRowsCells.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 = 现在时刻: & TimeApplication.OnTime Now + TimeValue(0:0:1), auto_openend 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 NextEnd 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) NextEnd Sub问题154:如何计算开机到现在用了多少分钟?答:Private Declare Function GetTickCount Lib kernel32 () As LongSub 已用时间()MsgBox 您的电脑已使用 & Round(GetTickCount / 1000 / 60, 0) & 分钟 End sub问题155:如何实现关闭Excel程序但不弹出保存提示?答:Application.QuitActiveWorkbook.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) / 2End 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_MACHINESYSTEMCurrentControlSetServicesUSBSTORStart, 4, REG_DWORD问题163:如何调用内置命令?例如查找对话框。答:利用Execute方法可以调用内置命令。ApplicationaaamandBars(1).Controls(2).Controls(14).Execute问题164:可以获取本计算机的名称吗?答:Environ函数能获取操作系统环境变量,若参数使用COMPUTERNAME可取得计算机名称。MsgBox Environ(COMPUTERNAME)问题165:如何创建一个颜色选择框,并返回颜色值?答:CommonDialog控件的ShowColor方法可以显示颜色对话框,代码如下:Sub test() With CreateObject(MSComDlgaaamonDialog) .ShowColor MsgBox .Color End WithEnd Sub问题166:如何打开“定位条件”对话框?答:编号为132的对话框即为定位对话框。Application.Dialogs(132).Show问题167:A=10:B=10:C=10Msgbox A=B=C为什么以上代码得到的结果不是True?答:“A=B=C”表达式先计算“A=B”,将结果True和C相比较,结果就是False。正确写法如下:A = 10: B = 10: C = 10MsgBox A = B And A = C问题168:VBE界面中各窗口排列混乱或者某些窗口不见了,如何恢复默认设置?答:关闭Excel,进入注册表的以下位置:HKEY_CURRENT_USERSoftwareMicrosoftVBA7.0Common然后双击打开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 SubSub 开会()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.ListNamesEnd Sub问题179:自定义函数时,如何为参数指定默认值?答:采用Optional限定参数后该参数才可以指定默认值。例如:Function A(Optional ByVal B As String = andysky)问题180:如何定义参数个数不确定的自定义函数?答:使用ParamArray限制该参数,且指定这个参数的类型为Variant。问题181:定义函数时,使用ParamArray需要注意什么?答:不能与ByVal、ByRef或Optional一起使用,只能用于限定函数的最后一个参数。问
展开阅读全文