【问题标题】:VBA to read dimensions of Images from a list of webpagesVBA从网页列表中读取图像的尺寸
【发布时间】:2014-09-16 04:34:01
【问题描述】:

我的目标: 我在工作表的列中有一个 14K URL 的列表。 这些 URL 中的每一个都有一个图像。类似于网站横幅的东西。 我想将每个横幅图像的尺寸检索到同一张表的另一列中。

谁能告诉我这在 Excel VBA 中是否可行。

我已经尝试了一些事情,但所有这些都像是在拐弯抹角,而不是直截了当。

我试图获取图像的 URLS 。然后使用 'URLDownloadToFile' 将这些 URL 下载到 HDD。然后我运行更多代码来获取尺寸。

更新:美国东部标准时间 2014 年 9 月 15 日下午 4:10

这就是我所做的: 我在工作表 1 中使用此代码加载 URL(来自 A 列)并检索 B 列中的横幅图像 URL

Private Sub GetEm_Click()
Dim ImageURL
Dim PageURL

Dim IE As New InternetExplorer
IE.Visible = True

For RowIndex = 0 To 15000
    pURL = Sheet1.Range("A" & i).Value

    On Error Resume Next
    IE.Navigate pURL

    Do
        DoEvents
    Loop Until IE.readyState = READYSTATE_COMPLETE

    Dim Doc As HTMLDocument
    Set Doc = IE.document

    URL = Doc.getElementsByTagName("img")(1).src
    Sheet1.Range("B" & i).Select       'I select and then populate the result value so that i can see the rows scrolling. This will give me an idea that the macro is still running.
        Sheet1.Range("B" & i).Value = URL
Next i
IE.Quit
End Sub

上面这段代码的问题是,大约 150 行后,IE 停止响应,我的代码挂起。

如果可行,那么我的计划是使用 B 列中的图像 URL 下载图像: 为此,如前所述,我使用: 'URLDownloadToFile'

然后,一旦我下载了它们,我就会运行一个 vb 脚本来获取它们的尺寸。

我希望有更好的直接方法来做到这一点。

【问题讨论】:

  • 向我们展示您的尝试并描述您使用该方法遇到的具体问题。 FWIW,这可能是我尝试的第一件事:下载文件,然后获取它们的尺寸。
  • 如果您缩短循环并将其分解为多个循环,或者添加Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 并在循环中添加Sleep #,代码是否仍会挂起?
  • 在短数据块中循环并没有帮助。任务管理器中 iexplore.exe 的内存使用量不断增加并在达到 1000 MB 多一点时停止响应。睡眠也没有帮助。不过谢谢。
  • 您可以尝试获取页面的 HTML 并将其存储在字符串中,然后解析字符串以获得 img 标签。这应该可以解决内存问题并防止冻结。

标签: vba excel metadata


【解决方案1】:

你可以做这样的事情(你必须改变它来做你想做的事):

Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Sub GetImgData()
    Dim objShell As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim i As Long

    Set objShell = CreateObject("Shell.Application")

    For i = 1 To ActiveSheet.UsedRange.Rows.Count
        URLDownloadToFile 0, Cells(i, 1).Value, "C:\temp.jpg", 0, 0

        Set objFolder = objShell.Namespace("C:\")
        Set objFile = objFolder.ParseName("temp.jpg")

        MsgBox objFile.ExtendedProperty("Dimensions")
        Kill "C:\temp.jpg"
    Next
End Sub

需要注意的一些重要事项是:

  1. 如果 URL 无效或不存在,则不会创建文件,也不会抛出错误。

  2. 如果无法下载文件,则不会创建临时文件,因此MsgBox 行将引发错误。

  3. 您可能需要解析文件类型的 URL。我不知道如果您将 .gif 下载为 .jpg 会发生什么。

  4. objFile.ExtendedProperty 的输出有点奇怪,可能需要稍微清理一下。 (包含?)

【讨论】:

  • 谢谢!您的解决方案部分解决了我遇到的问题。您提供了一种非常简单的方法来获取我使用它们的 URL 加载的图像的尺寸。但是,我的问题的第一部分实际上是获取所有这些图像的 URL 本身。我也有这个问题。非常感谢您的回答。它确实在一定程度上帮助了我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多