Vba word удалить пробелы

2 / 2 / 0

Регистрация: 25.12.2009

Сообщений: 37

1

16.06.2010, 17:18. Показов 17999. Ответов 12


Студворк — интернет-сервис помощи студентам

Помогите решить задачу. Практически ничего не шарю в VBA.

В выделенном фрагменте русскоязычного документа текстового процессора Word убрать все лишние пробелы между словами (оставить только по одному пробелу).

Заранее спасибо!



0



5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

16.06.2010, 18:00

2

Добавлено через 4 минуты

Цитата
Сообщение от Dolgisha
Посмотреть сообщение

Помогите решить задачу. Практически ничего не шарю в VBA.

Пытаюсь.
А шарить-то и не надо — просто запишите макрос! (В этом собственно вся фишка VBA.)

Действия (после нажатия кнопки «Начать запись») таковы:

  1. Сочетание клавиш Ctrl-h (появилось окно поиска и замены)
  2. В поле «Найти:» символ пустое пространство: ^w (без пробелов!)
  3. В поле «Заменить на:» один пробел (его не видно, так что аккуратно)
  4. Ok (кнопка, выполняющая замену)
  5. Остановить запись
  6. Посмотреть процедуру в редакторе VBA-проекта вашего документа (по ALT-F11)

Не уверен, что в новом Word вы быстро найдёте вкладку «Разработчик» (на которой кнопка записи и находится), но в принципе программа — если это удалось — готова.

Выполнять её можно через альт-F8, а редактировать по альт-F11 (и заодно выполнять).



2



аналитика

здесь больше нет…

3372 / 1670 / 184

Регистрация: 03.02.2010

Сообщений: 1,219

16.06.2010, 18:11

3

Visual Basic
1
2
3
4
5
6
7
8
Sub Макрос1()
   Dim XL As Object
 
   Set XL = CreateObject("Excel.Application")
   Selection.TypeText Text:=XL.Trim(Selection)
   XL.Quit
   Set XL = Nothing
End Sub

как текст в Ворде закинуть в переменную — не знаю, Selection — кривенько, но работает, главное здесь — поздняя привязка к Excel.



3



Busine2009

Заблокирован

17.06.2010, 20:15

4

Dolgisha,

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub m_1()
Dim myRange As Range
Set myRange = Selection.Range
With myRange.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "[ ^s]{2;}"
    .Replacement.Text = " "
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
    .Execute Replace:=wdReplaceAll
    .Text = ""
    .Replacement.Text = ""
    .MatchWildcards = False
End With
Application.Browser.Target = wdBrowsePage
End Sub

Добавлено через 23 часа 55 минут
Dolgisha,
я ошибся, используй вот этот код для удаления лишних пробелов. Я как-то пробовал использовать код, указанный выше, но он удалял пробелы и в др. местах:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub m_1()
With Selection.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "[ ^s]{2;}"
    .Replacement.Text = " "
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
    .Execute Replace:=wdReplaceAll
    .Text = ""
    .Replacement.Text = ""
    .MatchWildcards = False
End With
Application.Browser.Target = wdBrowsePage
End Sub



1



2 / 2 / 0

Регистрация: 25.12.2009

Сообщений: 37

17.06.2010, 21:53

 [ТС]

5

Большое спасибо! Программа от Busine2009 подошла.



0



Busine2009

Заблокирован

18.06.2010, 06:35

6

Sasha_Smirnov,
хорошая идея, но она убирает также и знаки Табуляции (стрелочки) (может и ещё чего убирает, я только на Табуляции проверил).



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

18.06.2010, 08:45

7

Я пользовался просто

Visual Basic
1
2
    .Text = "  "
    .Replacement.Text = " "

Остальное всё так же из макроса



0



Busine2009

Заблокирован

18.06.2010, 09:21

8

Alex77755,
твой макрос надо запускать несколько раз, да и как ты узнаешь, что все лишние пробелы удалены? А если будут ещё встречаться и неразрывные пробелы?



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

