【问题标题】:Bulk check the status of an hyperlink批量检查超链接的状态
【发布时间】:2019-10-02 14:04:33
【问题描述】:

我在 excel 上有一个很长的超链接列表,我想创建一个代码来检查这些链接是否会驱动到错误页面。

我改编了这篇帖子Sort dead hyperlinks in Excel with VBA?的代码

但是每次运行都会报错

“403 - 禁止”

出现,无论链接是否有效。

我希望代码执行的是在下一个单元格中写入是否会导致 404 页面。 我想问题是缺少授权 excel 跟随超链接的额外行,但我想不出如何解决这个问题。

这是我正在使用的代码:

Sub CheckHyperlinks()    
    Dim oColumn As Range

    Dim oCell As Range
    For Each oCell In Selection    
        If oCell.Hyperlinks.Count > 0 Then   
            Dim oHyperlink As Hyperlink
            Set oHyperlink = oCell.Hyperlinks(1) ' I assume only 1 hyperlink per cell

            Dim strResult As String
            strResult = GetResult(oHyperlink.Address)
            oCell.Offset(0, 1).Value = strResult
        End If
    Next oCell
End Sub

Private Function GetResult(ByVal strUrl As String) As String
    On Error GoTo ErrorHandler

    Dim oHttp As New MSXML2.XMLHTTP60

    oHttp.Open "HEAD", strUrl, False
    oHttp.send

    GetResult = oHttp.Status & " " & oHttp.statusText

    Exit Function

ErrorHandler:
    GetResult = "Error: " & Err.Description  
End Function

【问题讨论】:

    标签: excel vba hyperlink reference http-status-code-403


    【解决方案1】:

    例如,如果您尝试访问http://www.google.com,但它在https://www.google.com 上有效(您可以使用Debug.Print GetResult("https://www.google.com" 对其进行测试,结果是200 OK

    所以它显然不遵循 Google 设置的 http://https:// 的重定向。

    或者使用WinHttpRequest object 代替GetResult

    Private Function GetResultExtended(ByVal strUrl As String) As String
        On Error GoTo ErrorHandler
    
        Dim xhr As Object
        Set xhr = CreateObject("WinHttp.WinHttpRequest.5.1")
    
        xhr.Option(6) = True 'follow redirects
        xhr.Open "HEAD", strUrl, False
        xhr.send
    
        GetResultExtended = xhr.Status & " " & xhr.statusText
        Exit Function
    
    ErrorHandler:
        GetResultExtended = "Error: " & Err.Description
    End Function
    

    如果您在函数上方定义以下WinHttpRequestOption enumeration,您也可以使用xhr.Option(WinHttpRequestOption_EnableRedirects),而不是xhr.Option(6)

    Option Explicit
    
    Private Enum WinHttpRequestOption
        WinHttpRequestOption_UserAgentString
        WinHttpRequestOption_URL
        WinHttpRequestOption_URLCodePage
        WinHttpRequestOption_EscapePercentInURL
        WinHttpRequestOption_SslErrorIgnoreFlags
        WinHttpRequestOption_SelectCertificate
        WinHttpRequestOption_EnableRedirects
        WinHttpRequestOption_UrlEscapeDisable
        WinHttpRequestOption_UrlEscapeDisableQuery
        WinHttpRequestOption_SecureProtocols
        WinHttpRequestOption_EnableTracing
        WinHttpRequestOption_RevertImpersonationOverSsl
        WinHttpRequestOption_EnableHttpsToHttpRedirects
        WinHttpRequestOption_EnablePassportAuthentication
        WinHttpRequestOption_MaxAutomaticRedirects
        WinHttpRequestOption_MaxResponseHeaderSize
        WinHttpRequestOption_MaxResponseDrainSize
        WinHttpRequestOption_EnableHttp1_1
        WinHttpRequestOption_EnableCertificateRevocationCheck
    End Enum
    

    【讨论】:

    • 嗨!谢谢回答。我为你的功能更改了,它仍然出现同样的问题。我正在尝试使用一个指向 404 页面 (nisbets.ie/dualit-black-kettle/cc804?vatToggle=incvat) 和一个有效 (nisbets.ie/dualit-bread-toaster-6-slice-stainless-steel/…) 的 URL,但在这两种情况下,它们附近的单元格中都会出现“403 Forbidden”。
    • @Paula 将 xhr.Open "HEAD", strUrl, False 更改为 xhr.Open "GET", strUrl, False
    • 谢谢!现在可以工作了吗:) 唯一遗憾的是,在长长的超链接列表上运行需要很长时间,但我想我必须耐心等待!感谢您的帮助。
    • @Paula 当然这需要时间,因为它必须等待每个网站发送答案并且 VBA 不支持多线程,因此每个 URL 都会一个接一个地检查(并行检查只能工作)具有多个线程,但因此您需要使用 Excel 以外的其他工具)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多