VLOOKUP和HYPERLINK无法正常工作

问题描述 投票:0回答:2

我有一个名为Color Guide的参考表,用于跟踪油漆颜色和这些油漆颜色的链接。它看起来像这样:

paint guide example 我有大约85张床单,每张床单代表一栋建筑物,每栋建筑物都有一套允许不同房间的油漆颜色选择。它看起来像这样:

building sheet example 我要做的是这样的:当我在颜色指南表(第一张图片)上更新我的外部超链接时,我需要在每个建筑表单上更新相同的超链接。我一直试图通过VLOOKUP实现这一点,但超链接不会拉过来。我在网上看到,我可以将HYPERLINK公式与VLOOKUP公式联系起来。这是看起来像,包括我点击图像2中的超链接时得到的错误:

formula plus error 我该怎么办?我已经在这个项目上工作了好几天,我无法让它工作。我在这里看到的其他答案似乎没有解决问题。

excel excel-formula vlookup excel-2016
2个回答
1
投票

选项1:在表UDF中

您可以在标准模块中使用Igor(略微修改)的以下代码作为基于工作表的方式,通过用户定义的函数(UDF)GetUrl更新Urls,包含在HYPERLINK函数中,以确保您有可点击的链接。

标准模块中的UDF代码:

Option Explicit

 Function GetURL(cell As Range, Optional default_value As Variant) as hyperlink
 'Lists the Hyperlink Address for a Given Cell

 'If cell does not contain a hyperlink, return default_value
      If (cell.Hyperlinks.Count <> 1) Then
          GetURL = default_value
      Else
          GetURL = cell.Hyperlinks(1).Address
      End If
End Function

通过在表2中的单元格中进行部署,例如,以下内容

=HYPERLINK(GetURL(Sheet1!A1))

并且单张格子A1正在更新超链接。

您需要将UDF(计算)的刷新与事件联系起来,以确保超链接文本可见地更新。

例如,在包含UDF的工作表中,Greg Glynn可以使用以下命令强制重新计算。当然,你可以找到一种有效的方法来做到这一点。

Private Sub Worksheet_Activate()

    Cells.Replace What:="=", Replacement:="=", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

End Sub

正如上面代码所讨论的那样:

Cell A1正在更新超链接

细胞A3(可能是不同表格中的细胞)具有GetURL功能,包裹在HYPERLINK函数内,指向A1

Using the UDF in the sheet

功能代码将放在标准模块中:

按Alt + F11打开VBE,然后在项目资源管理器窗口中,右键单击Insert Module,然后将代码输入到出现的模块中,例如

Entering code for User Defined Function into standard module

触发器代码(因此超链接文本更新)将进入包含该功能的每个工作表的工作表代码窗口中。如果工作表4中有GetUrl函数,您将在工作表代码窗口中输入如下:

Adding code into code window for a sheet

正如我在评论中所说,这可以放入每个工作表激活时调用的函数中。

选项2:与宏关联的工作表中的按钮,提示用户选择包含旧网址和新网址的范围

或者,以下,未经优化但我很乐意在评论中更新其他人。这只是您放置在附加到按钮的标准模块中的过程(Google将宏指定给Excel中的按钮 - 您还需要将“开发人员”选项卡添加到功能区)

Option Explicit

Public Sub ReplaceLinks()

    Dim linksArr()

    Application.ScreenUpdating = False

    Dim myRange As Range

    Set myRange = Application.InputBox("Please select both columns containing range of hyperlinks to update", Type:=8)

    If Not myRange Is Nothing And myRange.Columns.Count = 2 Then

        linksArr = myRange.Value

    Else

        MsgBox "Please select a range of two columns"
        Exit Sub

    End If

    ReDim Preserve linksArr(1 To UBound(linksArr), 1 To 3)

    linksArr = ValidateUrls(linksArr)

    Dim currentLink As Long

    For currentLink = LBound(linksArr, 1) To UBound(linksArr, 1)

        If linksArr(currentLink, 3) Then

            UpdateMyHyperlink CStr(linksArr(currentLink, 1)), CStr(linksArr(currentLink, 2))

        End If

    Next currentLink

    WriteValidationResults linksArr, myRange

End Sub

Private Function ValidateUrls(ByVal linksArr As Variant) As Variant

    Dim currentLink As Long

    For currentLink = LBound(linksArr, 1) To UBound(linksArr, 1)

        linksArr(currentLink, 3) = IsURLGood(CStr(linksArr(currentLink, 1)))

    Next currentLink

    ValidateUrls = linksArr

End Function

Public Function IsURLGood(ByVal url As String) As Boolean

    'https://www.experts-exchange.com/questions/27240517/vba-check-URL-if-it-is-active-or-not.html by m4trix

    Dim request As WinHttpRequest

    Set request = New WinHttpRequest

    On Error GoTo IsURLGoodError
    request.Open "HEAD", url
    request.Send

    IsURLGood = request.Status = 200

    Exit Function

IsURLGoodError:
    IsURLGood = False
End Function

Private Sub UpdateMyHyperlink(ByVal oldUrl As String, ByVal newUrl As String)

    Dim ws As Variant
    Dim hyperlink As Variant

    For Each ws In ThisWorkbook.Worksheets

        For Each hyperlink In ws.Hyperlinks

            If hyperlink.Address = oldUrl & "/" Then
                hyperlink.Address = Application.WorksheetFunction.Substitute(hyperlink.Address, oldUrl, newUrl)
                hyperlink.TextToDisplay = newUrl
            End If

        Next
    Next

End Sub

Private Sub WriteValidationResults(ByVal linksArr As Variant, ByRef myRange As Range)

    Dim isUrlValidOutput As Range

    Set isUrlValidOutput = myRange.Offset(, 2).Resize(myRange.Rows.Count, 1)

    isUrlValidOutput = Application.Index(linksArr, , 3)

    isUrlValidOutput.Offset(-1, 0).Resize(1) = "Valid URL"

End Sub

您可以按如下方式设置数据(通过代码添加D列):

Data for url updates

添加表单控件按钮:

Inserting a form control button

它会自动弹出一个窗口,您可以在其中分配更新链接过程:

Assign macro to button


1
投票

我的解决方案

问题是除了使用VLOOKUP之外,HYPERLINK还无法构建正确的超链接。

我通过在颜色指南上创建2列来解决这个问题。第一个存储颜色的名称。第二个存储了超链接。在第二张表格中,我想将名称和超链接拉入其中,我使用了以下公式:

=HYPERLINK(VLOOKUP(C3, 'Color Guide'!$A:$D, 4), VLOOKUP(C3, 'Color Guide'!$A:$D, 3))

第一个VLOOKUP拉出链接位置,第二个VLOOKUP拉出'友好名称'。这很好用,并在颜色指南上更改链接时自动更新链接!

© www.soinside.com 2019 - 2024. All rights reserved.