18.06.2010, 11:12

9

Ну у меня он стоит в цикле (проверка на наличие сдвоенных пробелов)
Да я сейчас им и не пользуюсь. То пока дочка училась и скачивала документы непроавильно отформатированныё(пробелами) приходилось редактировать.
А что такое неразрывные пробелы я даже не знаю



1



Sasha_Smirnov

5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

18.06.2010, 18:15

10

Цитата
Сообщение от аналитика
Посмотреть сообщение

[VB]

Visual Basic
1
Selection.TypeText Text:=XL.Trim(Selection).

Хоть это и макрос, но Trim вроде бы лишь внешние пробелы убивает у Selection, а?

Цитата
Сообщение от аналитика
Посмотреть сообщение

как текст в Ворде закинуть в переменную — не знаю, Selection — кривенько, но работает, главное здесь — поздняя привязка к Excel.

Поотвязнее (в ворде) текст документа закидывается в пременную так (*барабанная дробь*):

Visual Basic
1
t = ActiveDocument.Content.Text



0



здесь больше нет…

3372 / 1670 / 184

Регистрация: 03.02.2010

Сообщений: 1,219

18.06.2010, 19:28

11

Хоть это и макрос, но Trim вроде бы лишь внешние пробелы убивает у Selection, а?

trim, который в VBA — да, но здесь же Excel прицепляется, для чего?
ибо это XL.Trim(.., правильнее (да, именно, правильнее) будет, конечно, XL.WorksheetFunction.Trim(..
а эта штука (СЖПРОБЕЛЫ) удаляет все лишние пробелы из всей строки.
см. рис (*барабанная дробь*):

Миниатюры

В выделенном фрагменте Word убрать все лишние пробелы.
 



1



Busine2009

Заблокирован

19.06.2010, 10:33

12

Alex77755,
в твоём случае проще было бы использовать интерфейс Word, когда сдвоенные пробелы заканчиваются, то пишет, что произведено ноль замен.
Что-то ты совсем загнул.
Неразрывный пробел используется, чтобы в одной строке была определённая информация, например, ООО «Название компании», если надо, чтобы они были всегда вместе между ООО и «Название компании ставят не обычный пробел, а неразрывный (Ctrl + Shift + Пробел).

Добавлено через 4 минуты
аналитика,
я чего-то не понимаю может быть, но при чём здесь в этой теме Excel?



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

19.06.2010, 12:02

13

Busine2009,
Может быть.
Это кусок из макроса.
Первое, что пришло тогда в голову.
Кроме удаления лишних пробелов в макросе было ещё несколько функций. И на панели была кнопочка. Поэтому мне было проще пользоваться моей кнопочкой чем несколькими функциями ворда по очереди
За информацию о неразрывном пробеле — спс. Век живи — век учись



0



Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Сообщений [ 4 ]

1 08.02.2014 08:33:36

  • iasmer
  • рядовой
  • Неактивен
  • Зарегистрирован: 09.12.2010
  • Сообщений: 7

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

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

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

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

2 Ответ от aap77 09.02.2014 21:57:08

  • aap77
  • генерал-полковник
  • Неактивен
  • Зарегистрирован: 12.09.2011
  • Сообщений: 925
  • Поблагодарили: 243

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

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

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

3 Ответ от iasmer 10.02.2014 09:38:53

  • iasmer
  • рядовой
  • Неактивен
  • Зарегистрирован: 09.12.2010
  • Сообщений: 7

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 Ответ от aap77 10.02.2014 10:41:50

  • aap77
  • генерал-полковник
  • Неактивен
  • Зарегистрирован: 12.09.2011
  • Сообщений: 925
  • Поблагодарили: 243
  • За сообщение: 1

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 = "124"
        .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 = "13"
        .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 = "13"
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

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

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

Сообщений [ 4 ]

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Похожие темы

  • Лишние пробелы при связи с Excel
  • Нашёл бесплатную программку-Убирает лишние пропуски,пробелы и переносы
  • Удалить лишние точки и номера страницы
  • Word как удалить текст в файле, закрыть и удалить макросом файл?
  • Лишние абзацы при связи с excel
  • Лишние элементы структуры в документе Word2007.
  • Лишние элементы в списке перекрестных ссылок
  • Пробелы

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

Любую работу можно сделать несколькими различными способами. В силах человека выбрать наиболее удобный для себя, оптимальный и рациональный. Наш сайт о Microsoft Office Word даст ответ про: как word убрать символ абзац.
Если говорить о работе с текстами: написании рефератов, дипломов, статей, редактировании различных документов и оформлении презентаций, то Microsoft Word дает массу возможностей для этого. Наш сайт о Microsoft Office Word даст ответ про: как в ворде убрать растянутость слов.

Познакомиться с ними,  расширить свои познания о программе или поделиться секретами и хитростями с другими пользователями вы можете на форуме Ворд Эксперт. На портале о Microsoft Office Word вы узнаете про: шаблоны для фирменного бланка.

Здесь собрана основная информация и ответы на наиболее популярные вопросы по работе с приложением. Например, о создании макросов, о колонтитулах, удалении лишних пробелов. Наш сайт о Microsoft Office Word даст ответ про: как сделать так. чтобы фигура в тексте не съезжала в ворде.

В основных разделах можно обсудить настройки самого Ворда и способы работы с текстом в различных версиях программы. На портале о Microsoft Office Word вы узнаете про: сохранить файл ворд в другом формате?.
Подфорум «Автоматизация» предлагает освоить технику создания макросов и задания шаблонов для различных операций и функций. На портале о Microsoft Office Word вы узнаете про: как убрать сноску ворд 2010.

Здесь же на форуме можно найти готовые решения, разнообразные шаблоны, макросы для редактирования таблиц, оглавлений и многое другое. На портале о Microsoft Office Word вы узнаете про: как сканировать документы в ворд 2007.
Возможно и оставить заявку, описав свою проблему в соответствующем подразделе. Если у вас есть какие –то оригинальные идеи и решения – форум лучшее место поделиться ими с другими пользователями Ворда. На портале о Microsoft Office Word вы узнаете про: ворд как переходить на новую строку.

MS Word: «УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ»

Alex_ST

Дата: Вторник, 20.12.2011, 15:38 |
Сообщение № 1

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Убирает многократные пробелы в выделенном тексте, а также пробелы перед знаками препинания.
[vba]

Код

Sub УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ()
      If Selection.Type <> wdSelectionNormal Then Exit Sub
      With Selection.Find
         .Execute «^w», , , 0, , , , , , » «, 2      ‘ заменить множественные пробелы на один
         .Execute «^p^w», , , 0, , , , , , «^p», 2    ‘ убрать пробелы в начале абзаца (после ^p)
         .Execute «^w^p», , , 0, , , , , , «^p», 2    ‘ убрать пробелы в конце абзаца (перед ^p)
      End With
      Dim i%, sPunkt$
      sPunkt = «.,;:!?)» & Chr(133)       ‘ список знаков пунктуации, перед которыми нужно убирать пробелы
      For i = 1 To Len(sPunkt)      ‘ убрать пробелы перед знаками пунктуации
         Selection.Find.Execute _
               » » & Mid(sPunkt, i, 1), , , 0, , , , , , Mid(sPunkt, i, 1) & » «, 2
      Next
End Sub

[/vba]
Не пойму, почему после закрывающей круглой скобки добавляет лишний пробел?



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STВторник, 20.12.2011, 15:44

 

Ответить

KuklP

Дата: Вторник, 20.12.2011, 17:00 |
Сообщение № 2

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

Леша, ты зря нарушил порядок, к-рый я задал. В этом все дело. После любого знака пунктуации в этом цикле ставится пробел.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

Сообщение отредактировал KuklPВторник, 20.12.2011, 17:07

 

Ответить

Alex_ST

Дата: Вторник, 20.12.2011, 17:20 |
Сообщение № 3

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Да, Серёга, и в самом деле…
Это я проглядел shy
Но я же переставлял не просто так: у меня и до перестановки что-то глюкало (правда, не помню, что…) вот я и переставил: показалось, что так будет лучше.
Да и ещё к стыду своему спешил выполнить обещание кинуть «затравку» в ветку и поэтому забыл указать твой копирайт…
Завтра поправлю в остальных постах. Извини.
Должно быть так:[vba]

Код

Sub УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ()
‘—————————————————————————————
‘ Procedure    : УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ
‘ Author       : KuklP
‘ Purpose      : убрать многократные пробелы и пробелы перед некоторыми знаками пунктуации
‘ Notes        :
‘—————————————————————————————
       If Selection.Type <> wdSelectionNormal Then Exit Sub
       Dim i%, sPunkt$
       sPunkt = «.,;:!?)» & Chr(133)       ‘ список знаков пунктуации, перед которыми нужно убирать пробелы
       With Selection.Find
       For i = 1 To Len(sPunkt)      ‘ убрать пробелы перед знаками пунктуации
          .Execute «^w» & Mid(sPunkt, i, 1), , , 0, , , , , 0, Mid(sPunkt, i, 1) & » «, 2
       Next
          .Execute «^w», , , 0, , , , , 0, » «, 2        ‘ заменить множественные пробелы на один
          .Execute «^p^w», , , 0, , , , , 0, «^p», 2     ‘ убрать пробелы в начале абзаца (после ^p)
          .Execute «^w^p», , , 0, , , , , 0, «^p», 2    ‘ убрать пробелы в конце абзаца (перед ^p)
       End With
