【问题标题】:Why does Worksheet.Hyperlink.Range sometimes return a series of ranges as opposed to just one when iterating through the Worksheet?为什么 Worksheet.Hyperlink.Range 在迭代工作表时有时会返回一系列范围,而不是仅返回一个范围?
【发布时间】:2019-06-19 17:44:05
【问题描述】:

我有一个宏,它遍历工作簿中所有工作表上的所有超链接,如果超链接的范围等于先前指定的范围,则将超链接复制到新工作簿中目标工作表上的相同范围,然后然后移动到下一个工作表。这在大约 5 个工作表的过程中完美运行,然后突然抛出不匹配错误,整个过程失败。

在调试时,我已经确定每次在同一个工作表上的同一个超链接上,Worksheet.Hyperlink.Range(我的代码中的hyperlink.range)都会返回一系列范围,而不仅仅是一个(据我所知) ,并且由于循环将其与单个范围进行比较,因此这是发生不匹配的地方。问题是我无法确定为什么会这样。与其他会导致它表示为一系列范围的超链接相比,我找不到此超链接的属性有任何差异。

    Public Sub CopyLink(fromRange As range, toRange As range)

        Dim hyperlink As Hyperlink
        Dim fromSheet As Worksheet
        Set fromSheet = fromRange.Worksheet

        For Each hyperlink In fromSheet.Hyperlinks
            If hyperlink.range = fromRange Then 'mismatch happens here after several successful iterations
                hyperlink.range.Copy
                toRange.PasteSpecial
                Exit For
            End If
        Next

    End Sub

我想知道怎么做

A.以避免此问题的方式更改两个范围的比较

B.了解问题的原因,以便我有希望纠正它。

【问题讨论】:

  • 能否比较 range.address 以避免错误?
  • 这是个好主意。我现在会对此进行调查并报告。
  • 更新:range.address 返回多个单元格,与返回多个范围的范围一致。如果不是这种情况,这绝对可行,我很欣赏这个想法。但是,我仍然不确定为什么这个特定的 hyperlink.range 会返回一系列单元格,而不仅仅是一个被迭代的单元格。
  • 您能解释一下“如果超链接的范围等于先前指定的范围”是什么意思吗?您的意思是它们指的是相同的地址/位置吗?或者它们包含相同的潜在价值?
  • $D$D:$D$36 不是有效地址?

标签: excel vba


【解决方案1】:

如果您选择多个单元格然后添加一个超链接,您只会显示一个链接,但所有选定的单元格都会响应,就好像它们是超链接一样。

这里的hyperlink.Range.Address 属性是$B$2:$B$15

【讨论】:

    【解决方案2】:

    fromRange 始终是单个单元格范围,hyperlink.Range 可能引用多个单元格。这里的不匹配与您的比较:

    if hyperlink.range = fromRange
    

    Range 代表单个单元格时,它会默认评估其Value 属性(实际实现稍微复杂一些),这将返回基础数据(字符串、数字、日期等.)。当Range 表示多个单元格时,其Value 是各个单元格值的数组

    因此,您可以预期结果不匹配,因为左侧有一个数组,右侧有其他内容。 = 比较运算符无法处理任一侧的数组。试试看:

    If Range("A1:B1") = Range("C1:D1") Then 
    

    即使= 的两边都是大小相同的数组,上面也会引发不匹配错误!

    您可能要考虑比较 Address 属性?

    hyperlink.range.Address = fromRange.Address
    

    或者

    ' tests the top/left cell
    hyperlink.range(1,1).Address = fromRange.Address
    

    【讨论】:

    • 感谢您的意见。我知道这是导致错误的原因,问题是我无法理解为什么超链接在此特定实例中引用多个单元格,因为它与之前迭代的几个超链接相同。超链接的这种特殊使用不会改变所引用的范围,这就是我想要确定的。我也尝试比较 hyperlink.range.address,但正如我在上面的 cmets 中解释的那样,这是作为一系列单元格给出的。
    • 抱歉,我刚刚注意到您建议的第二个选项。我会试一试并报告。
    • “为什么一个超链接引用多个单元格?”问题的答案是:“因为这就是它的创建方式”。你说你试图比较地址,但你没有说当你这样做时会发生什么。当然,它们不会是等价的。那么在这种情况下你想做什么呢?
    猜你喜欢
    • 2016-01-31
    • 2012-03-11
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多