【问题标题】:List Hyperlinks in Excel在 Excel 中列出超链接
【发布时间】:2013-02-21 19:32:23
【问题描述】:

我有一个包含大量工作表的 Excel 工作簿。每个工作表都有 1 到 12 个指向网站上不同文档的超链接。这些文档会不时更新。我想要一个宏,它列出了新工作表中的所有超链接,但也列出了每个链接旁边的工作表名称。我有以下列出超链接和单元格参考

Sub CopyHyperLinks()  
  Dim rCell As Range 
  Dim ws As Worksheet 
  Dim Lhyper As Long                  
  On Error Resume Next 
  Application.DisplayAlerts = False 
  Sheets("Hypers").Delete 
  On Error Goto 0 
  Application.DisplayAlerts = True 
  Sheets.Add().Name = "Hypers" 

  For Each ws In Worksheets
    If ws.Name <> "Hypers" Then 
      For Lhyper = 1 To ws.UsedRange.Hyperlinks.Count  
        ws.Hyperlinks(Lhyper).Range.Copy 
        With Sheets("Hypers").Cells(Rows.Count, 1).End(x1Up)  
          .Offset(1, 0).PasteSpecial
          .Offset(1, 1) = ws.Hyperlinks(Lhyper).Range.Address 
        End
        Application.CutCopyMode = False 
       Next Lhyper 
     End If 
  Next ws 
End Sub 

如何修改它以显示工作表名称而不是单元格引用。 是否也可以检查这些超链接是否是有效的目的地?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您可以通过此行获取超链接的工作表名称:

    ws.Hyperlinks(Lhyper)..Range.Worksheet.Name
    

    这是您重新编写的代码(其中包含一些我更正的其他语法错误):

    Sub CopyHyperLinks()
        Dim rCell As Range
        Dim ws As Worksheet
        Dim Lhyper As Long
        Dim rngLink As Range
    
        Application.DisplayAlerts = False
    
        On Error Resume Next
        Sheets("Hypers").Delete
    
        On Error GoTo 0
        Application.DisplayAlerts = True
    
        Sheets.Add().Name = "Hypers"
    
        For Each ws In Worksheets
            If ws.Name <> "Hypers" Then
                For Lhyper = 1 To ws.UsedRange.Hyperlinks.Count
                    Set rngLink = ws.Hyperlinks(Lhyper).Range
                    rngLink.Copy
                    With Sheets("Hypers").Cells(Rows.Count, 1).End(xlUp)
                        .Offset(1, 0).PasteSpecial
                        .Offset(1, 1) = rngLink.Address
                        .Offset(1, 2) = rngLink.Worksheet.Name
                        .Offset(1, 3) = CheckHyperlink(ws.Hyperlinks(Lhyper).Address)
                    End With
                    Application.CutCopyMode = False
                Next Lhyper
            End If
        Next ws
    End Sub
    

    如果您想验证链接,请包含代码from this answer。在您的代码中包含这一行:

    .Offset(1, 3) = CheckHyperlink(ws.Hyperlinks(Lhyper).Address)
    

    还有这个例程:

    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
    

    您需要在 VBA 项目中包含对“Microsoft XML”库的引用。

    【讨论】:

    • +1 好的完整答案 + 以前从未见过这个 xml 参考 - 看起来很有趣
    • 非常有用的库,当您必须处理 XML(例如,用于功能区或外部数据)或 HTTP 时,让生活变得更加轻松
    • 彼得我现在有这个工作。这正是我所需要的,非常感谢。只是一些小事情 1)它在第一张纸上选择了超链接,但是它没有给出表格名称或验证的真/假。 2)粘贴时是否可以格式化它的粘贴方式,以便所有粘贴相同,即 A 列超链接(只是拉伸 A 列以适合文本而不是粘贴为合并的单元格,其中一些超链接是)B 列工作表名称(再次拉伸以适合文本)C 列真/假。我无法发布我的工作簿,因为我是 MOD,它包含受限制的信息抱歉。
    • 1) 不知道,没有文件很难判断。尝试使用 F8 单步调试代码并查看 Locals and Watch 窗口! 2) 运行Sheets("Hypers").Columns("A:C").EntireColumn.AutoFit 作为End Sub 之前的最后一个命令。 PS:别忘了标记为答案! ;-)
    • 谢谢,效果好一点。我现在在更新超链接时遇到问题,如果它在验证时给出了错误。我再次运行宏以确保它给出一个真值,它复制了超链接,一个像以前一样为假,一个为真,表明它现在已更新。我如何阻止它仍然显示旧的 False 结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多