复制图像 – Excel VBA

概要-

我需要将一个Excel图片对象中embedded的图像(.png格式)复制到另一个现有图片(覆盖其图像数据),同时保留目标形状的身份和字段(位置,可视性,大小,标题等)。 这是与简单的图片,而不是ActiveX OLEObjects。


情况:

我在Windows 7,Excel 2010中。

我有一个在UI中有多个图片对象的工作表。

根据用户的设置,显示的图片需要经常更改。 我已经触发了所有的设置。

有时,一个形状将需要显示几个不同的图片之一。 我只想从“库”图片(embedded另一个形状,隐藏的用户)的图片数据复制到目的地,但我可以解决这个问题,只需换入和退出图片对象。

不过,即使在保留其独特数据(名称,ID,大小,可视性,标题等)的情况下,UI中的多个形状也需要显示相同的图像。 这个“交换”技巧是令人望而却步的 – 我必须创build50个每个“库”对象的副本,每个实例在UI中可能需要采取这种外观。


迫切要求:

所以我想要做的只是将这些图片的一个库副本,并能够将该图像复制到集成到UI中的图片对象。


问题:

我找不到如何做到这一点。

我找不到对应于图片对象的“图片”部分的VBA数据结构中的任何字段。

只有当Paste()的目的地是一个地址(例如Range(“A1”))时,CopyPicture()然后Paste()才会起作用,然后创build一个新的图片对象。 但是我不想要一个新的对象,我不想粘贴到一个单元格中。 我想用另一个图像对象的图像数据覆盖现有图像对象的图像数据。

重复()和类似的例程是上面的变化 – 它们创build一个新的图片对象。 我有特定的事件等绑定到现有的对象,目标对象,其图像数据我试图改变,所以我不得不改变它的形象,而不是每次更换一些新创build的对象。

LoadPicture() – 通过硬盘驱动器而不是剪贴板(较慢,因此不太理想)似乎不适用于形状对象,只有OLEObjects。 我是否必须将所有这些图片对象转换为ActiveX图像? 这是静态图片的一大堆开销! 而且我希望所有的磁盘读写都能让你明白地看到这个表格。

ActiveX – 我可以将这些图片对象改变成activeX图片对象,然后更改“图书馆”对象,然后使用指定(Shapes(“Name”))DrawingObject.Object.Picture = Shape(“Library”)。DrawingObject.Object 。图片)。 [这种方法是沿着这里的方法 – Excel VBA:从图像控件复制图片到activeX对象 ]我不知道我可以为我的情况做出这项工作。 我不但已经devise了很多UI,以利用Shape / Pictures所具有的特性和function,而且OLEObjects不具备这些特性和function(比如3D格式化和“填充”的特定方式在图片对象上工作),而且操作OLEObjects 明显比操纵简单的图片要慢,在我的实现中,足以使用户感到沮丧。 (这是我在开发的早期阶段转换使用OLEObjects的主要原因之一。]


从本质上讲,我想要做的是当右键单击一个图片对象时得到的“更改图片”命令(除了从另一个图片对象获取图像数据,或者如果需要的话,剪贴板,而不是从磁盘上的文件) 。 但是当我logging这个动作的macros时,它会出现空白 – 显然“更改图片”不会产生任何macros代码。

一大堆网页search和文档浏览还没有出现。


恩……帮忙?

我讨厌这样说,但我想你已经把自己涂在了这个angular落。 Excel的对象不支持以您描述的方式修改图片数据,这意味着您无法在工作表打开时进行这些更改。 即使您想出了如何更改原始文件,也不能满足您的UI要求。

您的解决方法可能是您最好的(基于Excel)的答案。