I have a spreadsheet that has hundreds of links that point to a server (with authentication) that can be accessed via the web. I’ve been searching for a solution to a Link Checker in a spreadsheet that would tell me which links are broken and which are ok. By broken I mean that the website does not get called up at all.
There are various solutions I have found around the web, none of which work for me. I’m boggled by this…
One example that I’ve tried to use and figure out is re-posted below.
As I’ve stepped through the code, I have come to realize that the
oHTTP.send request brings back “Nothing”. It does so for all links in the spreadsheet, regardless of whether the link works, or not.
Public Function CheckHyperlink(ByVal strUrl As String) As Boolean Dim oHttp As New MSXML2.XMLHTTP30 On Error GoTo ErrorHandler oHttp.Open "HEAD", strUrl, False oHttp.send If Not oHttp.Status = 200 Then CheckHyperlink = False Else CheckHyperlink = True Exit Function ErrorHandler: CheckHyperlink = False End Function
Any suggestions as to what might be wrong, or right, is highly appreciated!
A couple of possible causes..
- Do you mean
oHttp.Open "GET", strUrl, Falseinstead of
oHttp.Open "HEAD", strUrl, False?
- Perhaps MSXML2.XMLHTTP30 is not available? You can declare an instance of MSXML2.XMLHTTPX as either early bound or late bound which may impact which version you want to use vs what is available (example http://word.mvps.org/FAQs/InterDev/EarlyvsLateBinding.htm)
Option Explicit 'Dim oHTTPEB As New XMLHTTP30 'For early binding enable reference Microsoft XML, v3.0 Dim oHTTPEB As New XMLHTTP60 'For early binding enable reference Microsoft XML, v6.0 Sub Test() Dim chk1 As Boolean Dim chk2 As Boolean chk1 = CheckHyperlinkLB("http://stackoverflow.com/questions/11647297/xmlhttp-send-request-brings-back-nothing") chk2 = CheckHyperlinkEB("http://stackoverflow.com/questions/11647297/xmlhttp-send-request-brings-back-nothing") End Sub Public Function CheckHyperlinkLB(ByVal strUrl As String) As Boolean Dim oHTTPLB As Object 'late bound declaration of MSXML2.XMLHTTP30 Set oHTTPLB = CreateObject("Msxml2.XMLHTTP.3.0") On Error GoTo ErrorHandler oHTTPLB.Open "GET", strUrl, False oHTTPLB.send If Not oHTTPLB.Status = 200 Then CheckHyperlinkLB = False Else CheckHyperlinkLB = True Set oHTTPLB = Nothing Exit Function ErrorHandler: Set oHTTPLB = Nothing CheckHyperlinkLB = False End Function Public Function CheckHyperlinkEB(ByVal strUrl As String) As Boolean 'early bound declaration of MSXML2.XMLHTTP60 On Error GoTo ErrorHandler oHTTPEB.Open "GET", strUrl, False oHTTPEB.send If Not oHTTPEB.Status = 200 Then CheckHyperlinkEB = False Else CheckHyperlinkEB = True Set oHTTPEB = Nothing Exit Function ErrorHandler: Set oHTTPEB = Nothing CheckHyperlinkEB = False End Function
I tested the OP’s link by opening in a browser which I’ve now discovered redirects to the login page instead so it’s a different link I was testing. It’s probably failing because the oHttp object has not been set to allow redirects. I know it’s possible to set redirects for WinHttp.WinHttpRequest.5.1 using the code below. I would need to investigate if this also works for MSXML2.XMLHTTP30 though.
Option Explicit Sub Test() Dim chk1 As Boolean chk1 = CheckHyperlink("http://portal.emilfrey.ch/portal/page/portal/toyota/30_after_sales/20_ersatzteile%20und%20zubeh%C3%B6r/10_zubeh%C3%B6r/10_produktbezogene%20informationen/10_aussen/10_felgen/10_asa-pr%C3%BCfberichte/iq/tab1357333/iq%20016660.pdf") End Sub Public Function CheckHyperlink(ByVal strUrl As String) As Boolean Dim GetHeader As String Const WinHttpRequestOption_EnableRedirects = 6 Dim oHttp As Object Set oHttp = CreateObject("WinHttp.WinHttpRequest.5.1") On Error GoTo ErrorHandler oHttp.Option(WinHttpRequestOption_EnableRedirects) = True oHttp.Open "HEAD", strUrl, False oHttp.send If Not oHttp.Status = 200 Then CheckHyperlink = False Else GetHeader = oHttp.getAllResponseHeaders() CheckHyperlink = True End If Exit Function ErrorHandler: CheckHyperlink = False End Function
MSXML2.XMLHTTP does allow redirects (although I believe MSXML2.ServerXMLHTTP doesn’t). The redirects are allowed/disallowed depending upon whether the redirect is cross-domain, cross-port etc (see details here http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx)
Since the redirect to the login page is cross-domain then IE zone policy is implemented. Open IE/Tools/Internet Options/Security/Custom Level and change ‘Access data sources across domains’ to ENABLED
The original OP’s code will now redirect properly.