关于 vba:Xmlhttp 请求引发访问被拒绝错误

Xmlhttp request is raising an Access Denied error

以下 Excel 宏正在向该网页发出 xmlhttp 请求以在第二阶段检索一些值,直到前一段时间在 VBA 中正常工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
Sub WebReq()

Link ="http://it.finance.yahoo.com/q?s=^FCHI&ql=10" & str(rnd())
Set htm = CreateObject("htmlFile")

Set RequestWeb = CreateObject("msxml2.xmlhttp")
With RequestWeb
    .Open"GET","" & Link &"", False
    .send
    htm.body.innerhtml = .responsetext
End With

End Sub

现在,在调用方法时:

1
    .send

对象 msxml2.xmlhttp 引发以下错误:

1
2
Run-time error '-2147024891 (80070005)'
Access is denied.

我一直在网上寻找,但所有类似的帖子都没有得到答复。谁能解释一下这个错误是什么意思,如果有什么办法可以解决它,甚至只是解决它?

注意:变量\\'Link\\'末尾的随机字符串已被添加以强制页面重新加载,因为脚本正在检索实时值,因此每次都应该加载它。

附加信息:在寻找解决方案时,我注意到链接的随机部分总是产生相同的值,即使我结束运行并再次重新启动:

1
Link = http://it.finance.yahoo.com/q?s=^FCHI&ql=10 .7055475

为什么会这样? rnd() 不应该在每次调用时产生一个介于 0 和 1 之间的新随机值吗?


使用

1
CreateObject("MSXML2.ServerXMLHTTP.6.0")

从本地计算机发出的标准请求禁止访问不受 IE 信任的站点。 MSXML2.ServerXMLHTTP.6.0 是服务器端对象,它不执行这些检查。


我发现,就我而言,将 http 更改为 https 可以解决访问被拒绝的问题。我只能假设该网站以某种方式进行了更改并且没有告诉任何人

  • 这么简单的解决方案!同样的事情发生在我身上!
  • 在浪费时间更改我的标题之后,事实证明这也是我的解决方案。


访问被拒绝是 IE 问题

1
internet options > security tab > custom security level > Miscellaneous >Access data sources across domains > enable

  • 有趣的。这是我在 IE6 中的问题;即使帖子要转到页面域的子域,IE6 默认情况下也不会允许该子域。最终,我不得不在同一个域上使用与 80 不同的端口号,而不是使用子域(以及防火墙中的端口转发器,这样我就可以在内部获取实际位于不同服务器上的资源)。
  • 这对我有用


更新

1
2
3
4
5
6
7
8
9
10
11
12
13
Sub WebReq()

link ="http://it.finance.yahoo.com/q?s=^FCHI&ql=10" & Str(Rnd())
Set htm = CreateObject("htmlFile")
Dim objHttp

    Set objHttp = CreateObject("Msxml2.ServerXMLHTTP")
    objHttp.Open"GET", link, False

    objHttp.Send
    htm.body.innerhtml = objHttp.responsetext
    Set objHttp = Nothing
End Sub

  • 嗨,丰富,谢谢你的回答。不幸的是,在调试时 3.0 对象不会引发 access denied 错误,但它会返回一个空的 responseText。相反,在运行时它会以 The data is not available yet 失败:/
  • @MatteoNNZ 我的坏matteo,试试上面的代码,这次我返回了HTML,它成功了。
  • 也许有些东西对我不利,但现在我得到了 Run-time error '-2147012889 (80072ee7): The server name or address could not be resolved。我一直在网上找了一下,似乎与浏览器代理有关。我承认我不是网络服务专家,你知道为什么这个对象会引发这个问题吗?
  • 好吧,如果您的公司浏览器代理包中内置了通过 vbscript 访问 html 的限制,那肯定会导致它。那可能吗?
  • 我不这么认为,我在某些时候也是这么想的,但是一些朋友在我的要求下尝试了代码并且得到了同样的错误,所以我不认为这取决于网络。
  • 这很奇怪,因为我使用这个完全相同的脚本从 www.slashdot.org 向我发送新条目时的更新。
  • 是的,但实际上我的意思不是脚本不起作用,而是 Yahoo! 的网站!财务没有返回请求。我确信它可以在其他网站上使用,我自己将它用于其他目的。好吧,我想这只是厌倦了这个,我不知道,但我通过在线找到另一个数据提供者解决了这个问题。不管怎么说,还是要谢谢你 ;)


这对我有用:

1
2
3
4
5
With CreateObject("MSXML2.ServerXMLHTTP.6.0")
  .Open"GET", URL, False
  .Send
  content = .ResponseText
End With

在您的自定义链接中的 "https://" 之后添加 "www",
像这样:

1
2
XMLPage.Open"GET","https://www.x-rates.com/table/?from=GBP&amount=3", False    
XMLPage.send

我可以通过将传递的链接从 "http://" 更改为 "https://"

来修复它

我拉取的网站已升级,尝试使用不安全链接拉取数据失败。现在效果很好(无需更改代码。


在我的情况下,用户对我们公司网络上的代理服务器没有 AD 权限。 (设置用户时的简单疏忽。)添加缺少的安全组为用户解决了问题。


恐怕我不明白为什么会出现这个问题,但我猜这是安全的 "https://" 与不安全的 "http://"。在遵循 VBA 课程中的示例代码时,我遇到了相同的"拒绝访问"消息。原来的代码是:

1
2
XMLPage.Open"GET","http://x-rates.com/table/?from=GBP&amount=3", False    
XMLPage.send

我将 "http://" 更改为 "https://" 并且错误消失了。