我正在业余地在 Excel 中组合宏/VBA。它涉及从 Source.xlsx 复制一张不同语言的图例图像,并将其粘贴到 Destination.xlsx 中。图像就是这样,它不再是图表中的对象。
下面的代码有效。但是,我现在尝试对齐新图像,以便它替换 Destination.xlsx 中的旧 xlamLegendGroup。目前我只是将其粘贴到附近的单元格(“AO6”)中并手动移动它。
我的问题是,一旦图像位于 Destination.xlsx 中,我就无法选择它。如果可以的话,我肯定可以弄清楚如何将这些 X 和 Y 值包含到我的 VBA 中。
我尝试使用名称管理器命名它,但我的代码无法识别它。我甚至尝试在选择期间在 VBA 中命名它,但我只是得到错误和不正确的方法等。(就像我说的,对 VBA 的理解是业余水平的)
如果你们能帮助我解决这个命名并重新选择的问题,我将不胜感激。
从源工作簿复制图片。这是工作表上唯一的图片,因此我可以通过这种方式选择它
Workbooks("MyWkbSource.xlsx").Sheets("LEGEND_AVG").Activate
ActiveSheet.DrawingObjects.Select
Selection.Copy
激活目标工作簿并粘贴图像。我希望将其与即将删除的图像对齐(通过将其置于顶部中央)。
Workbooks(MyWkbDestination.xlsx").Sheets("AVG").Activate
ActiveSheet.Range("AO6").Select
ActiveSheet.Paste
我选择现有的旧图像并将其删除
ActiveSheet.Shapes.Range(Array("xlamLegendGroup")).Select
Selection.Delete
答案1
当您粘贴图像时,它可能会被赋予名称Picture #
,其中# 如果该项目已存在则增加 1。
因此,您粘贴的第一张图片应称为Picture 1
。您可以使用以下命令找出文档中当前图像的名称:
For Each Shape In ActiveSheet.DrawingObjects
MsgBox Shape.Name
Next
这将循环遍历每一个并将其显示在消息框中。
由于您只是粘贴一个对象,因此在同一次扫描中对其进行操作并不容易。您可以使用上面的循环来查找最后一个Picture #
,然后您就会知道下一个粘贴的对象将是 #+1,并且可以根据需要使用更改名称ActiveSheet.Shapes.Range(Array("Picture #+1")).Name
。
您还可以根据需要使用.Top
和.Left
移动图像,以及使用.Height
和调整图像大小。.Width
答案2
每当你复制一个对象(说一个形状)从一个工作表到另一个工作表或从一个工作簿到另一个工作簿,您可以通过检查其在。数数。 例如:
Sub CopyShape()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim shp1 As Shape, shp2 As Shape
Set sh1 = Sheets("Sheet1")
Set sh2 = Sheets("Sheet2")
Set shp1 = sh1.Shapes(1)
shp1.Copy
sh2.Paste
Set shp2 = sh2.Shapes(sh2.Shapes.Count)
shp2.Name = "Most recent Shape on Sheet2"
End Sub
复制完成后,放置在目标上的最新形状将出现在该目标上的形状列表的最后。
答案3
只需使用自定义名称命名形状即可。避免在名称后使用数字。
例如:矩形 1 更改为 > MyRectangle