ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 15032|回复: 16

[求助] VBA 如何确定网页中弹出的对话框

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-6-3 12:02 | 显示全部楼层 |阅读模式
本帖最后由 南宫煌sea 于 2014-6-3 18:47 编辑

EH各位老师好,我用VBA写了将Excel数据填写到网页表单上,但是提交的时候会弹出来自网页信息的窗口,需要按确定才能继续下一步。我在EH上查找了弹出来自网页信息的窗口的相关帖,用蓝天老师写的代码单独可以运行,但是放到提交代码后,却不能按确定窗口,liucqa老师说这是VBA单线程的原因造成的,需要用API处理,请问EH各位老师有没有一些例子提供给我参考一下,或者有没有其他的处理方法呢?
附上写的代码:

  1. Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
  2. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  3. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  4. Private Const WM_LBUTTONDOWN = &H201
  5. Private Const WM_LBUTTONUP = &H202
  6. Private Const MK_LBUTTON = &H1

  7. Sub Execl填写网页表单()
  8.    Dim mShellwindows As New ShellWindows, ie As InternetExplorer
  9.     For Each ie In mShellwindows
  10.         If ie.LocationURL Like "http://10.3.18.72/enq/inqueryAction.do?reqCode=inqRegBegin&enqSort=INQ_DOM&inoutFlag=OUT&enqClass=1&srcTab=1*" Then Exit For
  11.     Next
  12.     With ie.Document
  13.          .all("itemno").Value = Cells(2, 1)
  14.          .all("collTime").Value = Cells(2, 2)
  15.          .all("collDstAlphaid").Focus
  16.          .all("collDstAlphaid").Value = Cells(2, 3)
  17.          t1 = Timer
  18.          Do Until Timer > t1 + 3 '需要时间触发网页上的onblur函数
  19.          Loop
  20.         .all("senderName").Value = Cells(2, 4)
  21.         .all("senderPhone").Value = Cells(2, 5)
  22.         .all("senderAddr").Value = Cells(2, 6)
  23.         .all("recverName").Value = Cells(2, 7)
  24.         .all("recverPhone").Value = Cells(2, 8)
  25.         .all("recverAddr").Value = Cells(2, 9)
  26.         .all("explain").Focus
  27.         .all("explain").Value = Cells(2, 10)
  28.          Do Until Timer > t1 + 5 '等待关联菜单显示内容
  29.          Loop
  30.          .all("btnSend").Click  'click之后会弹出一个确定的对话框,之前试过submit Form,不过这里不行
  31.     End With
  32.    
  33.     winHwnd = FindWindow(vbNullString, "来自网页的消息")              '这段代码是在EH上看到蓝天老师写的,单独运行可以,放在这里运行不行
  34.     If winHwnd <> 0 Then
  35.         btnHwnd = FindWindowEx(winHwnd, 0, "Button", "确定")
  36.         SendMessage btnHwnd, WM_LBUTTONDOWN, 0, ByVal 0
  37.         SendMessage btnHwnd, WM_LBUTTONUP, 0, ByVal 0
  38.         SendMessage btnHwnd, WM_LBUTTONDOWN, 0, ByVal 0
  39.         SendMessage btnHwnd, WM_LBUTTONUP, 0, ByVal 0
  40.     End If
  41.    
  42.     Do While ie.Busy
  43.         DoEvents
  44.     Loop
  45.    
  46.    
  47. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-6-3 13:35 | 显示全部楼层
用API 的话,你可以间隔时间FINDWINDOW一下,FIND到就点击

也就是settimer,然后KillTimer

TA的精华主题

TA的得分主题

发表于 2014-6-3 13:42 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-3 15:22 | 显示全部楼层
wudixin96 发表于 2014-6-3 13:35
用API 的话,你可以间隔时间FINDWINDOW一下,FIND到就点击

也就是settimer,然后KillTimer

wudixin96老师,请问有没有具体的应用实例?

TA的精华主题

TA的得分主题

