场景:我在一个工作表 \xef\xbc\x8can 中有大量图像,其中许多图像彼此重叠。
\n\n如何编写VBA代码,以便当用户单击该工作表中的任何图像时,Excel会自动将该图像置于前面?
\n如果您myObject想将一个对象带到您使用的前面
myObject.ShapeRange.Zorder msoBringToFront
Run Code Online (Sandbox Code Playgroud)
http://msdn.microsoft.com/en-us/library/office/aa213680(v=office.11).aspx
例如,您的对象可能是选择:
set myObject = Selection
Run Code Online (Sandbox Code Playgroud)
至于响应点击——那就更棘手了。似乎没有“选择图片”事件。但有一个解决方案...
您可以创建一个名为 的宏Picture_click(),并将该宏分配给每张图片。似乎没有事件驱动的方法来实现这一点,但以下方法有效:
将以下内容添加到模块中:
Sub picture_click()
ActiveSheet.Shapes(Application.Caller).Select
Selection.ShapeRange.ZOrder (msoBringToFront)
End Sub
Sub connect_all()
Dim sh As Shape
For Each sh In ActiveSheet.Shapes
sh.OnAction = "picture_click"
Next sh
End Sub
Run Code Online (Sandbox Code Playgroud)
您只需运行connect_all一次子程序,即可将picture_click宏分配给每个形状。现在,当您单击图片(或其他形状)时,它就会出现在前面。
注意 -Application.Caller告诉您单击了哪个对象 - 换句话说,是什么导致了对 的调用picture_click。这是必要的,因为“单击”不会导致图片被选择 - 这是在宏运行后发生的。所以你不能只使用选择。棘手的是。
我参考了之前的这篇文章来提出这个解决方案 - 具体来说,是 RichJ 的解决方案。
事后的想法
如果您不想点击图片后被选中,可以将picture_click()sub修改为以下内容:
Sub picture_click()
ActiveSheet.Shapes(Application.Caller).ZOrder msoBringToFront
End Sub
Run Code Online (Sandbox Code Playgroud)
这会将图片移到前面,但不会选择它。对于这种方法有一些话要说。