我一直在尝试通过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
如果可以提供任何具体建议来帮助我解决这个问题,我会非常感激。谢谢!
答案 0 :(得分:1)
自动化Internet Explorer应始终是最后的手段,它很慢并且依赖于页面结构保持不变。选择一个API(如果有的话)总是更好,在这种情况下稍微提供一个用于获取链接的API,你只需要获得你的身份验证令牌并在下面输入它:
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
然后,您可以将上述内容用作工作表中的函数
答案 1 :(得分:0)
我发现发生这种情况是因为页面未完全加载。 IE速度很慢,但有时需要使用它,因为Divs中有动态内容,需要使用object.click事件打开它。做到不做appIE.Busy和appIE.ReadyState = 4:DoEvents:循环可以帮助您,但它也可以挂起您的浏览器,因此使用计时器添加等待时间可以有所帮助。