12

概要-

我需要将嵌入在一个 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 的主要原因之一。]


本质上,我想做与右键单击图片对象时获得的“更改图片”命令的等效项(除了从另一个图片对象或必要时从剪贴板获取图像数据,而不是从磁盘上的文件) . 但是当我录制该动作的宏时,它会出现空 - 显然“更改图片”不会产生任何宏代码。

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


嗯....帮助?

4

1 回答 1

2

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

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

于 2013-03-26T11:51:05.560 回答