如何使用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_clickmacros指定给每个形状。 现在,当你点击一张图片(或其他形状)时,它会在前面。

注意 – 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它。 对于这种方法有些事要说。

对于每个形状,分配BringToFrontmacros,然后将以下内容放入模块中

 Sub BrintToFront Selection.ShapeRange.ZOrder msoBringToFront end sub 

将此macros分配给所有形状:

 Sub lux() ActiveSheet.Shapes(Application.Caller).ZOrder msoBringToFront End Sub