Я изменил ваш код, чтобы показать вам, что я имею в виду.Я добавил переменную 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