End Sub

[/vba]



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STВторник, 20.12.2011, 20:41

 

Ответить

KuklP

Дата: Вторник, 20.12.2011, 19:38 |
Сообщение № 4

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

Насчет копирайта не парься, мне от него ни холодно ни жарко. Главное, чтоб от наших каракулей польза кому-нить была.
А вот 0 на формат ты зря убрал. Мало ли, что юзер искал до нас:
[vba]

Код

.Execute «^w», , , 0, , , , , 0, » «, 2

[/vba]
И думаю, ты зря называешь макросы кириллицей. В нелокализованных версиях могут быть проблемы.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

Сообщение отредактировал KuklPВторник, 20.12.2011, 19:46

 

Ответить

Alex_ST

Дата: Вторник, 20.12.2011, 20:49 |
Сообщение № 5

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

На счёт формата ты, конечно, прав… Я совсем забыл, что условия поиска-замены запоминаются и перед использованием макроса юзверг мог что-то искать с применением формата…
Ща поправлю во всех местах.

А по поводу кириллического названия макросов, так тут ведь я показываю принцип действия. Это же не «Готовые решения» (пока это там было бы оффтопом). И поэтому называю макросы как мне нравится. А кто сидит не на русской локали, вполне может и подправить «под себя».
К стати, в названиях своих UDF Excel я как раз специально использую русские названия чтобы было так же как в обычных формулах листа.



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

