如何在Excel中获取形状的内部名称

9
当使用Shapes.AddPicture(...)方法将图片插入Excel工作表时,Excel会自动赋予它名称“Picture 1”,“Picture 2”等。可以使用此名称在Shapes集合中获取对该形状对象的引用,例如Shapes.Item("Picture 1")。如果在Excel中使用名称框更改名称,则可以通过两个不同的名称(或其中一个是键/标题)引用Shape对象。因此,如果我将名称更改为“MyPic”,则可以使用以下任何一个引用Shapes集合中的形状:
Shapes.Item("Picture 1")
OR
Shapes.Item("MyPic")

在VBA中,可以使用Shape.Name属性访问名称,但我们如何访问似乎不会在内部更改的其他值(MyPic)?
更新:
我想做的是在Excel中将单元格链接到图片。我将图片数据保存在单元格备注中。以下是几种情况:
  1. 如果保留图片名称(外部名称),则在同一工作表上复制粘贴结构将重复名称,并且单元格将指向相同的结构。
  2. 如果保留内部名称,则将其复制粘贴到其他工作表时会出现问题,因为同一工作簿中可能存在相同的内部名称。
  3. 如果采用ID,则无法从中获取图片引用
对我来说,获取内部名称很重要。我有形状引用,但不知道如何从此引用中获取内部名称。
1个回答

8

在将形状添加到工作表(oSht)后,您可以使用oSht.Shapes(oSht.Shapes.count)来引用它。

因此,oSht.Shapes(oSht.Shapes.count).Name将给出其名称。

如果您想要查找Shapes集合中的形状的索引,并且您知道其名称,则需要循环遍历Shapes.Name直到找到它。如果您知道索引,则可以构造“Picture n”替代名称,或者您可以存储“Picture n”替代名称。您还可以存储形状的ID属性,然后通过循环遍历Shapes集合直到找到Shape.ID来引用该形状。

如果用户将形状移动到其他工作表并重命名它,则无法将其识别为原始形状,因为外部名称、替代名称、Shapes索引和ID都将不同。因此,如果这是您场景中的问题,则需要考虑阴影复制或工作表保护。


如果您知道索引,那么您可以构造“Picture n”替代名称 - 这可能并不总是正确的,因为如果从Shapes集合中删除了索引2处的图片,则我们可能会在索引2处有“Picture 3”。我认为内部名称不会更改以匹配索引。 - A9S6
如果我在VBA中添加一个形状,Shapes.AddPicture(...)的返回值将给我它的引用,因此这里不需要执行Shapes(Count)。此外,对于新创建的对象,内部名称和显示名称将是相同的,因此shape.Name将在那时起作用。问题是如何在以后使用Shape引用获取该内部名称(用户可能已更改显示名称)。 - A9S6
如果您拥有一个有效的形状对象引用,则 Shape.name 将为您提供其外部名称。 - Charles Williams
如果您有一个有效的形状对象引用,那么Shape.name将给出其当前的外部名称,即使用户已更改它。如果您知道内部名称(Picture n),则可以引用对象及其外部名称。如果您既没有有效的引用也没有其内部名称,并且用户已删除形状、移动形状和更改形状的名称,则无法找到所需的原始形状。 - Charles Williams
你可以使用Shape.ID属性。 - Charles Williams
Shape.ID属性无法从集合中获取Shape引用。我已经更新了问题,包括我正在尝试解决的原始问题。 - A9S6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接