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