【问题标题】:How to check if hyperlink target's name contains a specific string?如何检查超链接目标的名称是否包含特定字符串?
【发布时间】:2021-03-09 19:08:05
【问题描述】:

我在工作簿中有单元格链接到(单独)命名的单元格。单元格名称都以“Filter”开头,后面是一些字符串(例如FilterSubcategory1“)。

如果用户单击其中一个链接,它会将它们带到链接的单元格,然后根据目标所在的位置过滤另一个工作表(目前使用.Address,一切正常)。由于它们的名称中都有相同的起始字符串,如果目标名称以“Filter”开头,是否可以进行过滤?这将使我的代码更短,而不是列出所有相关的命名范围。

它看起来像这样(出于说明目的,不是我的完整或优化代码):

If Target.Range.Name = "Filter" & "*" Then
'rest of code, do the filtering
End If

或:

If InStr(Target.Range.Name, "Filter") > 0 Then
'rest of code, do the filtering
End If

【问题讨论】:

  • 您可以遍历所有Names,检查它们是否以Filter 开头,然后检查它们的RefersToRange Intersects 是否以Target 开头。我不认为Range.Name 很可靠。
  • 你能更好地解释一下“超链接目标的名称”是什么意思吗?它是一个真正的范围名称吗?是用来设置超链接地址/子地址的吗?
  • 目标是一个命名范围,超链接子地址指向目标的名称,而不是单元格引用(A1 等)。我想这就是你的意思。
  • 然后,您可以构建一个检查它的函数。它应该看起来像,但我会更好地发布一个答案,也看看如何检查......

标签: excel vba named-ranges


【解决方案1】:

请尝试下一个功能:

Function IsFilter(cel As Range) As Boolean
    If cel.Hyperlinks.Count = 0 Then Exit Function
    If InStr(cel.Hyperlinks.SubAddress, "Filter") > 0 Then IsFilter = True
End Function

上面的函数可以按以下方式使用:

Sub testIsFilter()
    Dim testCell As Range
    
    Set testCell = ActiveCell 'it may be any cell (resulted from a iteration or not)
    If IsFilter(testCell) Then
        'rest of code, do the filtering
    End If
End Sub

请进行测试并发送一些反馈。

【讨论】:

  • 谢谢。我尝试使用它,但有些超链接链接到它们自己,有些是合并的单元格,所以我认为这对代码造成了严重破坏,我无法使其适应工作。最后,我以不同的方式解决了这个问题,我已经发布了我的解决方案作为答案。
  • 抱歉,我正在编写解决方案,正如您在此处回复的那样。我没有提到合并单元格/自引用的事情,因为当时我认为这与其他单元格/非合并单元格相关,但我现在发现它可能是有用的信息。我再次道歉,如果您觉得这不是我所要求的,请随时对我的解决方案投反对票。我只发布它以防将来有人遇到此问题并且与我有类似的设置。
【解决方案2】:

因此,在尝试了其他用户的解决方案后(对解决方案非常有帮助),我设法以不同的方式解决了它。一些链接到自身的超链接(事实上,所有过滤器都链接),一些链接到合并的单元格,所以这是我用于链接到自身的任何单元格的方法:

FltrStr = "='" & ActiveSheet.Name & "'!" & ActiveCell.Address     'builds up the cell address from scratch, allowing for a merged cell being selected
Set FltrRng = Range(FltrStr)     'converts the string into the actual range needed, important for the next line
FltrName = FltrRng.Name.Name     'gets the name of the range, reporting the given name if it exists, lookup .name.name if you are unsure why two .names are needed

然后我可以使用它来检查目标范围的名称是否以我想要的任何开头,这里是“过滤器”:

If InStr(FltrName, "Filter") > 0 Then
    'rest of code, do the filtering
End If

可能不是最漂亮/最有效的方法,但它确实有效。可能值得在 sub 的开头明确定义变量的类型(FltrStr、FltrRng、FltrName)以避免任何类型不匹配错误,但我目前还没有定义它们并且它们工作正常。 (不好的做法,我知道!)

【讨论】:

  • 这是一个幼稚/糟糕的问题,带有一个幼稚的伪答案...如果它指向自己,这仅意味着讨论中的单元格是您搜索的命名范围。超链接根本不重要。仅当您尝试使用 Worksheet_FollowHyperlink 事件时才有意义……我懒得投反对票。
  • 再次抱歉,我的问题和答案不符合标准。我将尝试在以后的问题中包含更多相关信息。过滤发生在Worksheet_FollowHyperlink 事件中,这就是为什么我认为超链接一开始很重要,但是当我使用代码时,我设法在不使用Target.RangeSubAddress 属性的情况下解决了它。这不是我计划解决它的方式,因此我的答案改变了方向。对于我造成的问题,我深表歉意。
猜你喜欢
  • 2014-12-23
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2016-09-16
相关资源
最近更新 更多