Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制图像-Excel VBA_Excel_Vba_Copy_Image - Fatal编程技术网

复制图像-Excel VBA

复制图像-Excel VBA,excel,vba,copy,image,Excel,Vba,Copy,Image,概要- 我需要将嵌入一个Excel图片对象中的图像(.png格式)复制到另一个现有图片中(覆盖其图像数据),同时保持目标形状的标识和字段(位置、可见性、大小、标题等)完好无损。这是简单的图片,而不是ActiveX对象 情况: 我使用的是Windows7,Excel 2010 我在UI中有一个包含多个图片对象的工作表 根据用户的设置,显示的图片需要经常更改。我已经准备好了触发装置等等 有时,单个形状需要显示多个不同图片中的一个。我只想将图片数据从“库”图片(嵌入另一个形状,对用户隐藏)复制到该目

概要-

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


情况:

我使用的是Windows7,Excel 2010

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

根据用户的设置,显示的图片需要经常更改。我已经准备好了触发装置等等

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

但是,有时UI中的多个形状需要显示相同的图像,即使保留其唯一的数据(名称、id、大小、可见性、标题等)。“交换”技巧是禁止的——我必须为每个“库”对象创建50个副本,为UI中可能需要呈现这种外观的每个实例创建一个副本


要求:

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


问题:

我不知道怎么做

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

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

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

LoadPicture()-它通过硬盘而不是剪贴板(速度较慢,因此不太理想)似乎对形状对象不起作用,只对形状对象起作用。我是否必须将所有这些图片对象更改为ActiveX图像?这对于静态图片来说是一个很大的开销!我预计所有的磁盘读写操作都会让工作表陷入明显的困境

ActiveX-我可以将这些图片对象更改为ActiveX图像对象,然后更改“库”对象,然后使用赋值(Shapes(“名称”).DrawingObject.Object.picture=Shape(“库”).DrawingObject.Object.picture)。[这种方法与这里的方法类似-]我不确定我能不能让这种方法适合我的情况。我不仅已经设计了很多UI,以利用Shape/Pictures拥有和OleObject没有的特性和功能(例如3d格式和“填充”在图片对象上的特殊方式),而且在我的实现中,操作OleObject明显比操作简单图片慢,让用户感到沮丧。(这是我在开发的早期阶段放弃使用OLEObjects的主要原因之一。)


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

大量的网络搜索和文档浏览都没有发现其他任何东西



嗯……帮助?

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


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

您是在Windows计算机上还是在Mac OS下进行此操作。结果表明,对于此类操作,它们的行为方式并不完全相同(非常感谢Microsoft)…您正在使用的Excel版本是什么?您签出了吗?它需要Excel 2010来创建工作表,但一旦您有了工作表,它似乎也可以在Excel 2007中工作。您是否查看了Shape.Duplicate?感谢到目前为止的响应者:
*版本/机器-抱歉,应该添加该版本。Windows,Excel 2010。

Shape.Duplicate-u幸运的是,这只是创建了一个新的形状,本质上是复制/粘贴的简写。“目的地”变量是一个范围:即,它将新副本定向到特定单元格。我需要覆盖现有图片中的图像数据。
*excel.tips:技巧不错,但遗憾的是不适合我。我正在移动这些形状,不依赖单元格位置;除了重写工作表,唯一的解决方案是将图像复制到现有图片中g shape object.Update-我现在尝试通过创建一个包含位于shape对象上的acitveX图片的组对象来解决这个问题。这使我能够实现UI所需的两种行为,尽管代价是更多的VBA编码(没有什么大不了的)和三倍的Excel对象数量(比其他方法更好)。但是,正如预期的那样(和早期版本的工作表一样),拖动此组对象(使用ActiveX图片控件)比拖动简单形状要慢得多,也要慢得多。动态更改常规图片对象的图像仍然是理想的解决方案