【问题标题】:How to get Shape's internal name in Excel如何在 Excel 中获取 Shape 的内部名称
【发布时间】:2010-09-19 08:12:23
【问题描述】:

当使用 Shapes.AddPicture(...) 方法将图片插入 Excel 工作表时,Excel 会自动为其命名“图片 1”、“图片 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. 如果我带身份证,我将无法从中获取图片参考

对我来说,获得内部名称很重要。我有 Shape 参考,但不知道如何从这个参考中获取内部名称。

【问题讨论】:

    标签: excel shapes vba


    【解决方案1】:

    将形状添加到工作表 (oSht) 后,您可以立即使用 oSht.Shapes(Osht.Shapes.count) 来引用它。 所以,oSht.Shapes(osht.shapes.count).Name 会给你它的名字。

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

    如果用户将形状移动到不同的工作表然后重命名它,则无法将其识别为原始形状,因为外部名称、备用名称、形状索引和 ID 都会不同。因此,如果这是您的方案中的问题,您需要考虑卷影复制或工作表保护。

    【讨论】:

    • +1:“如果您知道索引,那么您可以构造“图片 n”替代名称” - 这可能并不总是正确的,因为如果从 Shapes 集合中删除索引 2 处的图片,我们可能在索引 2 处有“图片 3”。我认为内部名称不会更改以匹配索引。
    • 如果我在 VBA 中添加一个 Shape,Shapes.AddPicture(...) 的返回值会给我它的引用,所以这里不需要做 Shapes(Count)。此外,对于新创建的对象,内部名称和显示名称将相同,因此 shape.Name 将在那时起作用。问题是如何在以后使用 Shape 引用获取该内部名称(用户可能已经更改了显示名称)
    • 如果你有一个对形状对象的有效引用,那么 Shape.name 会给你它的外部名称。
    • 如果你有一个对形状对象的有效引用,那么 Shape.name 会给你它当前的外部名称,即使用户已经改变了它。如果您知道内部名称(图片 n),那么您可以引用该对象及其外部名称。如果您没有有效的参考或其内部名称,并且用户删除了形状、移动了形状并更改了形状的名称,则无法找到您想要的原始形状。
    • 或者您可以使用 Shape.ID 属性
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2018-08-30
    • 2018-07-19
    相关资源
    最近更新 更多