Почему Worksheet.Hyperlink.Range иногда возвращает серию диапазонов, а не только один при переборе рабочего листа? - PullRequest
2 голосов
/ 19 июня 2019

У меня есть макрос, который перебирает все гиперссылки на всех рабочих листах в рабочей книге, и, если диапазон гиперссылки равен ранее указанному диапазону, копирует гиперссылку в тот же диапазон на листе назначения в новой рабочей книге и затем переходит на следующий лист. Это работает безупречно в течение примерно 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. понять причину проблемы, чтобы я мог ее исправить.

Ответы [ 2 ]

4 голосов
/ 19 июня 2019

Если вы выберете несколько ячеек, а затем добавите гиперссылку, отобразится только одна ссылка, но все выбранные ячейки ответят, как если бы они были гиперссылками.

Свойство hyperlink.Range.Address здесь $B$2:$B$15

enter image description here

3 голосов
/ 19 июня 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...