简体   繁体   English

使用VBA在Excel中对死去的超链接进行排序?

[英]Sort dead hyperlinks in Excel with VBA?

The title says it: 标题说:

I have an excel Sheet with an column full of hyperlinks. 我有一个excel Sheet,其中包含一个包含超链接的列。 Now I want that an VBA Script checks which hyperlinks are dead or work and makes an entry into the next columns either with the text 404 Error or active. 现在我想要一个VBA脚本检查哪些超链接已经死亡或工作,并使用文本404错误或活动进入下一列。

Hopefully someone can help me because I am not really good at VB. 希望有人可以帮助我,因为我不擅长VB。

EDIT: 编辑:

I found @ http://www.utteraccess.com/forums/printthread.php?Cat=&Board=84&main=1037294&type=thread 我发现@ http://www.utteraccess.com/forums/printthread.php?Cat=&Board=84&main=1037294&type=thread

A solution which is made for word but the Problem is that I need this solution for Excel. 一个解决方案是单词,但问题是我需要这个Excel的解决方案。 Can someone translate this to Excel solution? 有人可以将此转换为Excel解决方案吗?

Private Sub testHyperlinks()
    Dim thisHyperlink As Hyperlink
    For Each thisHyperlink In ActiveDocument.Hyperlinks
        If thisHyperlink.Address <> "" And Left(thisHyperlink.Address, 6) <> "mailto" Then
            If Not IsURLGood(thisHyperlink.Address) Then
                Debug.Print thisHyperlink.Address
            End If
        End If
    Next
End Sub


Private Function IsURLGood(url As String) As Boolean
    ' Test the URL to see if it is good
    Dim request As New WinHttpRequest

    On Error GoTo IsURLGoodError
    request.Open "GET", url
    request.Send
    If request.Status = 200 Then
        IsURLGood = True
    Else
        IsURLGood = False
    End If
    Exit Function
IsURLGoodError:
        IsURLGood = False
End Function

First add a reference to Microsoft XML V3 (or above), using Tools->References. 首先使用Tools-> References添加对Microsoft XML V3(或更高版本)的引用。 Then paste this code: 然后粘贴此代码:

Option Explicit

Sub CheckHyperlinks()

    Dim oColumn As Range
    Set oColumn = GetColumn() ' replace this with code to get the relevant column

    Dim oCell As Range
    For Each oCell In oColumn.Cells

        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.XMLHTTP30

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

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

    Exit Function

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

End Function

Private Function GetColumn() As Range
    Set GetColumn = ActiveWorkbook.Worksheets(1).Range("A:A")
End Function

Gary's code is perfect, but I would rather use a public function in a module and use it in a cell as function. Gary的代码是完美的,但我宁愿在模块中使用公共函数,并将其作为函数在单元格中使用。 The advantage is that you can use it in a cell of your choice or anyother more complex function. 优点是您可以在您选择的单元格或任何其他更复杂的功能中使用它。

In the code below I have adjusted Gary's code to return a boolean and you can then use this output in an =IF(CHECKHYPERLINK(A1);"OK";"FAILED"). 在下面的代码中,我调整了Gary的代码以返回布尔值,然后您可以在= IF中使用此输出(CHECKHYPERLINK(A1);“OK”;“FAILED”)。 Alternatively you could return an Integer and return the status itself (eg.: =IF(CHECKHYPERLINK(A1)=200;"OK";"FAILED")) 或者你可以返回一个Integer并返回状态本身(例如:= IF(CHECKHYPERLINK(A1)= 200;“OK”;“FAILED”))

A1: http://www.whatever.com A1: http//www.whatever.com
A2: =IF(CHECKHYPERLINK(A1);"OK";"FAILED") A2:= IF(CHECKHYPERLINK(A1);“OK”;“FAILED”)

To use this code please follow Gary's instructions and additionally add a module to the workbook (right click on the VBAProject --> Insert --> Module) and paste the code into the module. 要使用此代码,请遵循Gary的说明并另外向工作簿添加一个模块(右键单击VBAProject - >插入 - >模块)并将代码粘贴到模块中。


Option Explicit

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

Please also be aware that, if the page is down, the timeout can be long. 另请注意,如果页面关闭,则超时可能很长。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM