【问题标题】:Extract URL From Excel Hyperlink Formula从 Excel 超链接公式中提取 URL
【发布时间】:2015-11-20 17:32:39
【问题描述】:

我有一个 Excel 文件,其中包含数百个使用超链接公式 =HYPERLINK( <targetURL>, <friendlyName> ) 的单元格。我需要从中提取纯文本 URL。我发现的大多数示例都依赖于使用不同超链接方法的单元格。

所以一个这样的函数:

Function HyperLinkText(pRange As Range) As String

   Dim ST1 As String
   Dim ST2 As String

   If pRange.Hyperlinks.Count = 0 Then
      HyperLinkText = "not found"
      Exit Function
   End If

   ST1 = pRange.Hyperlinks(1).Address
   ST2 = pRange.Hyperlinks(1).SubAddress

   If ST2 <> "" Then
      ST1 = "[" & ST1 & "]" & ST2
   End If

   HyperLinkText = ST1

End Function

导致单元格文本“未找到”。或者,有没有办法将这些单元格转换为其他超链接格式,以便我拥有的宏可以工作?

【问题讨论】:

  • 您的超链接是如何给出的?他们有一个简称,还是只是=Hyperlink("http://www.google.com")?编辑:啊,对不起 - 没有看到你的第一句话:P

标签: excel vba hyperlink


【解决方案1】:

嗯 - 玩弄它,我也无法让 .Address 工作。

你说你只想提取 URL,我可以用这个宏做到这一点:

Function hyperlinkText(pRange As Range) As String
Dim st1 As String, st2 As String
Dim tempSub1 As String, tempSub2 As String

If Left(pRange.Formula, 10) <> "=HYPERLINK" Then
    hyperlinkText = "not found"
    Exit Function
Else
    tempSub1 = WorksheetFunction.Substitute(pRange.Formula, """", "[", 1)
    tempSub2 = WorksheetFunction.Substitute(tempSub1, """", "]", 1)
    hyperlinkText = Mid(tempSub2, WorksheetFunction.Find("[", tempSub2) + 1, WorksheetFunction.Find("]", tempSub2) - WorksheetFunction.Find("[", tempSub2) - 1)
End If

End Function

但请注意,它没有得到 Hyperlink() 公式的“友好名称”,而只是 URL。

【讨论】:

    【解决方案2】:

    您可以使用正则表达式提取它:

    Dim re
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "^=HYPERLINK\(""([^""]+)"""
    
    If re.Test(pRange.Formula) Then
        Debug.Print "URL = " & re.Execute(pRange.Formula)(0).SubMatches(0)
    Else
        Debug.Print "URL not found"
    End If
    

    这只是检查公式是否以:

    =HYPERLINK("
    

    如果是,则从该点抓取文本,直到下一个 "

    【讨论】:

    • 我需要了解更多关于正则表达式的信息——这有点吓人,但是伙计,你能不能做一些漂亮、简短和中肯的宏。 (与我的相反,我只是替换了一些引号,并使用了Mid。)
    • @BruceWayne - 有选择是件好事。您的回答可能对许多人来说更舒服。顺便说一句,请查看 this page 以获得良好的 VBScript 正则表达式参考。
    【解决方案3】:

    这是一个返回超链接文本的方法,无论它是由公式创建的,还是由插入/超链接方法创建的。

    如果是前者,我们只需要解析公式即可;如果是后者,我们需要遍历工作表上的超链接集合。

    如果cell_ref中没有超链接,公式将不返回任何内容;改变以适应。


    Option Explicit
    Function HyperLinkText(rg As Range)
        Dim sFormula As String, S As String
        Dim L As Long
        Dim H As Hyperlink, HS As Hyperlinks
    
    sFormula = rg.Formula
    L = InStr(1, sFormula, "HYPERLINK(""", vbBinaryCompare)
    
    If L > 0 Then
        S = Mid(sFormula, L + 11)
        S = Left(S, InStr(S, """") - 1)
    Else
        Set HS = rg.Worksheet.Hyperlinks
        For Each H In HS
            If H.Range = rg Then
                S = H.Address
            End If
        Next H
    End If
    
    HyperLinkText = S
    
    End Function
    

    【讨论】:

      【解决方案4】:

      非 VBA 可能性:

      处理带有链接的单元格副本,因为第一步是替换它们的部分内容(特别是=,我建议使用不符号¬)。那么,假设副本在A1:

      =SUBSTITUTE(LEFT(MID(A1,13,LEN(A1)),FIND("""",MID(A1,13,LEN(A1)))-1),"¬","=")  
      

      并将¬ 替换为=,其中链接包含等号。

      【讨论】:

      • 我只是在我的 google 电子表格中尝试,但给出 #VALUE! 错误消息:在 FIND 评估中无法在 xxx.com 中找到 ""我错过了什么?
      【解决方案5】:

      我最终使用了 Python:

      1. 将电子表格下载(或转换)为 xlsx 格式。
      2. 使用 pip 或 conda 安装 openpyxl
      3. 使用类似于以下的代码读取 xlsx:

        from openpyxl import load_workbook
        wb = load_workbook(filename = 'cities.xlsx')
        print(wb.worksheets)
        print(dir(wb))
        sheet_ranges = wb['Sheet1']
        for c in sheet_ranges['B']:
            print(c.hyperlink.target)
        

      请注意,名称“Sheet1”或列名可能因情况而异(在我的情况下,“B”是带有超链接的列)。

      1. 打印链接后,将其复制并粘贴到工作表的新列中。

      【讨论】:

        【解决方案6】:

        这是一个 Excel 公式,可以从用于单元格的超链接中提取 URL。

        A1= 要提取 URL 的 Excel 单元格。

        =MID(FORMULATEXT(A1),FIND(CHAR(34),FORMULATEXT(A1))+1,FIND(CHAR(34),FORMULATEXT(A1),FIND(CHAR(34),FORMULATEXT(A1))+1)-1-FIND(CHAR(34),FORMULATEXT(A1)))
        

        图片供参考。

        【讨论】:

          猜你喜欢
          • 2016-10-16
          • 2022-01-24
          • 2021-02-01
          • 2016-08-26
          • 2011-08-04
          • 2022-11-22
          • 2020-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多