我的模块结束后,Internet Explorer无法关闭

5
我有一个宏,可以从网站中提取数据。我从用户表单中获取输入。它没有出现错误,但是IE不会关闭并且占用了所有内存。是否需要其他东西而不是IE.Quit
这是子程序。正如您所看到的,在最后我关闭了IE。
Public Cancel As Boolean

Sub USGD()

Dim IE As Object
Dim iWsh As Worksheet
Dim link As String
Dim sDate As String
Dim eDate As String
Dim StationID As String
    
Cancel = False

With USGS
    .StartUpPosition = 0
    .Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width)
    .Top = Application.Top + (0.5 * Application.Height) - (0.5 * .Height)
    .Show
End With

If Cancel = True Then
    Unload USGS
    Exit Sub
End If

With ActiveWorkbook
    Set iWsh = .Sheets.Add(After:=.Sheets(.Sheets.Count))
End With

iWsh.Activate
iWsh.Range("A1").Select 'I know this is not efficient but works fine


 StationID = USGS.TextBox1.Text
'StationID = InputBox("Please enter the station ID")
    
'sDate = InputBox("Please enter START date in this format: 'yyyy-mm-dd'")
'eDate = InputBox("Please enter END date in this format: 'yyyy-mm-dd'")
 sDate = Format(USGS.TextBox2.Text, "yyyy-mm-dd")
 eDate = Format(USGS.TextBox3.Text, "yyyy-mm-dd")
 
 
link = "https://waterdata.usgs.gov/ & _ 
StationID & sDate & eDate
 
 
 Unload USGS
 
Set IE = CreateObject("InternetExplorer.Application")
With IE
           .Visible = False
           .Navigate link 'URL
           
  Do Until .ReadyState = 4: DoEvents: Loop
  
           .ExecWB 17, 0 '// SelectAll
           .ExecWB 12, 2 '// Copy selection
End With
     

    iWsh.PasteSpecial Format:="Text", link:=False, DisplayAsIcon:=False
    Range("A1").Select
    
    IE.Quit
    Set IE = Nothing
    Set iWsh = Nothing
    
End Sub

这是用户表单:在使用输入框时,我没有遇到这个问题,所以我猜测与用户表单有关。只有当用户关闭用户表单时才会发生这种情况。

Private Sub ToggleButton1_Click()
Me.Hide
    Cancel = True
End Sub

Private Sub OK_Click()
Me.Hide
End Sub

注意: 如果用户取消,它甚至不会打开IE并在此子程序之后退出。

但是如果用户关闭表单,则会打开IE,并且不会将Cancel设置为True,这是退出该子程序的条件。

更新: Expert-Exchange涵盖了这个问题,但从未提出实际解决方案。

更新2: 关闭所有IE实例不是一个选项。

这是用户窗体现在的设置方式:

enter image description here


1
这个“大锤”可能会给你一个解决此问题的变通方法的想法。 - Sgdva
1
请查看其帮助文档以进行自动检索... https://help.waterdata.usgs.gov/faq/automated-retrievals.... IE中的冻结选项卡通常与行为不端的第三方插件相关联...在noAddons模式下运行IE,通过手动提取(通过输入站点ID和开始和结束日期)...如果在noAddons模式下工作,则问题是IE中的一个插件。手动步进过程流还允许您使用开发工具查看是否存在beforeunload事件处理程序,这会防止自动IE实例退出。 - Rob Parsons
1
开始>控制面板>管理工具>事件查看器>Windows组件...将列出由于行为不当的插件引起的应用程序事件错误。 "故障"模块将为您提供有关哪个插件的提示... - Rob Parsons
1
同时...在Internet选项>高级选项卡中,取消选中“不要保存加密文件到磁盘”... - Rob Parsons
1
@Sgdva 谢谢。我知道如何实现。但这不是我想要的,因为我正在编写一个插件,我的同事会使用它,我不能关闭所有IE窗口。 - M--
显示剩余16条评论
2个回答

1

好的,我无法复制错误,所以你应该尝试以下两件事:

  1. 重新启动计算机并验证错误是否继续。如果没有,问题解决。
  2. 在一个新的空白工作簿中重新创建UserForm和代码,并查看错误是否继续。如果没有,问题解决。

(有时候工作簿和/或UserForms会损坏)

我还稍微重构了一下代码,即使以上建议之一解决了问题,你也可以考虑这样做。它只是稍微清理了一下并使其更有目的性。

在标准模块中,放置以下代码:

USGD过程显示用户窗体并卸载它。名为GetData的单独过程将在IE中执行工作并添加工作表等。只有当用户单击表单上的“确定”按钮时,才会执行GetData过程。因此,“X”/取消按钮将允许用户关闭窗体。

Option Explicit

Sub USGD()
'Procedure displays the userform for the user
Dim USGSForm As New USGS
With USGSForm
    .StartUpPosition = 0
    .Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width)
    .Top = Application.Top + (0.5 * Application.Height) - (0.5 * .Height)
    .Show
End With
Unload USGSForm
End Sub

Sub GetData(StationID As String, sDate As String, eDate As String)
'This procedure queries the InternetExplorer for the values from UserForm
Dim iWsh As Worksheet
Dim link As String
Dim IE As Object

sDate = Format(sDate, "yyyy-mm-dd")
eDate = Format(eDate, "yyyy-mm-dd")

link = "https://waterdata.usgs.gov/nwis/dv?cb_00060=on&format=rdb&site_no=" & _
    StationID & "&referred_module=sw&period=&begin_date=" & sDate & "&end_date=" & eDate

Set IE = CreateObject("InternetExplorer.Application")
With IE
    .Visible = False
    .Navigate link 'URL
    Do Until .ReadyState = 4: DoEvents: Loop
    .ExecWB 17, 0 '// SelectAll
    .ExecWB 12, 2 '// Copy selection
    .Quit
End With

With ActiveWorkbook
    Set iWsh = .Sheets.Add(After:=.Sheets(.Sheets.Count))
End With
iWsh.PasteSpecial Format:="Text", link:=False, DisplayAsIcon:=False
Application.GoTo iWsh.Range("A1")

End Sub

在您的UserForm模块中,放置以下代码:

这是“确定”按钮的代码,它获取表单上的TextBoxes的值并将其发送到GetData过程。请注意Select Case逻辑,如果任何参数为空,则会提前退出该过程,因此不会调用GetData

Private Sub OK_Click()
    Dim id As String, sDate As String, eDate As String
    'Get values from the form
    id = Me.TextBox1.Value
    sDate = Me.TextBox2.Value
    eDate = Me.TextBox3.Value
    'Hide the form
    Me.Hide

    'If ANY required parameter is blank, this results in malformed URL so exit the procedure
    Select Case vbNullString
        Case id, sDate, eDate
            MsgBox "You left some parameter blank, no query will be performed.", vbInformation
            GoTo EarlyExit
        Case Else
            'Send values to the procedure that queries IE
            Call GetData(id, sDate, eDate)
    End Select

EarlyExit:
End Sub

0

我找到了一个解决方法,但不是一个好的答案。而且,它也没有解释为什么会发生这种情况。

我改变了我的用户表单,使用户无法关闭它。同时将Cancel的初始值设置为True

Cancel = True

当用户点击确定时,它将被设置为false。请查看下面的用户表单代码:

Private Sub ToggleButton1_Click()

End Sub

Private Sub OK_Click()
    Me.Hide
    Cancel = False
End Sub

这种方法的明显缺点是用户无法关闭用户表单,他们必须点击确定。这不会导致错误。我只能添加一个条件,如果文本框中有一个为空,则退出子程序。类似下面的代码:

If sDate = "" Or eDate = "" Or StationID = "" Then GoTo 92
'. Rest of ...
'. My ... 
'. Code ...
92:
           Set IE = Nothing

End Sub

你真的需要处理Userform的queryClose事件。这可能是有关Userform处理的好文章:https://stackoverflow.com/documentation/vba/5351/user-forms/19037/handling-queryclose#t=201705302136167547879 - MacroMarc
@MacroMarc 谢谢。那时是我第一次使用UserForms。最终,我编写了一个完全不同结构的脚本。感谢您指向文档。 - M--

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接