发表于 2014-6-3 16:21 | 显示全部楼层
本帖最后由 wudixin96 于 2014-6-3 16:22 编辑
  1. Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  2. Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
  3. Private id_timer As Long
  4. Sub Execl填写网页表单()
  5.    Dim mShellwindows As New ShellWindows, ie As InternetExplorer
  6.    id_timer = SetTimer(0, 0, 500, AddressOf TimeProc)
  7.     For Each ie In mShellwindows
  8.         If ie.LocationURL Like "http://10.3.18.72/enq/inqueryAction.do?reqCode=inqRegBegin&enqSort=INQ_DOM&inoutFlag=OUT&enqClass=1&srcTab=1*" Then Exit For
  9.     Next
  10.     With ie.Document
  11.          .all("itemno").Value = Cells(2, 1)
  12.          .all("collTime").Value = Cells(2, 2)
  13.          .all("collDstAlphaid").Focus
  14.          .all("collDstAlphaid").Value = Cells(2, 3)
  15.          t1 = Timer
  16.          Do Until Timer > t1 + 3 '需要时间触发网页上的onblur函数
  17.          Loop
  18.         .all("senderName").Value = Cells(2, 4)
  19.         .all("senderPhone").Value = Cells(2, 5)
  20.         .all("senderAddr").Value = Cells(2, 6)
  21.         .all("recverName").Value = Cells(2, 7)
  22.         .all("recverPhone").Value = Cells(2, 8)
  23.         .all("recverAddr").Value = Cells(2, 9)
  24.         .all("explain").Focus
  25.         .all("explain").Value = Cells(2, 10)
  26.          Do Until Timer > t1 + 5 '等待关联菜单显示内容
  27.          Loop
  28.          .all("btnSend").Click  'click之后会弹出一个确定的对话框,之前试过submit Form,不过这里不行
  29.     End With
  30.    
  31.    
  32.    
  33.     Do While ie.Busy
  34.         DoEvents
  35.     Loop
  36. End Sub

  37. Sub TimeProc()
  38.     winHwnd = FindWindow(vbNullString, "来自网页的消息")              '这段代码是在EH上看到蓝天老师写的,单独运行可以,放在这里运行不行
  39.     If winHwnd <> 0 Then
  40.         btnHwnd = FindWindowEx(winHwnd, 0, "Button", "确定")
  41.         SendMessage btnHwnd, WM_LBUTTONDOWN, 0, ByVal 0
  42.         SendMessage btnHwnd, WM_LBUTTONUP, 0, ByVal 0
  43.         SendMessage btnHwnd, WM_LBUTTONDOWN, 0, ByVal 0
  44.         SendMessage btnHwnd, WM_LBUTTONUP, 0, ByVal 0
  45.         KillTimer 0, id_timer
  46.     End If
  47. End Sub
复制代码
没测试过哦,你试试看

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-3 18:46 | 显示全部楼层
wudixin96 发表于 2014-6-3 16:21
没测试过哦,你试试看

直接用代码click不行,然后手动click,会自动按确认。
还有一个问题想问一下,现在我等待时间是怎么写的,请问还有其他办法吗?

  1. Do Until Timer > t1 + 3  '需要时间差触发网页上的onblur函数
  2.             'DoEvents  不注释有时候会报溢出的错。
  3. Loop
复制代码

TA的精华主题

TA的得分主题

发表于 2014-6-4 07:06 | 显示全部楼层
南宫煌sea 发表于 2014-6-3 18:46
直接用代码click不行,然后手动click,会自动按确认。
还有一个问题想问一下,现在我等待时间是怎么写的 ...

你又不给帐号密码,我没法调试,只是说怎么用SETTIMER,至于原代码的问题,你得自己解决

等待时间,用API SLEEP试试

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-5 08:39 | 显示全部楼层
wudixin96 发表于 2014-6-4 07:06
你又不给帐号密码,我没法调试,只是说怎么用SETTIMER,至于原代码的问题,你得自己解决

等待时间,用 ...


因为要内网上,所以给了账号和密码也登录不了。我在  If winHwnd <> 0 Then  后面 添加了  Cells(2, 11) = 1 来调试能否捕获窗口,结果发现自动click捕获不了,但是在第一次操作弹出的窗口之后,后面其他弹出的窗口都能够捕获。
  1. Sub TimeProc()
  2.     winHwnd = FindWindow(vbNullString, "来自网页的消息")              '这段代码是在EH上看到蓝天老师写的,单独运行可以,放在这里运行不行
  3.     If winHwnd <> 0 Then
  4.         Cells(2, 11) = 1 ' 调试能否捕获窗口
  5.         btnHwnd = FindWindowEx(winHwnd, 0, "Button", "确定")
  6.         SendMessage btnHwnd, WM_LBUTTONDOWN, 0, ByVal 0
  7.         SendMessage btnHwnd, WM_LBUTTONUP, 0, ByVal 0
  8.         'SendMessage btnHwnd, WM_LBUTTONDOWN, 0, ByVal 0
  9.         'SendMessage btnHwnd, WM_LBUTTONUP, 0, ByVal 0
  10.         'KillTimer 0, id_timer
  11.     End If
  12. End Sub
复制代码



TA的精华主题

TA的得分主题

发表于 2014-6-26 17:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-6-26 17:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 21:33 , Processed in 0.041057 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表