从Excel超链接公式中提取URL

从Excel超链接公式中提取URL,excel,vba,hyperlink,Excel,Vba,Hyperlink,我有一个Excel文件,其中有数百个单元格使用超链接公式=Hyperlink(,)。我需要从这些文件中提取纯文本URL。我发现的大多数示例都依赖于使用不同超链接方法的单元格 这样的函数: Function HyperLinkText(pRange As Range) As String Dim ST1 As String Dim ST2 As String If pRange.Hyperlinks.Count = 0 Then HyperLinkText = "

我有一个Excel文件,其中有数百个单元格使用超链接公式
=Hyperlink(,)
。我需要从这些文件中提取纯文本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
函数HyperLinkText(范围为pRange)作为字符串
将ST1设置为字符串
作为字符串的Dim ST2
如果pRange.Hyperlinks.Count=0,则
HyperLinkText=“未找到”
退出功能
如果结束
ST1=pRange.Hyperlinks(1).地址
ST2=pRange.Hyperlinks(1).子地址
如果ST2“那么
ST1=“[”&ST1&“]”和ST2
如果结束
HyperLinkText=ST1
端函数

结果显示单元格文本“未找到”。或者,有没有办法将这些单元格转换为其他超链接格式,这样我的宏就可以工作?

Hm-玩弄它,我也无法让
.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
函数hyperlinkText(范围为pRange)作为字符串
尺寸st1为字符串,st2为字符串
Dim tempSub1作为字符串,tempSub2作为字符串
如果左(pRange.Formula,10)“=HYPERLINK”,则
hyperlinkText=“未找到”
退出功能
其他的
tempSub1=工作表函数.Substitute(pRange.Formula,“”,“[”,1)
tempSub2=WorksheetFunction.Substitute(tempSub1,“”,“]”,1)
hyperlinkText=Mid(tempSub2,工作表函数.Find(“[”,tempSub2)+1,工作表函数.Find(“]”,tempSub2)-worksheet函数.Find(“[”,tempSub2)-1)
如果结束
端函数

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

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

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
这只是检查公式是否以以下内容开头:

=超链接(“

如果是这样,则从该点抓取文本,直到以下

这里有一个方法,该方法将返回超链接文本,无论它是由公式创建的,还是由Insert/hyperlink方法创建的

如果是前者,我们只需要解析公式;如果是后者,我们需要迭代工作表上的超链接集合

如果单元格中没有超链接,则公式将不返回任何内容


非VBA可能性:

处理带有链接的单元格副本,因为第一步是将其部分内容(特别是
=
替换为不带符号的
)。然后,假设副本在A1中:

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

并将链接包含等号的
替换为
=

我最终使用了Python:

  • 下载(或转换)电子表格为xlsx格式
  • 使用pip或conda安装openpyxl
  • 使用类似以下代码阅读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”在我的示例中是带有超链接的列)

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

  • 下面是一个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)))
    
    图片供参考


    您的超链接是如何命名的?是有一个简短的名称,还是仅仅是
    =Hyperlink(“http://www.google.com“
    ?编辑:啊,对不起-没有看到你的第一句话:PI需要更多地了解Regex-这有点吓人,但是伙计,你能做一些漂亮、简短、切中要害的宏吗。(与我的相反,我只是用了一些引号,并使用了
    Mid
    )@BruceWayne-有选择是很好的。你的答案对很多人来说可能更舒服。顺便说一句,请查看一个很好的VBScript正则表达式参考。我只是在我的谷歌电子表格中尝试了一下,但给出了#值!错误消息:在FIND evaluation中找不到
    “”
    在xxx.com内。我遗漏了什么?
    =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)))