Alex_ST

Дата: Понедельник, 16.01.2012, 17:01 |
Сообщение № 6

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Ещё подполировал Серёгин макрос: убрал цикл.
[vba]

Код

Sub УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ()
‘—————————————————————————————
‘ Procedure    : УБРАТЬ_ЛИШНИЕ_ПРОБЕЛЫ
‘ Author       : KuklP & Alex_ST
‘ Purpose      : убрать в выделенном тексте многократные пробелы и пробелы перед некоторыми знаками пунктуации
‘ Notes        :
‘ URL          : http://www.excelworld.ru/forum/4-1127-13907-16-1326718916
‘—————————————————————————————
        If Selection.Type <> wdSelectionNormal Then Exit Sub
        With Selection.Find
           .ClearFormatting   ‘ очистить условия поиска по формату (они могли сохраниться от предыдущих ручных поисков/замен)
           .Execute «[ ^s^t]{1;}([.,:;…!?)])», , , -1, , , , 0, 0, «1», 2 ‘ убрать обычные и неразрывные пробелы и табуляции перед знаками препинания .,:;…!?)
           .Execute «^w», , , 0, , , , 0, 0, » «, 2          ‘ заменить множественные пробелы на один
           .Execute «^p^w», , , 0, , , , 0, 0, «^p», 2      ‘ убрать пробелы в начале абзаца (после ^p)
           .Execute «^w^p», , , 0, , , , 0, 0, «^p», 2     ‘ убрать пробелы в конце абзаца (перед ^p)
        End With
