场景:我在一个工作表中有大量图像,其中许多图像彼此重叠。
如何编写 VBA 代码,以便当用户点击该工作表中的任何图像时, Excel 会自动将该图像放到前面?
答案 0 :(得分:4)
如果您想要将对象myObject
带到前面,请使用
myObject.ShapeRange.Zorder msoBringToFront
http://msdn.microsoft.com/en-us/library/office/aa213680(v=office.11).aspx
您的对象可能是选择:
set myObject = Selection
至于响应点击 - 这更棘手。对于"选择图片"似乎不是一个事件。 。但 是一个解决方案......
您可以创建一个名为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
您只需运行一次connect_all
sub,即可将picture_click
宏指定给每个形状。现在,当您点击图片(或其他形状)时,它会出现在前面。
注意 - Application.Caller
会告诉您点击了哪个对象 - 换句话说,是什么导致了picture_click
的调用。这是必要的,因为"点击"不会导致图片被选中 - 在宏运行后发生。所以你不能只使用这个选择。整蛊,那个。
我引用了this earlier post来提出这个解决方案 - 特别是RichJ的解决方案。
<强>事后强>
如果您不希望在点击图片后选择图片,则可以将picture_click()
子修改为以下内容:
Sub picture_click()
ActiveSheet.Shapes(Application.Caller).ZOrder msoBringToFront
End Sub
这会将图片移到前面但不会选中它。这种方法有待说明。
答案 1 :(得分:0)
对于每个形状,分配BringToFront
宏,然后将以下内容放入模块
Sub BrintToFront
Selection.ShapeRange.ZOrder msoBringToFront
end sub
答案 2 :(得分:0)
将此宏指定给所有形状:
Sub lux()
ActiveSheet.Shapes(Application.Caller).ZOrder msoBringToFront
End Sub