以下是引用sylun在2007-5-19 16:59:04的发言:学习本帖时遇到几个问题,请赐教: sylun兄很认真! 我来解释一下: 1:Word.CommandBars("DRAWING").Controls(15).Controls(4).Execute为简易用法,实际上并不是特别规范,如果用户的绘图工具栏有自定义的命令、按钮时(在第15个控件之前),则会出现错误。可以使用两种方法,比如: Word.CommandBars("DRAWING").Controls("填充颜色(&F)").Controls("其他填充颜色(&M)...").Execute 这种方法将命令定位了(指定的命令的名称),显示,如果是英文版或者其他语言版本,还必须使用相应的名称,可见,这种方法也不是完全的。正规的,可以使用命令的ID属性来定位,ID是Word赋于每个内置命令(命令栏控件:CommandBarButton、CommandBarComboBox 和 CommandBarControl )特有的唯一索引号,ID号决定的命令的动作,自定义命令的ID号均为1。 则: Word.CommandBars.FindControl(ID:=1051).Execute 那么,如果快速知道目标控件的ID属性呢?当然还是用上述的方法返回更快一些,Msgbox Word.CommandBars("DRAWING").Controls(15).Controls(4).ID,如果您的工具栏与我的不一致的话,可以调整一下Controls的索引号,可以通过CommandBars("DRAWING").Controls(15).Caption来知道是否正确。 2:所有原因来缘于Sendkeys方法的理解. SendKeys方法是向当前活动窗口发送键盘消息。简单的理解一下当前窗口,那就是在活动窗口中用户唯一可以和计算机交换信息的窗口,如果我们在WORD中键入文本时,当前窗口是WORD应用程序,如果我们在WORD应用程序下,打开了“打开对话框”,则当前窗口活动窗口是“打开对话框”,就象是使用“ALT+PrintScreen Sys Rq”捕捉活动屏幕一样的。那么这个宏过程,正确的运行方式,应该将宏名指定的工具栏中,或者ALT+F8在Word应用程序窗口中运行。理论上说,在VBE窗口下,仍然可以正确运行,原因在于我们的目标活动窗口是“颜色”对话框,我能顺利的在VBE窗口下运行此宏,但由于电脑设置和配置的不同,Sendkeys发送消息的提前或者滞后,都将影响程序的正确运行。 3:关于GetmyColor过程,最关键的技术是: Word.CommandBars.FindControl(ID:=1051).Execute 支撑它的是: VBA.SendKeys "{TAB}", False VBA.SendKeys "{RIGHT " & D & "}", False VBA.SendKeys "{ENTER}", False 我非常欢喜使用Sendkeys的Wait参数,False,我总结为预置,这在我先前很多的贴子中可以搜索到。 取得七彩颜色,最核心的代码是: With myShape .IncrementRotation 90# .Fill.ForeColor.RGB = VBA.RGB(0, 51, 102) If D = 0 Then .SetShapesDefaultProperties也就是说,在绘制了一个倒正六边形后,必须给它设置一种颜色,这种颜色,是"颜色对话框"中的第一种颜色,并且,把它设置为默认图形格式,它是一种定位,VBA每次添加一个六边形后,"颜色对话框"总是定位在第一个控件上,便于后续的持续操作. 其他的两个循环,只是逻辑与数学上的判断. |