【问题标题】:VBA Error 70: Permission Denied during IE automationVBA 错误 70:在 IE 自动化期间权限被拒绝
【发布时间】:2013-09-30 12:32:14
【问题描述】:

我一直在尝试通过 Excel 2010 在 VBA 中创建一个快速子例程,以自动通过 bit.ly 放置 URL 列表并将缩写链接复制回去以替换其原始链接。但是我收到一个错误 70: Permission Denied 运行时错误。我有几门课程,这大部分都有效,但我对 VBA 不是很熟悉,如果可能的话,可以在调试时使用一些帮助(这将是一个巨大的帮助)。代码如下:

Option Explicit

Dim IE As Object

Sub AutoAbbrev()

Set IE = CreateObject("InternetExplorer.Application")
Dim holdURL As String
Dim row_number As Integer
IE.Visible = True

For row_number = 101 To 112

holdURL = ""

If Range("b" & row_number).Value = "" Then GoTo Skip

IE.navigate "http://www.bitly.com" 'load bit.ly

Do While IE.readyState <> 4
    DoEvents
Loop

IE.document.all("shorten_url").Value = Range("b" & row_number).Value
IE.document.all("shorten_btn").Click

Do While IE.document.all("shorten_url").Value = Range("b" & row_number).Value Or IE.document.all("shorten_url").Value = ""
    DoEvents
Loop

holdURL = IE.document.all("shorten_url").Value
IE.document.all("shorten_url").Value = ""
Range("b" & row_number).Value = holdURL

Skip:
Next row_number

End Sub

Private Sub Command1_Click()

AutoAbbrev
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set IE = Nothing
If TypeName(IE) <> "Nothing" Then Unload IE
Set IE2 = Nothing
If TypeName(IE2) <> "Nothing" Then Unload IE2

End Sub

程序运行一次或多次迭代后,错误大多出现在这一行:

Do While IE.document.all("shorten_url").Value = Range("b" & row_number).Value Or IE.document.all("shorten_url").Value = ""
        DoEvents
    Loop

如果能提供任何具体的建议来帮助我克服这个困难,我将不胜感激。谢谢!

【问题讨论】:

  • 您能否举一个 Col B 单元格值的任何一个示例,以便我们对其进行测试?
  • 可能使用可以这样尝试.. 虽然 IE.document.getelementsbyid("shorten_url") nothing 'do more checks here DoEvents end while
  • b 列中的任何值都可以替换为任何网络链接 - stackoverflow.com、google.com 等。

标签: vba excel permission-denied browser-automation


【解决方案1】:

自动化 Internet Explorer 应始终是最后的手段,它速度慢并且依赖于保持不变的页面结构。如果有可用的 API,最好选择 API,在这种情况下,稍微提供一个 API 用于扫描链接,您只需要获取您的 Authentication Token 并在下面输入它:

Public Function Shorten(url As String) As String

    Const token As String = "YOUR AUTHENTICATION TOKEN"
    Static oRequest As Object

    If oRequest Is Nothing Then Set oRequest = CreateObject("winhttp.winhttprequest.5.1")

    With oRequest
        .Open "GET", "https://api-ssl.bitly.com/v3/shorten?access_token=" & token & "&longUrl=" & url & "&format=xml", False
        .send
        If Left(Split(.responsetext, "txt>")(1), 2) = "OK" Then Shorten = Split(Split(.responsetext, "url>")(1), "<")(0)
    End With

End Function

然后您可以在工作表中将上述内容用作函数

【讨论】:

  • 这个看起来比较优雅和简单。只有我不确定如何查找/合并我的身份验证令牌。此外,这是一个将为许多用户分发的宏。有没有办法让程序确定身份验证令牌(我假设不同机器上的每个用户都会有所不同?)
  • 我怀疑您的错误是由于 bitly 限制给定时间段内的请求数量以防止这种网络抓取。对于 API,一旦你完成了,你可以在这里获取你的 API 密钥:bitly.com/a/your_api_key。您需要查看使用限制,看看是否可以使用它们。我想您可以为所有用户使用您的 API 密钥,但您最好找到其他解决方案
【解决方案2】:

我发现这是因为页面没有完全加载。 IE 很慢,但有时您需要使用它,因为您在 Divs 中有动态内容,需要使用 object.click 事件打开。直到不是 appIE.Busy 和 appIE.ReadyState = 4: DoEvents: Loop 可以提供帮助,但它也可以挂起您的浏览器,因此使用计时器添加等待时间会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 2018-01-02
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多