我在Excel 365中设计了一个工具,其中我想包括一种简单的方法,让用户通过VBA启动“插入->形状->Freeform: Shape”函数,通过菜单栏提供。这似乎是可能的,但在我的搜索中没有发现任何东西。
我已经看到可以使用VBA添加Freeform形状,但是它需要节点坐标,所以这不会有帮助,因为用户需要自己绘制形状。
我还在考虑使用Sendkey来模拟单击"Freeform: Shapes“,但是当按Enter或Space选择按钮时,它会导致一行被随机添加到工作表中,并且绘图功能不再可用。
任何关于这方面的想法都是欢迎的!
发布于 2021-01-13 23:57:57
以下代码将触发Freeform形状(如单击ShapeFreeform按钮)(在Win10上使用Office365 64位):Application.CommandBars.FindControl(ID:=200).Execute
编辑--在(##)下面的括号中标识的名称也可以在下面代码中的引号中使用,以触发按钮。CommandBars.ExecuteMso ("ShapeFreeform") (奇怪的是,"ShapeScribble“(ID:=409)似乎与”ShapeFreeform“完全相同)。
使用ActiveX命令按钮将工作,无论它触发的宏是在工作表代码中,还是工作表代码在模块中调用宏。
使用表单按钮触发此操作将不起作用(无论宏在工作表代码中还是模块中)。(不知道这是错误还是故意的)
为触发宏分配快捷键似乎是不可靠的,除非在使用执行行之前出现延迟。与零延迟,大多数“幽灵”对角线插入替代,这将消失,如果你切换到“页面布局视图”和回来。使用Application.Wait和1秒,它主要工作,但由于实际等待可能从(非常近)0到1秒不等,当它太短时,它将像上面那样失败。使用Application.Wait和2秒,它看起来是可靠的(因为等待从(接近)1到2秒)。
睡眠功能要精确得多,但它是对外部库的调用。对于这两种情况,请参阅How to pause for specific amount of time? (Excel/VBA) --我没有尝试睡眠,所以您必须尝试使用什么延迟才对您有效。
本质上,该代码将Excel放入“绘图模式”,其他类型也是可能的,如名为ShapeCurve的按钮,ID为1041。除非有人知道比这更简单的方法,否则识别按钮的ID可能是一项相当繁重的工作?:在丝带上悬停在想要的按钮上,直到名称弹出并记住它>在第一栏中单击"Customise“>>在第一列中单击”所有命令“(并非所有标签)>>在字母列表中找到记住的名称,然后在上面悬停直到信息弹出。按钮的实际“代码”名称将位于方括号(##)中。再一次记住这个。>通过搜索"office命令标识符“在线查找。一个很好的来源是"https://github.com/OfficeDev/office-fluent-ui-command-identifiers"。选择您的办公版本,然后使用的产品(在我们的情况下,excel.使用excelcontrols.xls),然后搜索记住的名称,以找到“策略ID”号码。
(请注意,前面提到的代码只能“单击”部分按钮ID。另一些则需要不同的方法和/或参数)。
https://stackoverflow.com/questions/65709864
复制相似问题