我有一个名为Color Guide的参考表,用于跟踪油漆颜色和这些油漆颜色的链接。它看起来像这样:
我有大约85张床单,每张床单代表一栋建筑物,每栋建筑物都有一套允许不同房间的油漆颜色选择。它看起来像这样:
我要做的是这样的:当我在颜色指南表(第一张图片)上更新我的外部超链接时,我需要在每个建筑表单上更新相同的超链接。我一直试图通过VLOOKUP实现这一点,但超链接不会拉过来。我在网上看到,我可以将HYPERLINK公式与VLOOKUP公式联系起来。这是看起来像,包括我点击图像2中的超链接时得到的错误:
选项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
。
功能代码将放在标准模块中:
按Alt + F11打开VBE,然后在项目资源管理器窗口中,右键单击Insert Module
,然后将代码输入到出现的模块中,例如
触发器代码(因此超链接文本更新)将进入包含该功能的每个工作表的工作表代码窗口中。如果工作表4中有GetUrl
函数,您将在工作表代码窗口中输入如下:
正如我在评论中所说,这可以放入每个工作表激活时调用的函数中。
选项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列):
添加表单控件按钮:
它会自动弹出一个窗口,您可以在其中分配更新链接过程:
我的解决方案
问题是除了使用VLOOKUP之外,HYPERLINK还无法构建正确的超链接。
我通过在颜色指南上创建2列来解决这个问题。第一个存储颜色的名称。第二个存储了超链接。在第二张表格中,我想将名称和超链接拉入其中,我使用了以下公式:
=HYPERLINK(VLOOKUP(C3, 'Color Guide'!$A:$D, 4), VLOOKUP(C3, 'Color Guide'!$A:$D, 3))
第一个VLOOKUP拉出链接位置,第二个VLOOKUP拉出'友好名称'。这很好用,并在颜色指南上更改链接时自动更新链接!