Vba 为什么代码没有';如果弹出窗口在后面出现,则不要经过通风口(“Onchange”)

Vba 为什么代码没有';如果弹出窗口在后面出现,则不要经过通风口(“Onchange”),vba,internet-explorer,Vba,Internet Explorer,我试图在文本框中输入值,然后触发事件“onchange”,这是有效的。但是在那之后,我得到了一个弹出窗口,代码没有移过onchnage代码,所以我不能点击弹出窗口的“ok”按钮 <INPUT onchange=javascript:AcctId_ONCHANGE(); id=debAcctId class=textfieldfont style="WIDTH: 150px" maxLength=16 name=nefrtg.debAcctId fdt="String" enabled>

我试图在文本框中输入值,然后触发事件“onchange”,这是有效的。但是在那之后,我得到了一个弹出窗口,代码没有移过onchnage代码,所以我不能点击弹出窗口的“ok”按钮

<INPUT onchange=javascript:AcctId_ONCHANGE(); id=debAcctId class=textfieldfont style="WIDTH: 150px" maxLength=16 name=nefrtg.debAcctId fdt="String" enabled>

<INPUT onclick="javascript:return nefrtg_det_ONCLICK14(this,this);" id=Go class=sbutton type=button value=Go name=Go ?>   

有没有办法在同一行代码上单击该按钮,或者有其他方法

ie.Document.frames(0).frames(0).frames(0).Document.getElementById("debAcctId").Value = strDebAcc

ie.Document.frames(0).frames(0).frames(0).Document.getElementById("debAcctId").FireEvent ("onchange")

    While ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE
        DoEvents
        If ie.Busy Then
            DoEvents
            hWND = FindWindow(vbNullString, "Message from webpage")
            If hWND <> 0 Then childHWND = FindWindowEx(hWND, ByVal 0&, "Button", "OK")
            If childHWND <> 0 Then SendMessage childHWND, BM_CLICK, 0, 0
        End If
    Wend
ie.Document.frames(0).frames(0).frames(0).Document.getElementById(“debAcctId”).Value=strDebAcc
ie.Document.frames(0).frames(0).frames(0).Document.getElementById(“debAcctId”).FireEvent(“onchange”)
当ie忙或ie ReadyState ReadyState\u完成时
多芬特
如果我很忙的话
多芬特
hWND=FindWindow(vbNullString,“来自网页的消息”)
如果hWND为0,则childHWND=FindWindowEx(hWND,ByVal 0&,“按钮”,“确定”)
如果childHWND 0,则发送消息childHWND,BM_单击0,0
如果结束
温德

我知道当页面上显示警报消息时,您的VBA代码会被卡住

我试图找到一个解决方案或解决办法,但没有得到任何有效的例子

我在一个旧线程中发现,用户需要从另一个工作簿创建IE实例,并找到msg窗口并关闭它。我个人认为这不是一个切实可行的解决办法。除此之外,我没有得到任何VBA的解决方案

在进一步的搜索中,我发现如果您可以使用Selenium web驱动程序来自动化IE浏览器,那么有一个解决方案可以解决这个问题

使用Selenium单击警报的“确定”按钮:

driver.switchTo().alert().accept();
driver.switchTo().alert().dismiss();
使用Selenium单击警报的“取消”按钮:

driver.switchTo().alert().accept();
driver.switchTo().alert().dismiss();
参考:

因此,您可以考虑将此方法作为VBA方法的替代方法

Private Sub ClickOKButton() 
    Dim strScript As String, sFileName As String, wsh As Object
    Set wsh = VBA.CreateObject("WScript.Shell")
    strScript = "WScript.Sleep 5000" & vbCrLf & _
                "Dim wsh" & vbCrLf & _
                "Set wsh = CreateObject(""WScript.Shell"")" & vbCrLf & _
                "wsh.SendKeys ""{ENTER}""" & vbCrLf & _
                "Set wsh = Nothing"
    sFileName = wsh.ExpandEnvironmentStrings("%Temp%") & "\zz_automation.vbs"
    Open sFileName For Output As #1
    Print #1, strScript
    Close #1
    wsh.Run """" & sFileName & """"
    Set wsh = Nothing
End Sub

在启动“onchange”之前,我运行了上述脚本。它可以工作,但我仍在为上述问题寻找更好的答案。

不确定它是什么类型的弹出窗口。放置断点并尝试一步一步地调试代码。检查代码是否找到弹出窗口。另外,尝试使用.Sendkeys按Enter键以检查是否正在关闭弹出窗口。如果可能的话,试着发布弹出窗口的图片。这有助于更好地理解问题。@Deepak MSFT我为同一个问题添加了图片……代码没有超过“onchange”代码(它不会移到下一行),这就是我无法取消弹出窗口的原因。感谢您的回复!我理解并了解Selenium解决方案,但我需要的是通过IE。上面的代码在已经登录的网页上运行。我使用“Shell”获取其实例。我有一些想法…比如我们可以使用vbs吗?我已经找到了一个使用vbs的解决方案,但我将等待几天,等待我不需要运行其他脚本的解决方案,然后我将在这里发布我自己的答案。感谢您让我们了解您的解决方案以及此问题的进展。