0

在 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需要基本身份验证用户名和密码。
如果我只是运行此代码,我会收到运行时错误 1004;它不会提示输入身份验证凭据。

但是,如果我进入 Excel“数据”功能区,选择“来自 Web”,然后在他们的迷你 Web 浏览器中访问http://my.url.com/ ,系统会提示我输入用户名和密码。
关闭此窗口然后重新运行我的 VBA 代码而不更改任何内容后,查询就可以工作了。但是在关闭 Excel 并重新运行时,它会再次失败,除非我通过这个极其丑陋的手动身份验证步骤。即使我告诉 Internet Explorer 永久保存这些凭据。

如何让 VBA 以编程方式使用基本身份验证对WebQuery进行身份验证,这样我就不需要采取这个额外的步骤?

编辑:不管 WebQuery 是如何启动的,要么这个,要么 Excel 中是否有一个设置来强制这个提示发生?)

我在 Windows 7 上使用 Excel 2010(32 位),但我的目标用户可能正在使用各种 Excel 版本(都在 Windows 上)。

4

3 回答 3

0

如果您想使用 QueryTables,身份验证很棘手。如此之多,以至于它甚至不值得,IMO。Excel 使用与 IE 不同的 cookie。因此,即使您通过 IE 进行身份验证,QueryTable 也不会识别它。如果您通过 Web Query 界面进行身份验证,那么它会设置正确的 cookie 并且您可以自动化。

正确的方法是避免使用 QueryTable 并通过 MS XML 对象库自己完成。创建一个 HTTP Request 对象,发送一个 POST 请求等。如果不是 RESTFUL,我认为你必须使用 HTTPServer 对象。有关使用 XML 的更多信息,请参阅http://dailydoseofexcel.com/archives/2011/03/08/get-data-from-website-that-requires-a-login/上的JP 评论。

当然,这还有很多工作要做,因为您必须完成查询表通常会做的所有事情。如果你想要那个功能,你必须处理刷新。

于 2015-12-15T22:09:01.100 回答
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
于 2015-12-15T20:48:21.760 回答
0

从其他答案来看,我认为我的正确做法是什至不尝试让 WebQuery 进行身份验证,而是在中间使用服务器端脚本,该脚本将用户 ID 和密码作为 POST 参数并与“真实”进行通信后端通过基本身份验证。

我已经编写并测试了一个,这似乎解决了我试图解决的实际问题。

于 2015-12-15T22:15:21.863 回答