在Excel注释中确定图像

我发现大量的vba插入图像的评论

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

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

我想提取embedded的图像名称,如果可能的话。

有没有一个财产可以让我这个? 在注释填充效果对话框中,图像名称似乎是可以访问的。

在这里输入图像说明

对不起,我没有评论你的问题澄清的声誉。

我做了一个testing文件,在评论中插入了一个注释和图像,然后提取了基本文件。 然后我检查了所有的原始文件名。 我也find了embedded的JPEG,并解码它来获取元数据。 正如你已经注意到的,原始的文件名存储在xl \ drawings \ vmlDrawing1.vml中(一旦你从excel文件中提取了xml文件,把.zip文件附加到文件名上,然后运行一个unzip工具)。 我没有find文件名,但没有findpath或文件types,所以我相当确定path和文件types不被保留。

如果只是文件名就足够了,那么这个文件就包含了你所拥有的每个graphics的信息,这些信息将包含单元格的位置,虽然它们是基于0的,所以你必须添加一个才能得到实际的行和列。 我的问题是两部分:

1)文件名是否足够,还是你需要整个path? 如果你需要整个path,我认为你运气不好,因为path在不同的计算机上,如果你提取文件名,你甚至不能search它们。

2)如果这就是你需要的,解决scheme必须是VBA? 在过去,我已经以编程方式解压缩和操作xml基本文件,但这有点棘手。 这是简单的事实,你只需要读出数据,所以这是一个加号。 我之前在.net中做过,但是我确定,如果它必须是VBA,那么可以完成,但是如果你对这种解决scheme持开放态度,那将会更简单。

让我知道,我很乐意帮助你。

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

试试这个:制作电子表格的副本,追加.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 

让我知道这是如何解决你的。

如果c4包含您的评论:

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