1

Тема: VBA: как удалить лишние пробелы

Возможно, кто-то укажет аналог WorksheetFunction.Trim Экселя в VBA Ворда (т.е. удаление всех лишних пробелов слева - права - множественных внутри текста)?

пока пользую следующую конструкцию:

        SAY = Replace(Trim(SAY), "   ", " ", 1, -1, 1)      ' в экселе 2 строки заменить на
        SAY = Replace(SAY, "  ", " ", 1, -1, 1)             ' SAY = Worksheetfunction.Trim(SAY)

2

Re: VBA: как удалить лишние пробелы

В Word тоже самое:

s = "  Word  "
s = Trim(s) ' Результат "Word"

3

Re: VBA: как удалить лишние пробелы

Спасибо за Ваш ответ. Я вероятно плохо раскрыл вопрос. Повторюсь. В экселе есть 2 варианта Трима 1 - Trim() в VBA; 2 - Worksheetfunction.Trim(). Различаются тем, что 1-й отсекает пробелы слва-права (как в Вашем примере), 2-й (функция листа экселя, в рус. нотации =СЖПРОБЕЛЫ()) - обрабатывает повторы пробелов внутри текста, оставляя одинарные.
Вопрос был о наличии/отсутствии в VBA Ворда 2-го варианта функции.
Можно и цикл написать, но исходно не верилось, что в Экселе 1 оператор, а в Ворде - 6

Excel:

s = Worksheetfunction.Trim(s)

Word:

s = trmi(s)
1:
if instr(1,s,"  ",1) then
   s = Replace(s, "  ", " ", 1, -1, 1)
   goto 1
endif

4

Re: VBA: как удалить лишние пробелы

Изначально Word использует только функции встоенные в VBA. У него нет личных функций, как у Excel. Функция СЖПРОБЕЛЫ() на самом деле это не один оператор, а процедура содержащая также кучу операторов. Что могу посоветовать.
1. Откройте редактор VBA в Word.
2. Выберете шаблон Normal.
3. Вставьте в него модуль и назовите его WordFunctions.
4. Вставьте в него макрос:

Sub Trim()
'
' Удаление пробелов
'
    Selection.WholeStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = _
            "([!^0032^0160])([^0032^0160])([^0032^0160]{1;})([!^0032^0160])"
        .Replacement.Text = "\1\2\4"
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "([!^0032^0160])([^0032^0160]{1;})([^0013])"
        .Replacement.Text = "\1\3"
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "([^0013])([^0032^0160]{1;})([!^0032^0160])"
        .Replacement.Text = "\1\3"
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

5. Сохранитесь.
Теперь можете в своих кодах писать:

WordFunctions.Trim

Далее в модуль WordFunctions можно будет добавлять другие функции и процедуры, а потом обращаться к ним.
Excel построен по томуже принципу, только разработчики заранее внедрили в него объект Worksheetfunction, с кучей  дополнительных функций.