End Sub

[/vba]



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STВторник, 17.01.2012, 08:58

 

Ответить

nerv

Дата: Понедельник, 16.01.2012, 17:44 |
Сообщение № 7

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Alex_ST, приветствую! Особо не проверял, но попробуй так:

[vba]

Code

Sub io()
With CreateObject(«VBScript.RegExp»)
      .Global = True
      .MultiLine = True
      .Pattern = «^[t ]+|[t ](?=[t ]|[(.,:;…!?)])|[t ]$»
      Selection.Text = .Replace(Selection.Text, «»)
End With
End Sub

[/vba]


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

Сообщение отредактировал nervПонедельник, 16.01.2012, 17:45

 

Ответить

v__step

Дата: Понедельник, 16.01.2012, 18:45 |
Сообщение № 8

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 225


Репутация:

27

±

Замечаний:
0% ±


Саша, привет! У Алексея применен диалект Regexp, используемый непосредственно в механизме поиска и замены Word, т.к. нет другого способа не нарушить форматирование абзацев.


С уважением, Владимир

 

Ответить

Alex_ST

Дата: Понедельник, 16.01.2012, 20:22 |
Сообщение № 9

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Саша, Володя, привет!
Володя абсолютно прав:

Quote (v__step)

…применен диалект Regexp, используемый … в механизме поиска и замены Word, т.к. нет другого способа не нарушить форматирование абзацев

Я про этот диалект написАл в топике MS Word: Символы и знаки при поиске и замене



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

nerv

Дата: Понедельник, 16.01.2012, 22:52 |
Сообщение № 10

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Всем привет!) Кто ж мог подумать, что Word такой глупый))) biggrin


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

Alex_ST

Дата: Вторник, 17.01.2012, 08:50 |
Сообщение № 11

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Quote (nerv)

Кто ж мог подумать, что Word такой глупый

Это ещё мягко сказано: «Глупый»!
Более тупого приложения Мелко-мягких из числа поддерживающих VBA-прграммирование я ещё не встречал! cranky Ни свойств, ни методов, ни событий, …
Я ТУТ попробовал помочь сделать на листе не выводимую на печать кнопку для вызова макроса. Думал, наивный, что по аналогии с Ёкселем всё будет просто sad
Нет ни у кнопок, ни у фигур свойства «Выводить на печать»! Я у них даже .Visible не смог найти. И макрос к клику по фигурам не назначается… Додумался до того, чтобы разместить кнопку на форме, а перед печатью форму скрывать (UserForm.Show/Hide там всё-таки есть), но оказалось что невозможно отловить событие-аналог BeforePrint Ёкселя
А когда недавно попытался реализовать автосохранение документа по таймеру, то выяснил, что метод SaveCopyAs хоть и существует, но не у ThisDocument, а только у HTMLProjectItem object … Ну, просто бред какой-то! killed



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

nerv

Дата: Вторник, 17.01.2012, 21:57 |
Сообщение № 12

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Alex_ST, не то слово) Но все равно, та рега, кот. я написал как минимум пригодится мне в Excel. Только вместо [t ] буду использовать s smile
Насчет ворда. Эксперимент показал, что если не трогать при замене переводы строк, то формат не рушиться. Вот только как его обойти с минимальными потерями cool


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

Alex_ST

Дата: Вторник, 17.01.2012, 22:14 |
Сообщение № 13

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Quote (nerv)

.Pattern = «^[t ]+|[t ](?=[t ]|[(.,:;…!?)])|[t ]$»

Это выше моего понимания, к сожалению…
Даже если

Quote (nerv)

вместо [t ] … использовать s

всё равно яснее не становится… Надо читать Бена Форту, а некогда: утром в метро ещё не проснулся, вечером засыпается, на работе и дома не получается никак smile



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STСреда, 18.01.2012, 14:40

 

Ответить

nerv

Дата: Среда, 18.01.2012, 10:40 |
Сообщение № 14

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Alex_ST, v__step, приветствую!

Quote (Alex_ST)

Это выше моего понимания

Да там и понимать то особо не чего:
[vba]

Code

.Pattern = «^[t ]+|[t ](?=[t ]|[(.,:;…!?)])|[t ]$»

[/vba]
Весь паттерн можно разбить на три части (кот. «связаны» или):
1. ^[t ]+ — все знаки пробела или табуляции в начале строки
2. [t ](?=[t ]|[(.,:;…!?)]) — знако пробела или табуляции за котором следует еще один знак пробела или табуляции или одни из символов, перечисленных в символьном классе. Тут можно быть записать проще. Например, так [t ](?=[(t .,:;…!?)]) (не проверял, но по идее должно работать)
3. [t ]$ — знак пробела или табуляции в конце «строки». Опять-таки, как сейчас мне кажется, можно было записать так [t ]+$.

Т.е. все регулярное выражение выглядело бы примерно так
var z = /^s+|s+$|s(?=[s(.,:;…!?)])/gm;
и удаляло бы любые пробельные символы, включая пробел, табуляцию, переводы строк и другие юникодные пробельные символы.

Если где не прав, Володя придет поправит smile


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

Сообщение отредактировал nervСреда, 18.01.2012, 10:55

 

Ответить

v__step

Дата: Среда, 18.01.2012, 17:34 |
Сообщение № 15

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 225


Репутация:

27

±

Замечаний:
0% ±


Quote (nerv)

Володя придет поправит

Ой, ребятушки, вы уж извините, совсем меня Чернобыль одолел. Потом, все потом — уже немножко осталось. Вчера дома долбанулся ногой — обо что не важно, но испугался, что не доплетусь до работы — считать некому… В общем, выживаем как можем. Но я все-таки надеюсь, что выползу. Первым делом буду добивать чистилку — это мой должок


С уважением, Владимир

 

Ответить

v__step

Дата: Четверг, 19.01.2012, 10:50 |
Сообщение № 16

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 225


Репутация:

27

±

Замечаний:
0% ±


Привет, мужики! С Крещением!

Цитата (nerv)

формат не рушиться

Рушится. Попробуем так: напишем одно слово и выделим через одну буквы жирным шрифтом. Потом запустим такую процедуру:
[vba]

Код

Sub ПрощайФормат()
        Dim s As String
        s = Selection.Text
        Selection.Text = Left(s, Len(s) — 1)
End Sub

[/vba]Иначе и быть не может (иначе бедный Word должен выполнить очень сложный анализ — как что было отформатировано «до» и что с этим делать «после»). Лёша&Сережа спасли ситуацию выходом на Word-RegExp. Это был сильный ход. Кстати, не исключено, что и в этом случае форматирование когда-то может слететь (трудно протестировать все возможные ситуации)


С уважением, Владимир

Сообщение отредактировал v__stepЧетверг, 19.01.2012, 10:59

 

Ответить

nerv

Дата: Четверг, 19.01.2012, 19:50 |
Сообщение № 17

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Пожалуй, Володя прав) Насчет Excel, для себя я остановился на таком решении с ненужными пробельными символами
[vba]

Code

