【问题标题】:Determine Image in Excel Comment确定 Excel 注释中的图像
【发布时间】:2014-06-09 09:02:43
【问题描述】:

我发现了很多用于在评论中插入图像的 vba

Selection.ShapeRange.Fill.UserPicture "C:\Temp\Pictures\ewe.jpg"

如何确定已用于评论的图像?

如果可能,我想提取嵌入的图像名称。

没有可以访问的属性可以给我这个吗? 在评论填充效果对话框中,图像名称似乎可以访问。

【问题讨论】:

  • 我还没有找到直接的方法,但如果您只是制作一个列表,您可以将文档保存为网页 (.htm),然后在文本编辑器中打开 Sheet001.htm 文件并图片标题将被保留。但是,图像路径和名称已更改。我知道这很痛苦,但也许它会引导你走向正确的方向。
  • 你用的是哪个版本的excel?
  • 可以使用这些版本中的任何一个。 2003-2010 年?我意识到我可以访问嵌入的图像,但我需要将嵌入的图像名称与相邻单元格中的文本相关联,以找到它所代表的相关产品
  • 我认为没有记录的方法来检索图片/纹理的图片文件名。就像我关于a Shape's Gradient in PPT 的第一个 SO 问题一样,VBA 无法将形状的渐变设置为 UI 中的某个选项。
  • 建议您使用其他方式存储这些图像的实际文件夹和文件路径。例如。 .Comment.Shape.AlternativeText。此名称和图片仅与 Excel 文件中的一些 xml 文件相关。

标签: excel vba


【解决方案1】:

抱歉,我没有资格对您的问题发表评论以进行澄清。

我制作了一个测试文件,在该评论中插入了评论和图像,然后提取了基础文件。然后我检查了它们的原始文件名。我还找到了嵌入的 JPEG 并将其解码以获取元数据。正如您所指出的,原始文件名存储在 xl\drawings\vmlDrawing1.vml 中(一旦您通过将 .zip 附加到文件名然后在其上运行解压缩实用程序从 excel 文件中提取了 xml 文件)。我确实找到了文件名,但没有找到路径或文件类型,所以我相当确定路径和文件类型没有被保留。

如果只是文件名对您来说就足够了,那么该文件包含您拥有的每张图纸的信息,并且这些信息将包括单元格位置,尽管它们是基于 0 的,因此您必须添加一个才能获得实际的行和列。我的问题分为两部分:

1) 仅文件名就足够了,还是您需要整个路径?如果您需要整个路径,我认为您很不走运,因为这些路径位于另一台计算机上,如果您提取文件名,您甚至无法搜索它们。

2) 如果这就是您所需要的,那么解决方案是否必须是 VBA?过去,我以编程方式解压缩并操作了 xml 基础文件,但这有点棘手。由于您只需要读出数据,因此简化了它,所以这是一个加号。我之前在 .net 中做过,但我敢肯定,如果它必须是 VBA,它可以做到,但如果您对解决方案类型持开放态度,它会更简单。

告诉我,我很乐意为您提供帮助。

================================================ ======================================

试试这个:制作电子表格的副本,附加 .zip (test.xlsm.zip),然后手动提取文件。将 vmlPath 更改为 xl\drawings\vmlDrawing1.vml 文件的位置。然后运行这个。我确实做了一些假设,例如,我假设节点和属性的顺序总是相同的,所以我使用硬编码索引(shp.attributes(0) 等)而不是使用逻辑来确保我有正确的节点或属性,但您似乎了解 VBA 的方式,所以我将编写一个准系统代码。这需要引用 Microsoft XML 6.0。

Sub vmlParse()

    Dim vmlPath As String: vmlPath = "C:\Users\Lenovo\Desktop\test - Copy.xlsm\xl\drawings\vmlDrawing1.vml"
    Dim this As Worksheet: Set this = ActiveSheet
    Dim doc As New DOMDocument, shps As IXMLDOMNodeList
    Dim shp As IXMLDOMNode, n As IXMLDOMNode, a As IXMLDOMAttribute
    Dim fileName As String, productID As String
    Dim rng As Range, r As Long, c As Long

    doc.Load vmlPath

    Set shps = doc.getElementsByTagName("x:ClientData")
    For Each shp In shps

        If shp.Attributes(0).nodeValue = "Note" Then

            r = 0: c = 0

            For Each a In shp.ParentNode.FirstChild.Attributes
                If a.nodeName = "o:title" Then
                    fileName = a.nodeValue
                    Exit For
                    End If
                Next

            For Each n In shp.childNodes

                If n.nodeName = "x:Row" Then r = n.text
                If n.nodeName = "x:Column" Then c = n.text

                Next

            Set rng = this.Cells(r + 1, c + 1)
            productID = rng.Value

            'now you have the productID, the fileName, and the cell location

            End If
        Next

End Sub

让我知道你的效果如何。

【讨论】:

  • productid 在评论所在的单元格中。如果您可以提取与单元格地址关联的图像,我可以重建原始图像名称或可用的图像名称。这可能是几千条记录。我愿意接受建议。希望使用 vba,因为它看起来应该很容易。但我对任何想法持开放态度
  • 好吧,现在我想起来了,您可能可以使用shell 来执行解压缩实用程序,然后使用一些文件i/o 来读取它,但您说它只是一个文件?在这种情况下,只需手动解压缩文件,然后:在像 Notepad++(我一直使用的)这样的文本编辑器中使用正则表达式来获取名称和行号,或者,使用 msxml 在 VBA 中解析 xml,这给出能够在同一循环中将数据写入工作表或工作簿中的其他位置的优势。如果它是一本工作簿并且您可以分享它,我可能会在几分钟内为您写出脚本。
  • 嘿,看看我写的短宏。它假定一个工作簿并手动解压缩。让我知道这是否是你所追求的。
  • 我什至没有时间尝试这个,但它看起来很有希望。会让你知道。非常感谢您的意见
  • 不得不将 doc As New DOMDocument 更改为 doc As New DOMDocument60。我被困在这个问题上,因为它让我在 For Each shp In shps 中脱颖而出。显然 shp As IXMLDOMNode 是一个问题,我一直忙于工作,甚至可以对其进行故障排除。我真的很感激你的工作,因为看起来这会让我到达那里。
【解决方案2】:

如果 c4 包含您的评论:

Set shp = Range("C4").Comment.Shape
     if shp.Fill.TextureType = msoTextureUserDefined then

end if

【讨论】:

  • 欣赏输入。如何从中确定分配的图像名称?那是我缺少的部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
相关资源
最近更新 更多