我有一个包含数百个使用超链接公式=HYPERLINK( <targetURL>, <friendlyName> )
的单元格的Excel文件。我需要从这些中提取纯文本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
导致单元格文本&#34;未找到&#34;。或者,有没有办法将这些单元格转换为另一种超链接格式,以便我可以使用宏?
答案 0 :(得分:1)
您可以使用正则表达式提取它:
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("
,如果是,则从该点抓取文本,直到以下"
。
答案 1 :(得分:0)
.Address
工作。
你说你只想提取网址,我能用这个宏做到这一点:
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
但请注意,它并没有获得&#34;友好名称&#34; Hyperlink()
公式,只是URL。
答案 2 :(得分:0)
非VBA可能性:
使用链接处理单元格的副本,因为第一步是替换部分内容(特别是=
,我建议使用not sign ¬
)。然后,假设副本在A1:
=SUBSTITUTE(LEFT(MID(A1,13,LEN(A1)),FIND("""",MID(A1,13,LEN(A1)))-1),"¬","=")
并将¬
替换为=
,其中链接包含等号。
答案 3 :(得分:0)
我最终使用Python:
使用类似于:
的代码读取xlsxfrom 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)
请注意名称&#39; Sheet1&#39;或列名称可能因具体情况而异(&#39; B&#39;是我的情况下带超链接的列)。
答案 4 :(得分:0)
这是一个Excel公式,可以从用于单元格的超链接中提取URL。
A1 =要提取网址的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)))