And*_*rej 1 excel vba excel-vba
我有一个VBA宏脚本,可以删除一些数据.它使用MSIE来刮擦它.我相信MSIE是内存泄漏的核心问题.
我正在初始化变量
Set IE = CreateObject("InternetExplorer.Application")
Run Code Online (Sandbox Code Playgroud)
我做了一点测试,看看内存是如何使用的.
我创建了一个循环,它只生成1个IE实例并ping同一个网站.记忆似乎没有韭菜.
然后我做了一个循环,总是ping不同的站点,内存使用开始随着每个请求而增加.
我还做了一个测试(我在下面发布),在每次迭代中创建NEW对象并在最后删除它.删除部分似乎不起作用.
似乎IE的实例正在缓存请求,因此对象变得越来越大.这只是一个假设.
这是我用来测试泄漏的示例代码.
Do While True
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "https://www.google.hr/#hl=hr&gs_nf=1&cp=3&gs_id=8&xhr=t&q=" & Counter
IE.Visible = True
Do While IE.readyState <> 4 Or IE.Busy = True
Application.Wait Now() + TimeValue("00:00:01")
DoEvents
Loop
Application.Wait Now() + TimeValue("00:00:01")
Counter = Counter + 1
Range("A" & Counter).Value = "https://www.google.hr/#hl=hr&gs_nf=1&cp=3&gs_id=8&xhr=t&q=" & Counter
IE.Quit
Set IE = Nothing
Loop
Run Code Online (Sandbox Code Playgroud)
任何输入都会很棒!
我测试了上面的代码,它正在破坏IE对象.也就此而言
似乎IE的实例正在缓存请求,因此对象变得越来越大.这只是一个假设.
是的它有时会增加但不总是.见截图.
这是IE for 8循环的任务管理器的屏幕截图.它显示出增加,但如果你看到它也会降低它.所以我相信你所看到的不是内存泄漏.
编辑
这是我在我的数据库中的一些代码(我没有写它)但你可以运行它来检查内存使用情况.
Sub Sample()
Do While True
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "https://www.google.hr/#hl=hr&gs_nf=1&cp=3&gs_id=8&xhr=t&q=" & Counter
IE.Visible = False
Debug.Print GetProcessMemory("iexplore.exe")
Do While IE.readyState <> 4 Or IE.Busy = True
Application.Wait Now() + TimeValue("00:00:01")
DoEvents
Loop
Application.Wait Now() + TimeValue("00:00:01")
Counter = Counter + 1
Range("A" & Counter).value = "https://www.google.hr/#hl=hr&gs_nf=1&cp=3&gs_id=8&xhr=t&q=" & Counter
IE.Quit
Set IE = Nothing
Loop
End Sub
Private Function GetProcessMemory(ByVal app_name As String) As String
Dim Process As Object, dMemory As Double
For Each Process In GetObject("winmgmts:"). _
ExecQuery("Select WorkingSetSize from Win32_Process Where Name = '" & app_name & "'")
dMemory = Process.WorkingSetSize
Next
If dMemory > 0 Then
GetProcessMemory = ResizeKb(dMemory)
Else
GetProcessMemory = "0 Bytes"
End If
End Function
Private Function ResizeKb(ByVal b As Double) As String
Dim bSize(8) As String, i As Integer
bSize(0) = "Bytes"
bSize(1) = "KB" 'Kilobytes
bSize(2) = "MB" 'Megabytes
bSize(3) = "GB" 'Gigabytes
bSize(4) = "TB" 'Terabytes
bSize(5) = "PB" 'Petabytes
bSize(6) = "EB" 'Exabytes
bSize(7) = "ZB" 'Zettabytes
bSize(8) = "YB" 'Yottabytes
For i = UBound(bSize) To 0 Step -1
If b >= (1024 ^ i) Then
ResizeKb = ThreeNonZeroDigits(b / (1024 ^ _
i)) & " " & bSize(i)
Exit For
End If
Next
End Function
Private Function ThreeNonZeroDigits(ByVal value As Double) As Double
If value >= 100 Then
ThreeNonZeroDigits = FormatNumber(value)
ElseIf value >= 10 Then
ThreeNonZeroDigits = FormatNumber(value, 1)
Else
ThreeNonZeroDigits = FormatNumber(value, 2)
End If
End Function
Run Code Online (Sandbox Code Playgroud)
快照
归档时间: |
|
查看次数: |
14502 次 |
最近记录: |