Excel:从链接的URL获取超链接

时间:2017-01-17 12:22:58

标签: excel vba excel-vba

抱歉这个难以理解的问题标题。我有一个工作簿,在表中有大量链接,由HYPERLINK函数生成,如下所示:

=HYPERLINK(CONCAT("http://google.com/search?btnI=I%27m+Feeling+Lucky&q=",[@[Patent No]],"&sourceid=navclient"),"Search")

生成的网址会在Google上搜索专利号[@[Patent No]],并使用Google的“我感觉很幸运”导航到第一个匹配的网页。然而,我收到的许多专利都是错误的语言,例如http://www.google.ch/patents/US20150086824。解决方案很简单,在网址中将.ch更改为.com。

我的问题是如何在Excel中自动执行此操作?因此,获取我感觉幸运的页面链接将发送给我,然后将.ch更改为.com,然后将固定链接提供为我在Excel中获得的链接。

我希望这是有道理的,如果可以通过功能完成那么最好,或者必要时使用vba。我快速浏览一下,但在搜索时发现问题很棘手。

更新

也许我应该让我感觉幸运的部分更加清晰。假设我想在谷歌上搜索“Stack Overflow”并点击谷歌搜索出现的第一个链接(很可能是https://stackoverflow.com/,但我不想只链接到网站本身,我想链接到我感觉幸运的结果)。 目前Excel构建如下链接:

=HYPERLINK(CONCAT("http://google.com/search?btnI=I%27m+Feeling+Lucky&q=","Stack Overflow","&sourceid=navclient"),"Search")

在地址为Search 的Excel 中提供网址:http://google.com/search?btnI=I%27m+Feeling+Lucky&q=Stack%Overflow&sourceid=navclient

如果我点击Search,我会转到https://stackoverflow.com/,但Excel不知道,在我点击链接然后 <之前,没有人知道em> Google决定目的地。基本上我在Excel中使用可变搜索词(Stack Overflow或专利号), export 将该信息提供给Google(以我很幸运链接的形式)决定链接到哪里,然后导入 Google决定返回Excel的目的地 - 我可以替换.ch并创建新的搜索在Excel中链接。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

我在UDF中包含的重要代码,它返回了Google提供的第一个链接(效果与我感觉幸运但没有特别使用它)

Function GOOGLE(SearchTerm)
    Dim url As String, lastRow As Long
    Dim XMLHTTP As Object, html As Object, objResultDiv As Object, objH3 As Object
    Dim cookie As String
    Dim result_cookie As String


        url = "https://www.google.co.uk/search?q=" & SearchTerm & "&rnd=" & WorksheetFunction.RandBetween(1, 10000)

        Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP")
        XMLHTTP.Open "GET", url, False
        XMLHTTP.setRequestHeader "Content-Type", "text/xml"
        XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"
        XMLHTTP.send

            Set html = CreateObject("htmlfile")
        html.body.innerHTML = XMLHTTP.ResponseText
        Set objResultDiv = html.getelementbyid("rso")
        Set objH3 = objResultDiv.getelementsbytagname("H3")(0)

       'friendlyName = objH3.InnerText
        GOOGLE = objH3.parentElement.href

End Function

之后我只需要一些简单的嵌套函数来切换国家代码(我决定将其包装在另一个UDF中):

Function CHANGE_CODE(link As String, newcode As String) As String
    Dim linkst As Double
    Dim trimmed As String
    Dim oldcode As String

    On Error GoTo ErrHandler

    linkst = WorksheetFunction.Search("google.", link) + 6
    trimmed = Right(link, Len(link) - linkst)
    oldcode = Mid(link, linkst, WorksheetFunction.Search("/", trimmed))
    CHANGE_CODE = WorksheetFunction.Substitute(link, oldcode, newcode, 1)
    Exit Function

ErrHandler:
    CHANGE_CODE = link

End Function

因此,我的最终电子表格代码类似于=HYPERLINK(CHANGE_CODE(GOOGLE( "blah" ),".com"),"Search")

我后来才意识到GOOGLE()是易变的,所以为了避免每次更新我的工作表时等待100次搜索,我用宏来实现这些函数,而不是输入单元格(对于“表1”,使用列A包含搜索字词,B列称为“Google”,其中包含结果):

Sub CallGoogle() 'places a google link in each cell of a table
Dim c As Range
Set Table = Range("Table1[Google]")
For Each c In Table.Cells
    link = CHANGE_CODE(GOOGLE(c.Offset(0, -1)), ".com")
    ActiveSheet.Hyperlinks.Add _
        Anchor:=c, _
        Address:=link, _
        ScreenTip:="Google top rank for " & c.Offset(0, -1), _
        TextToDisplay:="Search"
    Next
End Sub

这让我觉得把所有内容都放在UDF中是有点愚蠢的,但是如果你愿意,可以很容易地修复它们。