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 Sleepfunction(很多人使用DoEventsApplication.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:

http://windows.microsoft.com/en-us/windows7/products/features/user-account-control将其设置到底部“永不通知”立即修复&#x3002;