我的模块结束后,Internet-Explorer将不会closures

我有这个从网站上抽出数据的macros。 我得到来自用户的input。 它工作没有错误,但由于我看不到的原因,IE不会closures和吸收我所有的RAM。 是否需要其他东西,而不是IE.Quit

这是分。 正如你所看到的,我最后closuresIE。

 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 

这是用户forms: 使用Input-Box时我没有这个问题,所以我猜测,现在我确定,它与用户forms有关。 只有当用户closures用户表单时才会发生。

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

注意:如果用户取消,甚至不会打开IE并退出子权限。

它确实打开IE,并没有设置Cancel为真这是条件退出子。

更新: 专家交stream涵盖了这个问题,但从来没有提出一个实际的解决scheme。

更新2:closuresIE的所有实例不是一个选项。

这是用户forms现在是如何设置的:

在这里输入图像说明

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

  1. 重新启动计算机并validation错误是否继续。 如果没有,问题就解决了。
  2. 新的空白工作簿中重新创buildUserForm&代码,然后查看错误是否继续。 如果没有,问题就解决了。

(有时工作簿,和/或用户窗体被损坏)

我也重新考虑了一些代码, 即使上面的build议之一解决了这个问题,也可以考虑这些代码。 它只是清理了一下,使其更有意义。

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

USGD程序显示用户USGD并将其卸载。 一个名为GetData的单独过程将在IE中完成工作并添加工作表等。只有在用户单击窗体上的“确定”button时,才会执行GetData过程。 因此,“X”/取消button将允许用户closures表格。

 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 

在您的用户窗体模块中,放置以下代码:

这是“确定”button的代码,该button从窗体上的文本框中获取值,并将其发送到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 

我find了一个解决办法,但不是一个好的答案 。 另外,不解释为什么发生。

我改变了我的用户forms,所以用户无法closures它。 还要将Cancel的初始值设置为True

Cancel = True

当使用按下确定它将被设置为false。 请看下面的用户表单代码:

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

明显的缺点是用户不能closures用户表单; 他们必须打好。 这不会导致错误。 我只是可以添加一个条件,如果其中一个文本框是空的,然后退出子。 像下面的东西;

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