VLOOKUP和HYPERLINK无法正常工作

我有一个名为“颜色指南”的参考表,用于跟踪绘画颜色和指向这些颜色的链接。 它看起来像这样:

油漆指南的例子

我有大约85张床单,每一张都代表一座build筑物,每栋build筑物都有一套允许不同房间的颜色select。 它看起来像这样:

建筑表格示例

我正在做的是这样的:当我更新颜色指南工作表(第一个图像)上的外部超链接时,我需要相同的超链接来更新每个构build表。 我一直试图通过VLOOKUP来实现这一点,但超链接并没有超越。 我在网上读到,我可以连接HYPERLINK公式和VLOOKUP公式。 这是看起来像,包括我点击从图像2超链接时得到的错误:

公式加错误

我该怎么办? 我一直在这个项目上工作了好几天,但是我无法完成这个工作。 我在这里看到的其他答案似乎并没有解决这个问题。

选项1:在工作表UDF中

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

标准模块中的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进行以下操作来强制重新计算。 当然你可以玩弄find一个有效的方法来做到这一点。

 Private Sub Worksheet_Activate() Cells.Replace What:="=", Replacement:="=", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End Sub 

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

单元格A1具有正在更新的超链接

单元格A3 (可能是另一个表格中的一个单元格)具有函数GetURL ,它封装在指向A1HYPERLINK函数中。

在工作表中使用UDF

function代码将在标准模块中进行:

Alt + F11打开VBE,然后在项目资源pipe理器窗口中,右键单击Insert Module然后在显示的模块中input代码,例如

将用户定义函数的代码输入到标准模块中

触发器代码(所以超链接文本更新)将进入工作表代码窗口为每个工作表包含该function,例如,如果工作表4中有GetUrl函数,您将input在工作表代码窗口中,如下所示:

将代码添加到工作表的代码窗口中

正如我在评论中所说,这可以被放入一个函数,当每个表被激活。

选项2:与macros关联的工作表中的button,提示用户select一个包含旧的URL和新的URL的范围

或者,下面这些没有优化,但我很乐意在其他人的评论中更新。 这只不过是放置在附加到button的标准模块中的一个过程(Google在Excel中将macros指定给button – 您还需要将“开发人员”选项卡添加到function区)

 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是通过代码添加的):

网址更新的数据

添加一个表单控件button:

插入一个表单控件按钮

自动popup一个窗口,然后你可以分配更新链接过程:

将宏指定给按钮

我的解决scheme

问题是除了使用VLOOKUP之外,HYPERLINK不能build立正确的超级链接。

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

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

第一个VLOOKUP拉住了链接位置,第二个VLOOKUP拉上了“友好名字”。 这个工程很好,并自动更新链接,当它在颜色指南更改!