在VBA中,我试图将WebQuery用于我正在编写的用于检索财务数据的工具 我使用类似的代码创建一个WebQuery:
url = "URL;http://my.url.com/"
With Worksheets("Sheet1").QueryTables.Add(Connection:=url, Destination:=Worksheets("Sheet1").Range("A1"))
.PostText = "Param1=Foo&Param2=Bar"
.Name = "My Query"
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 1
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
我遇到的问题是 my.url.com 需要Basic Authentication用户ID和密码。
如果我只是运行此代码,我得到运行时错误1004;它不会提示输入身份验证凭据。
但如果我进入Excel" Data"功能区,选择"从Web",然后在他们的迷你网络浏览器中转到http://my.url.com/,系统会提示我输入用户名和密码。
关闭此窗口,然后重新运行我的VBA代码而不更改任何内容,查询工作。
但是在关闭Excel并重新运行时,它会再次失败,除非我经历了这个非常丑陋的手动身份验证步骤。即使我已经告诉Internet Explorer永久保存这些凭据。
如何通过基本身份验证让VBA以以编程方式验证 WebQuery ,以便我不需要采取额外的步骤?
(编辑:这个,或者Excel中是否有设置强制此提示发生,无论WebQuery是如何启动的?)
我在Windows 7上使用Excel 2010(32位),但我的目标用户可能正在使用各种Excel版本(全部在Windows上)。
答案 0 :(得分:0)
您必须进入源代码并找到按钮,用户名文本框和密码文本框的ID,然后输入以下内容:
If objExist("LoginButton id", IE) Then
.Document.getElementById("username textbox id").Value = "username"
.Document.getElementById("password textbox id").Value = "password"
.Document.getElementById("LoginButton id").Click
End If
答案 1 :(得分:0)
如果您想使用QueryTables,身份验证很棘手。这么多,以至于它甚至不值得,IMO。 Excel使用与IE不同的Cookie。因此,即使您通过IE进行身份验证,QueryTable也无法识别它。如果您通过Web Query界面进行身份验证,那么它会设置正确的cookie并且您可以自动执行。
正确的方法是避免使用QueryTable并通过MS XML对象库自行完成。创建HTTP请求对象,发送POST请求等。如果它不是RESTFUL,我认为您必须使用HTTPServer对象。有关使用XML的更多信息,请参阅JP http://dailydoseofexcel.com/archives/2011/03/08/get-data-from-website-that-requires-a-login/上的评论。
当然,这需要做更多工作,因为你必须完成查询表通常会做的所有事情。如果你想要这个功能,你必须处理刷新。
答案 2 :(得分:0)
根据其他答案判断,我认为我的正确做法是不要尝试让WebQuery进行身份验证,并在中间使用服务器端脚本,将用户ID和密码作为POST参数并通过基本身份验证的“真实”后端。
我已经编写并测试了一个,这似乎解决了我想解决的实际问题。