Как я могу передать / скопировать тот же выбор?Так что я могу запустить несколько макросов на одном и том же выделении одним щелчком мыши. - PullRequest
0 голосов
/ 19 декабря 2018

Мне нужно запустить три макроса одним щелчком мыши, когда я вызываю первый макрос, выбранное слово переворачивается, но выделение теряется, и я думаю, что выделение отменяется из-за изменения слова (в обратном порядке), ноМне нужно, чтобы выбор запускал другие макросы для того же выбора.

Dim oWord As Range

If Selection.Information(wdWithInTable) = True Then
    For Each cl In Selection.Cells
        Set rng = cl.Range
        rng.MoveEnd Word.WdUnits.wdCharacter, Count:=-1
        For i = 1 To rng.Words.Count
            Set iRng = rng.Words(i)
            'rng.Select

            Set oWord = iRng
            Do While oWord.Characters.Last.Text = " "
                Call oWord.MoveEnd(WdUnits.wdCharacter, -1)
            Loop
            Debug.Print "'" & oWord.Text & "'"
            oWord.Text = StrReverse(oWord.Text)

            Debug.Print Selection.Text

        Next i
    Next cl
End If

End Sub
Sub Align()

'Selection.RtlPara
 Selection.LtrPara

 End Sub

 Private Sub CommandButton2_Click()

 Call Align
 Call CommandButton1_Click
 Call Comma_Remove
 Call CommandButton1_Click

 End Sub

 Sub Comma_Remove()


Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
    .Text = ","
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchKashida = False
    .MatchDiacritics = False
    .MatchAlefHamza = False
    .MatchControl = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

На этом рисунке показаны проблемы, которые я получил после внесения изменений в код

enter image description here

1 Ответ

0 голосов
/ 20 декабря 2018

Я изменил ваш код, чтобы показать вам, что я имею в виду.Я добавил переменную SelectedRange.Выбранный диапазон использует дубликат, чтобы сделать копию диапазона выбора.SelectedRange устанавливается как глобальная переменная для целей вашего кода.localRange используется в ваших макросах, где мы делаем копию SelectedRange.

Редактировать 2018-12-20: Незначительные обновления кода, чтобы добавить явную опцию, добавить отсутствующие объявления, сделать SelectedRange глобальным и заменить загадочную LtlPara кодом для выравнивания по левому краю абзацев

Редактировать 2018-12-21: исправлен код для восстановления выбора и объяснение, почему это необходимо.

ОП выбирает диапазон ячеек в таблице, а затем выполняет итерацию по ячейкам, чтобы выполнить пару преобразований вСтрока в каждой ячейке.Обычно мы не будем использовать выбор для всех этих операций, вместо этого мы установим диапазон слов и работаем с диапазоном слов.В этом конкретном случае это сталкивается с проблемой, поскольку существует разница между выбором и диапазоном слов применительно к таблице.Разница в том, что Selection.Cells.Count дает количество ячеек в выделении, а selection.Range.Cells.count дает количество ячеек в таблице, начиная с первой ячейки в Selection.range, считая каждую ячейку в таблицеслева направо, строка за строкой, пока не будет достигнута последняя ячейка в выделении.Вот почему ячейки, не находящиеся в выделении, обрабатываются при использовании диапазона слов, а не выделения.

Мы можем преодолеть эту странность, сохранив диапазон выделения в диапазоне слов, а затем восстановив выделение с помощью SelectedRange.Selectдля каждого саба, который должен работать на Выборе.

Option Explicit
Public SelectedRange  As Word.Range

Private Sub CommandButton1_Click()

Dim cl As Word.Cell
Dim Rng As Word.Range
Dim i As Long
Dim iRng As Word.Range
Dim oWord As Word.Range

    SelectedRange.Select
    If Selection.Information(wdWithInTable) = True Then


        For Each cl In Selection.Cells
            Set Rng = cl.Range
            Rng.MoveEnd Word.WdUnits.wdCharacter, Count:=-1
            For i = 1 To Rng.Words.Count
                Set iRng = Rng.Words(i)
                'rng.Select

                Set oWord = iRng
                Do While oWord.Characters.Last.Text = " "
                    Call oWord.MoveEnd(WdUnits.wdCharacter, -1)
                Loop
                Debug.Print "'" & oWord.Text & "'"
                oWord.Text = StrReverse(oWord.Text)

                Debug.Print Selection.Text

            Next i
        Next cl
    End If

End Sub
Sub Align()
Dim localrange As Word.Range

    'Set localrange = SelectedRange.Duplicate
    SelectedRange.Select
    'Selection.RtlPara
    Selection.Paragraphs.Alignment = wdAlignParagraphLeft

End Sub

Private Sub CommandButton2_Click()
    Set SelectedRange = Selection.Range.Duplicate 'make a copy of the selection range
    Align
    CommandButton1_Click
    Comma_Remove
    CommandButton1_Click

End Sub

Sub Comma_Remove()

    SelectedRange.Select

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = ","
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindStop
        .format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchKashida = False
        .MatchDiacritics = False
        .MatchAlefHamza = False
        .MatchControl = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...