Итерация слов в диапазоне с For Each не работает, если к словам внутри цикла добавлены гиперссылки - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь автоматически добавлять гиперссылки на ссылочные слова в выделении. Гиперссылки на заголовки в том же документе.

У меня уже есть рабочий макрос, который работает с одним словом. Работает следующим образом:

  1. Проверяется, существует ли заголовок с заголовком, равным к выбранному справочному слову. Это делает это с помощью a Range.Find в полном документе.
  2. Если найден точно совпадающий заголовок, его название диапазон определяется и используется для вставки скрытой закладки.
  3. Эта закладка затем используется для выбранного ссылочного слова добавить гиперссылку на этот заголовок.

Давайте назовем этот макрос InsertHyperlinkToRefHeader().

Теперь я пытаюсь использовать этот макрос в большем диапазоне. состоящий из нескольких слов. Идея состоит в том, чтобы добавить гиперссылка на все ссылочные слова, найденные в этот выбор:

Sub AddLinksToRefHeadings()
Dim w As Range
Dim currentWords As Words

Set currentWords = Selection.Range.Duplicate.Words

For Each w In currentWords
    If isRefWord(w) Then
        Debug.Print w
        InsertHyperlinkToRefHeader w
    End If
Next

Вышеуказанное работает только для первого ссылочного слова. После этого, то же значение для w продолжает печататься, по-видимому, в бесконечный цикл. Так что InsertHyperlinkToRefHeader испортил Оригинальный диапазон выбора, кажется, хотя я использовал Duplicate.

Конечно, при комментировании InsertHyperlinkToRefHeader w строка, все ссылочные слова в выделении напечатаны правильно.

Как правильно перебрать слова в выделении, чтобы применить макрос к?

спасибо ~

1 Ответ

0 голосов
/ 03 июля 2019

Выше не работает из-за выбора команды цикла;Использование For вместо For Each, как ни странно, решает проблему.

Таким образом:

For i = 1 To currentWords.count
    Set w = currentWords(i)    
    Debug.Print w.Start & " " & w.End

    If isRefWord(w) Then
        InsertHyperlinkToRefHeader w
    End If
Next i

работает, а:

For Each w In currentWords    
    Debug.Print w.Start & " " & w.End

    If isRefWord(w) Then
        InsertHyperlinkToRefHeader w
    End If
Next w

- нет.

Исходные диапазоны слов (начало и конец) в тесте были следующими:

Исходные диапазоны слов (w.Start w.End):

1428795 1428818
1428818 1428820
1428820 1428840
1428840 1428842
1428842 1428864
1428864 1428866
1428866 1428889
1428889 1428891
1428891 1428917

Цикл Forвключая добавление гиперссылки: (добавление гиперссылки изменяет диапазоны)

1428795 1428818
1428843 1428845
1428845 1428865
1428890 1428892
1428892 1428914
1428939 1428941
1428941 1428964
1428989 1428991
1428991 1429017

Однако, если используется цикл For Each, то напечатанные диапазоны:

1428795 1428818
1428795 1428843
1428795 1428843
1428795 1428843
…

и попадают вбесконечный цикл.Диапазон для второй итерации явно отличается от диапазона, заданного циклом For, и затем остается тем же.

Поэтому поведение двух типов циклов отличается по непрозрачной причине.Любые разъяснения по этому поводу приветствуются.

...