excel的365个常见问题答疑 - 答案(7) 2019-04-21 17:29 第 31页 /总 38页 第23章 365个常见问题答疑 答:顺序不重要,只要确保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: 第 32页 /总 38页 第23章 365个常见问题答疑 公式的计算速度快还是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: 能否实现单击超链接时,所链接的工作表属于隐藏状态也可以正常跳转到目标工作表? 答: 第 33页 /总 38页 第23章 365个常见问题答疑 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(\”会执行不成功? 答:跨表选择单元格时不能直接使用select方法,需要先选择工作表再选择单元格。 当然也可以改用Goto方法,代码如下: Application.Goto Sheets(3).Range(\问题321: 自定义函数的所有参数都可以全是可选参数吗? 答:可以,采用Optional将参数限定为可选,再对参数赋予默认值,而且在Function过程中必须指定所有参数皆为默认值时函数所对应的返回值。 问题322: 能用代码生成代码吗?即根据不同条件产生不同的代码,然后执行所产生的代码。 答:可以的。CodeModule.InsertLines方法配合IF语句使用即可,CodeModule.InsertLines方法的功能是在指定的位置插入一行代码。 问题323: 如何调用加载宏工作簿中的数据?例如A1的值。 答:和引用普通工作簿的数据一样,写上完整的路径即可,包括工作簿名称、工作表名和单元格地址: MsgBox [[自定义函数.xla]sheet1!a1] 问题324: VBA可以实现屏幕截图并插入到工作表中吗? 答:可以的,采用ExecuteMso方法调用内置命令ID即可(Excel 2010专用)。 Application.CommandBars.ExecuteMso (\问题325: 如何记录某个工作簿的开启次数? 答:如果记录本机开启次数,则在Open事件时使用SaveSetting将开启次数写入注册表中,逐一累加;如果不限机台,要求代码在任何机器中使用都能获取开启次数,则可以通过自定义工作簿的属性,在属性中累加开启次数。 问题326: 为什么将宏的安全性调低,保存文件时仍会出现“无法在未启用宏的工作簿中保存以下功能......”? 答:文件格式不正确,与宏的安全性无关。保存时选择xls或者xlsm皆可。 问题327: 为什么将宏的安全性调低后,代码仍然不执行,提示“不信任到Viisual Basic Project的程序连结”? 答:勾选“信任对VBA工程对象模型的访问”即可。 问题328: 为什么在“工程属性”对话框中录入查看工程属性的密码,且保存工作簿后仍然可以看到VBA代码? 答:工程加密在工作簿重启后才生效。 另一个可能性是输入密码后未勾选“查看时锁定工程”。 第 34页 /总 38页 第23章 365个常见问题答疑 问题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 \也可以调用脚本语言实现: CreateObject(\问题336: 如何关闭Excel程序且不提示保存工作簿? 答: Application.DisplayAlerts = False Application.Quit 问题337: 自定义函数时如何获取公式所在单元格的地址? 答:使用Thiscell表示调用函数的单元格,不过此函数只能在单元格中使用。如果用代码调函数将会出错。 Thiscell.address 问题338: “Userform1.show 0”代码中的0是什么意思? 答:0表示窗体显示为无模式,即开启窗体时仍然可以操作单元格;如果采用1则只有关闭窗体才可以选择单元格。 问题339: 当运体窗体时提示“显示有模式窗体时,不能显示无模式窗体”是什么意思? 第 35页 /总 38页 第23章 365个常见问题答疑 答:通常在已打开一个窗体后再调用另一个窗体时发生。当前窗体以模态方式显示,那么此时禁止以无模式方式调用另一个窗体,去除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 \” 问题345: 为什么“MsgBox True + 2”结果等于1? 答:在VBA中True的值为-1,在工作表函数中True的值为1。 问题346: 如何开启指定的网页? 答: Shell \或者: CreateObject(\问题347: 为什么本机调用日历控件生成日期可以正常运行,工作簿复制到其它机器后却不执行? 答:一种可能是OFFICE版本不同,它们的日历控件也会不同,所以不能执行。 另一种可能是另一台机没有日历控件。 问题348: 为什么自己的某些工作簿没有设置密码,却不能查看代码? 答:当工作簿共享后就不可以再查看代码。可以取消共享,编辑好代码后再共享,否则不能编辑。 问题349: 如何计算一个数组中的最大值? 答:VBA中没有函数可以计算最大值,但可以调用工作表函数MAX执行计算。例如: Msgbox WorksheetFunction.Max(Arr) 共8页: 上一页12345678下一页 excel的365个常见问题答疑 - 答案(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决! 下载这篇word文档