Почему этот код VBA не сохраняет и правильно восстанавливает выбор - PullRequest
0 голосов
/ 12 апреля 2020

Я пытался использовать Visual Basi c, чтобы взять каждую строку текста в документе Word и отформатировать ее определенным образом в зависимости от содержания текста.

Я пытаюсь добиться этого следующим образом:
1. сохранить текущий выбор текста
2. найти количество строк в выделении
3. выполнить итерацию по этим строкам выбирая по одной строке за раз
4. изменяя строку
5. в конце восстановите исходное выделение

Я сократил свой код до минимального примера проблемы.

Sub ReplaceText()
    ' Save the original selection
    Dim original As range
    Set original = Selection.range

    ' Get the number of lines in the selection
    Dim lines As Long
    With Dialogs(wdDialogToolsWordCount)
        .Execute
        lines = .lines
    End With

    ' Iterate through each line
    For Index = 1 To lines
        ' Go to beginning of line
        Selection.HomeKey Unit:=wdLine
        ' Select the entire line
        Selection.Expand wdLine
        ' Save the text of the line
        Dim line
        line = Selection.Text

        ' Line with the problem
        ' Just setting the selection text back to itself
        Selection.Text = line

        ' Advance cursor to next Line
        Selection.MoveDown Unit:=wdLine
    Next Index

    ' Restore the original selection
    original.Select
End Sub

Проблема в том, что когда исходное выделение восстанавливается в конце, оно не восстанавливается должным образом. Восстановленный выбор выбирает все из исходного выбора, кроме последней строки. Я не совсем уверен, почему это происходит.

Редактировать: После оригинала. Выберите, я добавил строку:

Selection.MoveDown Extend:=wdExtend

И это, похоже, работает, но это не объясняет, почему что происходит, и как я могу предотвратить изменение выбора.

1 Ответ

0 голосов
/ 26 апреля 2020

Для такого вопроса также помогло бы предоставить пример содержимого и снимки экрана ситуации до / после - с отображением непечатных символов на . Selection очень сложно работать, так как всегда зависит от текущей ситуации; почти невозможно решить проблему без исходной среды ...

Тем не менее, вам лучше всего добавить закладку "вокруг" выбора, который в конце может быть выбран. Закладка не будет зависеть от любых изменений, которые могут быть внесены в содержимое, если оно не удалено. Пример:

Sub ReplaceText()
    ' Save the original selection
    'Dim original As range
    'Set original = Selection.range
    Dim bkm as Bookmark
    Set bkm = Selection.Bookmarks.Add("temp", Selection.Range)

    ' Get the number of lines in the selection
    Dim lines As Long
    With Dialogs(wdDialogToolsWordCount)
        .Execute
        lines = .lines
    End With

    ' Iterate through each line
''''For...Next removed for the sake of clarity

    ' Restore the original selection
    'original.Select
    bkm.Range.Select
    'Optional: bkm.Delete
End Sub
...