VBA HTML不能在所有的计算机上运行
所以我有这个代码我正在为我的deptarment去到一个网站input数据,点击运行并下载CSV文件到工作表。 它在我的个人电脑上工作得很好,在其他部门使用的电脑上也能正常工作。 我们都使用相同版本的Windows,Excel和IE。 当我有其他部门的人运行macros,它打开网站,但从来没有input数据到字段,尽pipe网站是完全相同的编码,当我login。
Sub testmetric() Dim appIE As Object Dim Obj As Object On Error Resume Next Sheets("Audit").Select Selection.AutoFilter Sheets("Audit").Cells.Clear Application.ScreenUpdating = False Application.ScreenUpdating = True Set appIE = CreateObject("InternetExplorer.Application") sURL = "http://cctools/rportal/main.php?p=agentavaya" ' Instructes the macro to open IE and navigate to sURL. With appIE .Navigate sURL .Visible = True Application.Wait Now + TimeValue("00:00:02") Set HTMLDOC = .Document End With Application.Wait Now + TimeValue("00:00:02") appIE.Document.getElementById("agentLob").selectedIndex = "3" appIE.Document.getElementById("timezone").selectedIndex = "1" appIE.Document.getElementById("sdate").Value = Range("Date_Start") appIE.Document.getElementById("edate").Value = Range("Date_End") appIE.Document.getElementById("stenure").Value = Range("TenStart") appIE.Document.getElementById("etenure").Value = Range("TenEnd") Application.Wait Now + TimeValue("00:00:02") For Each Btninput In appIE.Document.getElementsByTagName("INPUT") If Btninput.Value = " Run " Then Btninput.Click Exit For End If Next Application.Wait Now + TimeValue("00:00:02") Call CSV appIE.Quit Sheets("Audit").Select Range("A1").Select Sheets("audit").Paste End Sub Sub CSV() sCSVLink = "http://cctools/rportal/csvexport.php" sfile = "csvexport.php" ssheet = "Sheet10" Set wnd = ActiveWindow Application.ScreenUpdating = False Workbooks.Open Filename:=sCSVLink Windows(sfile).Activate ActiveSheet.Cells.Copy wnd.Activate Range("A1").Select Sheets("Audit").Paste Application.DisplayAlerts = False Windows(sfile).Close False Application.DisplayAlerts = True Application.ScreenUpdating = True Sheets("Audit").Select Range("A1").Select Sheets("audit").Paste End Sub
当这个代码是由其他部门的成员运行它只是打开网站input什么都没有,并没有按网站上的运行button。
任何想法可能会导致这一点? 什么设置或什么。 我validation了这两个PC的VBA引用在那里,没有“位置缺lesspath”。
你永远不会检查网页是否完成加载!
您的On Error Resume Next
语句也隐藏任何错误,并防止您通过修复代码采取适当的补救措施。 请报告具体的错误号码和提出错误的行。 我有一个想法,哪一行,哪个错误,我的答案是为此:
在行上键入91错误: Set HTMLDOC = .Document
为什么?
当你在等待 , Application.Wait
是一个真正无效的方法等待浏览器加载,2秒可能并不总是足够的时间。 我能想到的最好的方法来处理这个问题,假设你得到了91型错误,就像这样:
如何为浏览器控件创build一个现成的等待循环
基本上你需要把线程放到一个循环中,直到浏览器加载页面。 在伪代码中,你正在做:
Do Until Browser Is Loaded DoEvents 'etc. Loop
使用WinAPI睡眠function
您将需要使用WinAPI Sleep
function(很多人使用DoEvents
或Application.Wait
但是我在这里发现Sleep
是最好的。
因为它是一个Declare
,所以你必须把它放在一个普通的模块中,它不能进入一个class或者userform模块。
'## This needs to go in an ordinary code module Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
调用WinAPI睡眠function
Sleep 250 'sleep for 1/4 of a second, or Sleep 1000 to sleep for a full second, etc.
把它放在一起
您将需要在.Navigate
方法之后立即调用此函数的Do ... Loop
。
'## This goes in where you do Navigate method: With appIE .Navigate sURL Do Sleep 250 Loop While Not .ReadyState <> 4 'READYSTATE_COMPLETE Set HTMLDoc = .Document End With
如果还是不行的话
是的,总有一个例外。 我做了很less的基于networking的自动化,而我所做的大部分工作只是修补这里的东西来帮助别人。 我注意到,越来越多的网站dynamic服务(AJAX也许?),在这种情况下,浏览器可能是.ReadyState = READYSTATE_COMPLETE
,甚至.Busy = False
,但.Document
仍然Nothing
。
如果发生这种情况,你可以把一个次级循环,如:
Dim numberOfAttempts Do While .Document Is Nothing Sleep 250 numberOfAttempts = numberOfAttempts + 1 If numberOfAttempts > 100 Then MsgBox "This is taking too long, try again later." Exit Do End If Loop
你可能想添加一个迭代器/计数器,就像我在那里做的那样,并且模拟超时,否则这可能会进入无限循环。
感谢所有伟大的提示将实施大量的。 这背后的真正的错误是一个Windows设置。 UAC: