如何使用VBA将选定的图像移到前面
情景:我在一张工作表中有大量的图像,其中很多图像是相互重叠的。
我怎样才能编写一个VBA代码,当用户点击该工作表中的任何图像时, Excel将自动将该图像放在前面?
如果你有一个对象myObject
,你想把它带到你使用的前面
myObject.ShapeRange.Zorder msoBringToFront
http://msdn.microsoft.com/en-us/library/office/aa213680(v=office.11​).aspx
你的对象可能是例如select:
set myObject = Selection
至于响应点击 – 这是棘手的。 似乎没有“select图片”的事件。 但有一个解决scheme…
您可以制作一个名为Picture_click()
macros,并将该macros分配给每张图片。 似乎没有一个事件驱动的方式来实现这一点,但以下工作:
将以下内容添加到模块中:
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
macros指定给每个形状。 现在,当你点击一张图片(或其他形状)时,它会在前面。
注意 – Application.Caller
告诉你什么对象被点击 – 换句话说,是什么导致了对picture_click
的调用。 这是必要的,因为“点击”不会导致图片被选中 – 这发生在macros运行之后。 所以你不能只使用select。 狡猾,那个。
我引用这个早先的post来提出这个解决scheme – 具体来说,RichJ的解决scheme。
事后
如果您不想在点击图片后select图片,则可以将picture_click()
子项修改为以下内容:
Sub picture_click() ActiveSheet.Shapes(Application.Caller).ZOrder msoBringToFront End Sub
这将把图片移到前面,但不会select它。 对于这种方法有些事要说。
对于每个形状,分配BringToFront
macros,然后将以下内容放入模块中
Sub BrintToFront Selection.ShapeRange.ZOrder msoBringToFront end sub
将此macros分配给所有形状:
Sub lux() ActiveSheet.Shapes(Application.Caller).ZOrder msoBringToFront End Sub