概述-
我需要将一个嵌入在一个Excel图片对象中的图像(.png格式)复制到另一个现有的图片中(覆盖其图像数据),同时保留目标形状的身份和字段(位置、可见性、大小、标题等)。这是针对简单的图片,而不是ActiveX OLEObject。
情况:
我使用的是Windows 7,Excel 2010。
我有一个包含多个图片对象的工作表。
根据用户的设置,显示的图片需要频繁更改。我已经设置了触发器等等。
有时,单个形状需要显示几个不同的图片。我想只需从“库”图片(嵌入在另一形状中,对用户隐藏)中复制图像数据到目标位置,但我可以通过简单地替换图片对象来解决这个问题。
然而,有时界面中的多个形状需要显示相同的图像,同时保留它们各自的唯一数据(名称、ID、大小、可见性、标题等)。这种“交换”技巧是禁止的-我必须为UI中每个可能需要采用该外观的实例创建五十个副本的每个“库”对象。
期望:
所以我希望能够简单地拥有那些图片的一个库副本,并能够将该图像复制到集成到UI中的图片对象中。
问题:
我找不到如何做到这一点的方法。
在VBA数据结构内部,我找不到任何对应于图片对象的“图像”部分的字段。
CopyPicture()然后 Paste() 似乎仅在将Paste() 的目标设置为地址(例如 Range("A1"))时才起作用,然后它会创建一个新的图片对象。但是我不想要一个新对象,我也不想粘贴到单元格中。我想用另一个图片对象的图像数据覆盖现有图片对象的图像数据。
Duplicate()及类似例程是以上操作的变体,它们创建一个新的图片对象。我有特定的事件等与现有对象绑定,即要更改其图像数据的目标对象,因此我必须更改它的图像,而不是每次都用一些新创建的对象替换它。LoadPicture() - 它通过硬盘而不是剪贴板(速度较慢,因此不太理想)似乎不能在形状对象上工作,只能在OLEObjects上工作。我需要将所有这些图片对象都转换为ActiveX图像吗?对于静态图片来说,这是很大的开销!并且我期望所有的磁盘读写会明显地拖慢表格。
ActiveX - 我可以将这些图片对象更改为ActiveX图像对象,然后更改'库'对象,然后使用分配(Shapes("Name").DrawingObject.Object.Picture = Shape("Library").DrawingObject.Object.Picture)。[ 这种方法类似于这里的方法 - Excel VBA:从图像控件复制图片到ActiveX对象 ] 我不确定我是否可以使其适用于我的情况。我已经设计了许多UI来利用Shape / Pictures具有而OLEObjects没有的特性和功能(例如3D格式和'填充'在图片对象上工作的特定方法),而且操作OLEObjects比操作简单图片明显慢,对于用户来说足够让人沮丧。(这是我在开发的早期阶段切换到不使用OLEObjects的主要原因之一。)
本质上,我想做的就是当右键单击图片对象时得到的“更改图片”命令的等效操作(除了从另一个图片对象或必要时从剪贴板获取图像数据,而不是从磁盘文件获取)。但是当我记录该操作的宏时,它出现为空白 - 显然,“更改图片”没有生成任何宏代码。
大量的网络搜索和文档浏览都没有找到其他的内容。
嗯....求助?