0

问题确实是:如何刷新/防止 Excel 使我的 RAM 膨胀。

我有一堆 html 字符串存储在一个单独的表中,它们指向不同的 xml web 数据,我创建了一个循环:

  1. 将 xml 的(一个一个)作为表格导入到工作表中
  2. 执行一堆字符串函数/迭代
  3. 将结果放入数组中
  4. 删除 xml 表并从 #1 重复
  5. 将结果粘贴到新工作表

如果不是因为所有这些重复的 XML 导入导致 EXCEL.EXE 内存使用量超过 1.3GB,Bob 就会成为我的叔叔。每次我打开文件都需要很长时间,尽管它自己的文件不大于 300k。我也开始怀疑 excel “记住”了已导入的内容,尽管它已被删除。这种荒谬的记忆冲击是否有解决方法?

我正在考虑在数组中处理 xml,而不是将它们导入工作表,因为我还没有找到解决此问题的另一种方法,但我担心这超出了我的技能水平。非常感谢所有帮助。

4

1 回答 1

0

我有一个解决方案启动并运行。感谢@Blackhawk 为我指明了正确的方向。它将 xml 加载到 de MSXML DOM 中,并基于 GetElementsByTagName 遍历 NodeList。然后它使用几个字符串函数和循环将我想要的信息提取到数组中。

我对它所做的工作感到满意,但请随时指出可以做得更好的地方!

Sub IterateThroughNodelistXML()
Application.ScreenUpdating = False

Dim MyArray(1 To "some upper bound", 1 To 3)
Dim xmldoc As MSXML2.DOMDocument
Dim xmlNodeList As MSXML2.IXMLDOMNodeList
Dim xmlNode As MSXML2.IXMLDOMNode

Dim web_addresses, XML_Output As Worksheet
Dim str, strHttp, strValue_1, strValue_2 As String

Dim intPosition_1, intPosition_2 As Integer

Dim l, s As Integer
Dim i, bAscii As Byte
Dim c As Long
Dim dDate As Date

Set XML_Output = Sheets(1)
Set web_addresses = Sheets(2)

Set xmldoc = New MSXML2.DOMDocument
xmldoc.async = False

For l = 1 To web_addresses.Range("a1").CurrentRegion.Rows.Count

strHttp = web_addresses.Cells(l, 1).value

    xmldoc.Load ("http://www.some_web_page" & strHttp)

    Set xmlNodeList = xmldoc.getElementsByTagName("something")

            For s = 1 To xmlNodeList.Length

        str = xmlNodeList.Item(s).nodeTypedValue

                    intPosition_1 = InStrRev(str, "some search string", -1, vbBinaryCompare) - "some constant"
                    strValue_1 = Mid(str, intPosition_1, "some constant")

                i = 9
                bAscii = 0

                        While bAscii < 48 Or bAscii > 57

                                intPosition_2 = InStr(1, str, "some other search string", vbBinaryCompare) - i 

                                strValue_2 = Mid(str, intPosition_2, i)
                                    bAscii = AscW(strValue_2)

                            i = i - 1
                        Wend        

            c = c + 1

                dDate = Date
                MyArray(c, 1) = strValue_1
                MyArray(c, 2) = strValue_2
                MyArray(c, 3) = dDate

            Next s

   Next l

   XML_Output.Range("a4").Resize(UBound(MyArray, 1), UBound(MyArray, 2)).value = MyArray

   Application.ScreenUpdating = True
End Sub
于 2013-11-19T10:17:44.350 回答