Sub io()
Dim x As String
x = ActiveCell.Value
With CreateObject(«VBScript.RegExp»)
     .Global = True
     .MultiLine = True
     .Pattern = «n+|t+»
     x = .Replace(x, » «)
     .Pattern = «^s+|s+$|s+(?=[s.,:;…!?)])»
     ActiveCell.Value = .Replace(x, «»)
End With
End Sub

[/vba]

К сообщению приложен файл:

1231231.xls
(22.5 Kb)


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

Alex_ST

Дата: Пятница, 20.01.2012, 13:45 |
Сообщение № 18

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Саш, а формулы на листе твоя Рега не покоцает? Ведь в них-то, наверное, править пунктуацию не стоит.



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

nerv

Дата: Пятница, 20.01.2012, 13:53 |
Сообщение № 19

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Привет, Леш) Код выше только для примера использования самой реги. Если надо обойти (исключить) формулы, то можно записать как-то так
[vba]

Code

Sub io()
MsgBox ActiveCell.HasFormula ‘ true = formula
MsgBox UsedRange.SpecialCells(2).Address
End Sub

[/vba]


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

Alex_ST

Дата: Пятница, 20.01.2012, 14:55 |
Сообщение № 20

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Ну да, а ещё сделать так чтобы не одну ячейку обрабатывала, а выделенный диапазон.
Надо ей аргументы как ParamAppay передавать и цикл по ним организовать…
Саня, а не оффтопим ли мы? Ведь топик-то про Word!



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

I created a macro for removing all whitespace in a string, specifically an email address. However it only removes about 95% of the whitespace, and leaves a few.

My code:

Sub NoSpaces()
    Dim w As Range

    For Each w In Selection.Cells
        w = Replace(w, " ", "")
    Next
End Sub

Things I have tried to solve the issue include:

~ Confirmed the spaces are indeed spaces with the Code function, it is character 32 (space)
~ Used a substitute macro in conjuction with the replace macro
~ Have additional macro utilizing Trim function to remove leading and trailing whitespace
~ Made a separate macro to test for non-breaking spaces (character 160)
~ Used the Find and Replace feature to search and replace spaces with nothing. Confirmed working.

I only have one cell selected when I run the macro. It selects and goes through all the cells because of the Selection.Cells part of the code.

A few examples:

1 STAR MOVING @ ATT.NET
322 TRUCKING@GMAIL.COM
ALEZZZZ@AOL. COM. 

These just contain regular whitespace, but are skipped over.

Автор Game, 22 марта 2020, 07:16

В Word файле есть текст и таблицы. Нужно убрать из документа все лишние пробелы, в т.ч. и в таблицах.

Пример

Было:
Иванов   Иван                    Иванович, 2000 г.р. Живет на  планете                    Земля

Стало: Иванов Иван Иванович, 2000 г.р. Живет на  планете Земля



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан
Макрос

Sub Макрос()

    With ActiveDocument.Range.Find
        .Text = » {2;}»
        .Replacement.Text = » «
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll
    End With

End Sub

[свернуть]



.Text = » {2;}»  — это регулярное выражение? VBA Word нормально понимает их? Как его понять? Нужно найти текст, в котором есть больше двух пробелов?
В Excel есть функция Trim, которая удаляет лишние пробелы. В Word такой функции нет?



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Да, в ворде можно использовать регулярные выражения.

{2;}
Перед левой фигурной скобкой находится пробел. Это означает, что нужно искать пробел.
Это {2;} означает: найти два и более символа, который находятся перед этим выражением. В данном случае: найти два и более пробела.

В ворде нет готового инструмента для удаления лишних пробелов: нужно изобретать. Например, можно использовать метод «Range.Find».


  • Форум по VBA, Excel и Word

  • Word

  • Макросы в Word

  • Word VBA Макросы: Как удалить лишние пробелы?

Like this post? Please share to your friends:
  • Vba word удалить выделенное
  • Vba word удалить весь текст
  • Vba word удаление страницы
  • Vba word убрать выделение
  • Vba word текущий документ