【问题标题】:Excel VBA IE automation - VBA Stops after Window.confirm PopupExcel VBA IE 自动化 - VBA 在 Window.confirm 弹出后停止
【发布时间】:2021-01-25 02:20:20
【问题描述】:

我正在尝试在网页中实现自动化 (.aspx)。上传数据和备注后,我必须点击提交按钮。单击提交按钮时,window.confirm 弹出窗口显示和我的vba 停止,直到我单击“确定”或“取消”。如果我手动单击“确定”,另一个弹出窗口会显示“我的数据已更新”,并且该弹出窗口可以由我的Vba 控制。

网页代码submit button

<INPUT onclick=javascript:validate(this); tabIndex=3 id=btnsubmit class=formbutton language=javascript style="WIDTH: 35%" type=submit value=Submit name=btnsubmit>

Validate(这个)代码

function validate(v)
          {
            
               if (document.forms[0].txtremarks.value=="")
             {
              alert('Remarks is required!');
              document.forms[0].txtremarks.select();
              window.event.returnValue = false;
              return false;
             }
             
               //alert(v.id);
           if (v.id=="btnsubmit")
           {
         
              var c=window.confirm('Do you want to save records?');
            
              if (c==true)
              {
                  document.getElementById("sub_confirm").value=true;
              }
              else if(c==false)
              {
               document.getElementById("sub_confirm").value=false;
              }
           }
          }

阅读一些问答后我的代码。在第 2 行 (ie IE.document.all("btnsubmit").Click) 之后,Windows.comfirm 框弹出和 VBA 停止。如果我单击“确定”,则另一个弹出窗口显示(该数据已更新)并且弹出窗口可由vba 代码控制。

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'Sends the specified message to a window or windows. The SendMessage function calls the window procedure
'for the specified window and does not return until the window procedure has processed the message.
Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWND As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

'Retrieves a handle to the top-level window whose class name and window name match the specified strings.
'This function does not search child windows. This function does not perform a case-sensitive search.
Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'Retrieves a handle to a window whose class name and window name match the specified strings.
'The function searches child windows, beginning with the one following the specified child window.
'This function does not perform a case-sensitive search.
Public Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Public Const BM_CLICK = &HF5&

Sub Carrier_Inspection_Module()

' Some Code to update data from excel, after that..

    IE.document.all("txtremarks").Value = "Ins at Gujarat"
    IE.document.all("btnsubmit").Click
    Application.Wait (Now + TimeValue("0:00:05"))
         
    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
    
    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 Sub

【问题讨论】:

    标签: excel vba internet-explorer automation


    【解决方案1】:

    如果您只想跳过弹出窗口,那么在单击提交之前,您可以使用仅返回 true 的函数覆盖 window.confirm 函数

    With IE.document
        .parentWindow.execScript "window.confirm = function(){return true;};", "JScript"
        .all("btnsubmit").Click
    End with
    

    【讨论】:

    • 这真的很有帮助,我正在寻找这个代码。
    • 但我有一个疑问。从外观上看,即使我将 txtremarks.value 留空,验证功能仍然是正确的。
    • 使用同样的方法,你可以覆盖整个validate函数,让它为所欲为……
    【解决方案2】:

    我尝试检查您的JS函数Validate()代码,发现它正在检查备注值并显示确认弹出窗口。

    如果您可以删除此事件,那么您可以尝试参考下面的 VBA 代码示例,可以帮助您删除 OnClick 事件。因此,不会调用 Validate() 函数,也不会显示弹出窗口。

    HTML

    <button name="submit" onclick="myFunction()">Try it</button>
    

    VBA:

    Dim btn As HTMLButtonElement
    Set btn = IE.document.getElementsByName("submit")(0)
    btn.onclick = ""
    

    另一种方式:

    IE.document.getElementsByName("submit")(0).removeAttribute ("onClick")
    IE.document.getElementsByName("submit")(0).setAttribute "onClick", "return true"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多