Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA脚本在URL列表中查找404错误?_Vba_Excel_Http Status Code 404 - Fatal编程技术网

Excel VBA脚本在URL列表中查找404错误?

Excel VBA脚本在URL列表中查找404错误?,vba,excel,http-status-code-404,Vba,Excel,Http Status Code 404,所以,我有一个电子表格,里面有大约5000个URL。(公司内部网上的所有页面。) 我们知道一些链接已断开,但不知道有什么好方法可以在不点击全部5000个链接的情况下确定断开的链接 通常这是一个简单的问题:创建一个包含5000页链接的网页,然后使用Xenu Link Sleuth之类的工具检查链接 但在这种情况下,这是行不通的,因为许多链接正在被重定向,重定向代码欺骗了HTTP.response 200,这欺骗了Xenu将其视为有效的URL 但是,有一些好消息:重定向脚本不是从Excel中运行的。

所以,我有一个电子表格,里面有大约5000个URL。(公司内部网上的所有页面。)

我们知道一些链接已断开,但不知道有什么好方法可以在不点击全部5000个链接的情况下确定断开的链接

通常这是一个简单的问题:创建一个包含5000页链接的网页,然后使用Xenu Link Sleuth之类的工具检查链接

但在这种情况下,这是行不通的,因为许多链接正在被重定向,重定向代码欺骗了HTTP.response 200,这欺骗了Xenu将其视为有效的URL

但是,有一些好消息:重定向脚本不是从Excel中运行的。如果单击Excel中的错误链接,则不会执行重定向脚本,并将HTTP响应报告回Excel。我相信Excel应该能够识别正确的HTTP响应代码(404)——或者至少能够识别链接是否有效

这就引出了我的问题:

有没有一种方法可以使用VBA编写一个脚本,通过单击每个链接并捕获结果?捕获的结果可以是HTTP响应代码的形式,也可以是您认为有助于在5000页的列表中查找坏链接的任何其他形式。理想情况下,结果将写入电子表格中与链接相邻的单元格中


如果有人对VBA足够熟悉,能够提出解决这个问题的建议,我将永远感激

使用用户定义的函数返回HTML状态代码,并将其拖到链接旁边。不过,Excel检查5000个链接可能需要一段时间

Public Function CheckURL(url As String) As String
Dim request As New WinHttpRequest
request.Open "GET", url
request.Send
CheckURL = request.Status
End Function

您可能需要在“Extras”->“References”

下添加对“Microsoft WinHTTP Services”的引用下面是一个使用Excel检查URL列表中状态行的示例:

Sub TestLinks()
  Dim source As Range, req As Object, url$
  Set req = CreateObject("Msxml2.ServerXMLHTTP.6.0")

  ' define were the links and results are
  Set source = Range("A1:B2")

  ' clear the results
  source.Columns(2).Clear

  ' iterate each row
  For i = 1 To source.Rows.count
    ' get the link from the first column
    url = source.Cells(i, 1)

    ' send the request using a HEAD to check the status line
    req.Open "HEAD", url, False
    req.setRequestHeader "Accept", "image/webp,image/*,*/*;q=0.8"
    req.setRequestHeader "Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6"
    req.setRequestHeader "Accept-Encoding", "gzip, deflate"
    req.setRequestHeader "Cache-Control", "no-cache"
    req.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
    req.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"
    req.Send

    ' write the result in the second column
    source.Cells(i, 2) = req.Status
  Next

  MsgBox "Finished!"
End Sub

使用Xmlhttp也是可能的。对我来说,我发现使用WinHttpRequest更加健壮。非常感谢,@florentbr!我仍在学习如何使用Excel中的Visual Basic窗口。我将首先尝试让@bioschaf的脚本工作,然后尝试让您的脚本工作。我非常感谢你的帮助!你好,bioschaf,非常感谢你的帮助!我几乎从未接触过Excel VBA。你介意给我一点指导吗?在我的电子表格中,我启用了“开发人员”选项卡,然后打开了visual basic窗口。从那里,我将您的代码粘贴到代码区。然后回到电子表格中,我尝试使用=CheckURL(A2)执行函数。但这会导致一个错误。知道我做错了什么吗?(我确实按照建议启用了Microsoft WinHTTP服务。)您好,您需要在模块中插入函数以使其正常工作。因此,在VBA窗口中,右键单击项目,选择“插入->模块”“然后将代码粘贴到那里。那么您应该能够在excel-cells中使用该函数。太棒了,非常感谢。成功了。我测试了3行,得到了结果-现在我复制了5000行,Excel“很忙”。:-)是的,这需要很多时间。也许用一些返回404的超链接进行测试是个好主意——只是为了确保宏产生正确的结果。好主意。我一直在玩它;到目前为止,结果好坏参半。我测试了一些无效的URL,但得到的是401而不是404。我还测试了一些重定向的URL,这些URL也返回了401。最令人困惑的是,我测试了几个有效的URL,它们也返回了401。但并不是所有的事情都在恢复。有少数200个,一些403和404个,一些503个,还有一些显示了价值!所有的“价值!”s对应于不再存在的站点上的页面。