在 Excel VBA 中命名对象,以便将其复制到另一张工作表/工作簿后可以选择它

在 Excel VBA 中命名对象,以便将其复制到另一张工作表/工作簿后可以选择它

我正在业余地在 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

相关内容