0

我没有太多(或任何)处理内存和内存泄漏问题的经验,但似乎这就是这里发生的事情。

我有一个 excel 宏,它必须
- 从工作表中的单元格跟踪超链接
- 从网页获取信息
- 对信息进行一些字符串操作
- 用获得的信息填充工作表中的单元格

我的代码大致是:

Sub GetInfo()
    Dim numRow As Long
    numRow = Range("E2").Value

    Do While WorksheetFunction.IsText(Range("D" & numRow))
        If Not Range("D" & numRow).EntireRow.Hidden Then
            URL = Range("D" & numRow).Hyperlinks(1).Address

            Set IE = CreateObject("InternetExplorer.Application")
            IE.Visible = True
            IE.Navigate URL

            Do While IE.Busy
                Application.Wait DateAdd("s", 1, Now)
            Loop

            If IE.document.GetElementsByName("thing1").Length = 0 Then
                strFrame = "Unknown"
                strBasket = ""
                strBoxName = "Check Manually"
                strStartIt = ""
                strEndIt = ""

            Else

                strFruitwork = IE.document.GetElementsByName("thing1")(0).innerText

                If InStr(strFruitwork, "FRUITY") Then
                    strFruit = "Cherry"

                    numStart = InStr(strFruitwork, "ir:") + 3
                    numEnd = InStr(numStart, strFruitwork, " -")
                    strBasket = Mid(strFruitwork, numStart, numEnd - numStart)

                    numStart = InStr(strFruitwork, "ane:") + 4
                    numEnd = InStr(numStart, strFruitwork, " -")
                    strBoxName = Mid(strFruitwork, numStart, numEnd - numStart)

                    numStart = InStr(strFruitwork, "ey:") + 3
                    numEnd = Len(strFruitwork)
                    strStartIt = Mid(strFruitwork, numStart, numEnd - numStart)

                    strEndIt = "NA"

                Else
                    strFruit = "Berry"

                    allPropBoxes = IE.document.GetElementsByName("_.properties")
                    For PropBox = 0 To IE.document.GetElementsByName("_.properties").Length
                        strFruitInfo = IE.document.GetElementsByName("_.properties")(PropBox).innerText
                        If (InStr(strFruitInfo, "yaddayadda") <> 0) Then
                            Exit For
                        End If
                    Next

                    numStart = InStr(strFruitInfo, "Name:") + 11
            numEnd = InStr(numStart, strFruitInfo, Chr(10))
                    strBoxName = Mid(strFruitInfo, numStart, numEnd - numStart)

                    numStart = InStr(strFruitInfo, "BegNum:") + 15
                    numEnd = InStr(numStart, strFruitInfo, Chr(10))
                    strStartIt = Mid(strFruitInfo, numStart, numEnd - numStart)

                    numStart = InStr(strFruitInfo, "EndNum:") + 13
                    numEnd = InStr(numStart, strFruitInfo, Chr(10))
                    strEndIt = Mid(strFruitInfo, numStart, numEnd - numStart)

                    numStart = InStr(strFruitInfo, "Basket:") + 5
                    strBasket = Mid(strFruitInfo, numStart, Len(strFruitInfo) - numStart)

                End If

            End If

            Range("F" & numRow).Value = strFruit
            Range("G" & numRow).Value = strBasket
            Range("H" & numRow).Value = strBoxName
            Range("I" & numRow).Value = strStartIt
            Range("J" & numRow).Value = strEndIt


            IE.Quit
            Set IE = Nothing
            Set strFruit = Nothing
            Set strFruitwork = Nothing
            Set strBasket = Nothing
            Set strBoxName = Nothing
            Set strStartIt = Nothing
            Set strEndIt = Nothing
            Set numStart = Nothing
            Set numEnd = Nothing
            Set strFruitInfo = Nothing
            Set allPropBoxes = Nothing
            Set PropBox = Nothing
            Set URL = Nothing


        End If
        numRow = numRow + 1
    Loop


End Sub

我会假设set = nothings 应该解决内存问题,但在实际实践中,脚本一次最多只能运行 3-4 行,然后才会卡住(宏卡在 IE 窗口打开,但未输入/关注 URL)。手动关闭 IE 窗口,然后再次启动脚本使其正常工作,但再次仅 3 行。鉴于我的数据超过 900(!)行,您可以理解为什么这是一个问题。

有什么帮助吗?(请正确假设我对处理记忆的东西一无所知)

4

1 回答 1

3

只是一个想法。我知道会做很多工作,但考虑做一个

Set IE = CreateObject("InternetExplorer.Application")

然后IE.Navigate URL为您的线路发出多个。与仅访问 URL 相比,打开浏览器是一个相当繁重的过程,并且可能会解决/缓解您的问题。

于 2013-10-03T12:34:41.043 回答