复制图像 - Excel VBA

时间:2013-03-11 18:17:50

标签: excel vba copy image

概要 -

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


状况:

我使用的是Windows 7,Excel 2010。

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

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

有时,单个形状需要显示几个不同图片中的一个。我想将图片数据从“库”图片(嵌入另一个形状,隐藏在用户中)复制到该目的地,但我可以通过简单地交换图片对象来解决这个问题。

但是,有时UI中的多个形状需要显示相同的图像,即使在保留其唯一数据(名称,ID,大小,可见性,标题等)时也是如此。关于那个“交换”技巧是令人望而却步的 - 我必须创建每个“库”对象的五十个副本,一个用于UI中可能需要对该外观进行处理的每个实例。< / p>


迫切要求:

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


问题:

我找不到怎么做。

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

CopyPicture()然后粘贴()似乎仅在Paste()的目标是地址(例如Range(“A1”))时起作用,然后它创建 new 图片对象。但我不想要一个新对象,我不想粘贴到一个单元格中。我想用另一个图片对象的图像数据覆盖现有图片对象的图像数据。

Duplicate()和类似的例程是上面的变体 - 它们创建了一个 new 图片对象。我有特定的事件等与现有的对象绑定,目标对象,我正在尝试更改其图像数据,因此我必须更改图像,而不是每次都用一些新创建的对象替换它。

LoadPicture() - 通过硬盘驱动器而不是剪贴板(较慢,因此,不太理想)似乎不适用于形状对象,只有OLEObjects。我是否必须将所有图片对象更改为ActiveX图像?对静态图片来说,这是一大笔开销!而且我期待所有的磁盘读数和写作会明显地陷入困境。

ActiveX - 我可以将这些图片对象更改为activeX图像对象,然后更改'library'对象,然后使用一个assignement(Shapes(“Name”)。DrawingObject.Object.Picture = Shape(“Library”)。 DrawingObject.Object.Picture)。 [这种方法与这里的方法一致 - Excel VBA: Copying Pictures from image controls to activeX objects]我不确定我能否为我的情况做出这样的工作。我不仅已经设计了大量的UI来利用Shape / Pictures所具有的特性和功能,而OLEObjects没有(例如3d格式化和'fill'在图片对象上的特定方式),而且还操纵OLEObjects是显着比操作简单图片慢,在我的实现中,足以让用户感到沮丧。 (这是我在早期开发阶段使用OLEObjects的主要原因之一。]


基本上,我想做一个等同于右键点击图片对象的“更改图片”命令(除了从另一个图片对象获取图像数据,或者,如果需要,从剪贴板获取图像数据)在磁盘上)。但是,当我录制该动作的宏时,它显示为空 - 显然“更改图片”不会产生任何宏代码。

一大堆网页搜索和文档浏览没有出现任何其他内容。


嗯....帮忙?

1 个答案:

答案 0 :(得分:2)

我不想这么说,但我认为你已经把自己画成了这个角落的一个角落。 Excel的对象不支持以您描述的方式修改图片数据,这意味着您无法在工作表打开时进行这些更改。即使您弄清楚如何更改原始文件,它也不能满足您的UI要求。

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