1

Тема: Автоматизація Microsoft Word з VBA

Якось мені одна знайома розказувала що вона робить на роботі, і я вжахнувся, половину її роботи повинні робити роботи. Наприклад треба знайти в документі всі слова Nestle, і замінити на Nestlé, при цьому жирним і курсивом. Nestlé також зробити жирним і курсивом. Слово Maggi і деякі інші - просто курсивом.

Я щось нагуглив і вийшло так:

Option Explicit

Sub FormatNestle()
   Selection.Find.ClearFormatting
   Selection.Find.Replacement.ClearFormatting
   With Selection.Find
        .Text = "Nestle"
        .Replacement.Text = "Nestl" + ChrW(&HE9)
        .Replacement.Font.Bold = True
        .Replacement.Font.Italic = True
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWholeWord = True
   End With
   Selection.Find.Execute Replace:=wdReplaceAll
   
   Selection.Find.ClearFormatting
   Selection.Find.Replacement.ClearFormatting
   With Selection.Find
        .Text = "Nestl" + ChrW(&HE9)
        .Replacement.Text = "Nestl" + ChrW(&HE9)
        .Replacement.Font.Bold = True
        .Replacement.Font.Italic = True
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWholeWord = True
   End With
   Selection.Find.Execute Replace:=wdReplaceAll
   
   Selection.Find.ClearFormatting
   Selection.Find.Replacement.ClearFormatting
   With Selection.Find
        .Text = "Maggi"
        .Replacement.Text = "Maggi"
        .Replacement.Font.Italic = True
        .Forward = True
        .Wrap = wdFindContinue
        .MatchWholeWord = True
   End With
   Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Воно більш-менші працює, але то страх і жах. Можна якось застосувати відокремленя методу хоча б? (для себе TODO: RTFM.)

Я подумав про регулярні вирази, знайшов таке:


Sub FormatNestleB()


  Dim regEx As regExp
  'Dim Match
  'Dim Matches
  Dim sel As Range
  Dim rngRange As Range

  Set regEx = New regExp
  regEx.Pattern = "Nestl[e" + ChrW(&HE9) + "]|Maggi"
  regEx.IgnoreCase = False
  regEx.Global = True

  Set Matches = regEx.Execute(ActiveDocument.Range.Text)

  For Each Match In Matches

     Set sel = ActiveDocument.Range(Match.FirstIndex, Match.FirstIndex + Len(Match.Value))
     sel.Bold = True
     sel.Italic = True

  Next

End Sub

Але воно не працює. :(

Хто знає якусь нормальну книжку по VBA, або можливо інші способи автоматизації такого? Також корисно було б могти автоматизувати браузер, або робити http запити.

Комп’ютер корпоративний, там вінда, я з нею не дуже знайомий, тому не знаю чи ще щось там можна поставити.

Подякували: Настя1

2

Re: Автоматизація Microsoft Word з VBA

Вибачте за мову, відповідаю з того, що є під рукою:
http://i60.tinypic.com/2lcphn5.png

Але таку роботу все одно слід виконувати за участі людини, щоб випадково не нанукати.

Подякували: Настя1

3 Востаннє редагувалося fed_lviv (05.10.2015 07:39:07)

Re: Автоматизація Microsoft Word з VBA

bunyk написав:

Хто знає якусь нормальну книжку по VBA...

"Excel ****. Профессиональное программирование на VBA" (Джон Уокенбах). Досить файна книга. Щоб зрозуміти VBA.

Подякували: Настя1

4

Re: Автоматизація Microsoft Word з VBA

koala написав:

Вибачте за мову, відповідаю з того, що є під рукою:
http://i60.tinypic.com/2lcphn5.png

Але таку роботу все одно слід виконувати за участі людини, щоб випадково не нанукати.

:)

Але також треба зробити

  • Nestlé -> Nestlé

  • Nestle -> Nestlé

  • Maggi -> Maggi

  • Nescafe -> Nescafé

  • Nescafé -> Nescafé

І то напевне це ще не все. Щодо нукання - так, корисно було б якби кожну заміну можна було підтверджувати.

Подякували: Настя1

5

Re: Автоматизація Microsoft Word з VBA

bunyk написав:

Щодо нукання - так, корисно було б якби кожну заміну можна було підтверджувати.

Sub A()
    Dim Answer As Long
    Answer = MsgBox("Замінити?", vbYesNo, "Work")
    If Answer = vbYes Then
        ... 
        MsgBox "Замінено"
    End If
End Sub
Подякували: bunyk, Настя2

6

Re: Автоматизація Microsoft Word з VBA

http://i62.tinypic.com/2mdgpc9.png
Для Nescafé - Nescaf[eé]
Maggi так і буде
Це швидше, ніж з'ясовувати 100 нюансів для VBA. Не треба надмірності - VBA для реально нестандартних завдань, а не такої примітивщини.

Подякували: bunyk, Настя2

7 Востаннє редагувалося Настя (06.10.2015 10:45:51)

Re: Автоматизація Microsoft Word з VBA

Щиро дякую всім за відповіді і турботу!  *THUMBSUP*

Це я та знайома, котра (о Боже, який жах) добрячу частинку часу займається форматуванням тексту, який займає час і який можна було б зробити одним натисненням кнопки  *WALL*

Я так і роблю яk @koala Ви описуєте. Ctrl+H і замінюю.

Але ідея була в тому, щоб написати макрос на VBA знав які слова яким шрифтом мають бути, і заміняв все, що якось криво написано. Тим більше що цих слів трохи так назбиралось (див. нижче).

Бо з цим вордівським документом, окрім мене працює ще 18 людей, і часами через неуважність ми забуваємо відформатувати і потім отримуємо негативні фідбеки.

Отже, повний список заміни такий:

Nestlé / Nestle / nestle -> Nestlé
@Nestle / @nestle -> @Nestle
Cailler -> Cailler
Cereal Partners Worldwide / CPW -> Cereal Partners Worldwide / CPW
Pfizer / Pfizer Nutrition -> Pfizer / Pfizer Nutrition
Wyeth / Wyeth Nutrition -> Wyeth / Wyeth Nutrition
Purina -> Purina
Maggi / maggi -> Maggi
Alimentarium -> Alimentarium
BabyNes -> BabyNes
Gerber -> Gerber
Häagen-Dazs / Haagen-Daz / Häagen-Daz / Haagen Daz -> Häagen-Dazs
Innéov -> Innéov
KitKat / Kit Kat / Kit-Kat-> KitKat
Nescafé / Nescafe / nescafe / nescafé -> Nescafé
Nespresso -> Nespresso
Nestea -> Nestea
PowerBar / Power Bar - > PowerBar
San Pellegrino / Pellegrino -> San Pellegrino
Smarties -> Smarties
Special.T Special T Special. T -> Special.T

Це все має бути Arial 9.
Якщо потрібно - то скину темплейт Ворда.

Буду мега мега вдячна, якщо щось підкажете!

p.s. It's not gonna be easy. Є один виняток. Якщо написано Non-Nestlé, то воно має бути завжди крусивом Non-Nestlé (Nestlé не повнинно бути жирним саме в цьому котексті).
Non-Nestlé Twitter handles / Non-Nestlé Twitter Handles / Non-Nestle Twitter Handles -> Non-Nestlé Twitter handles
Non-Nestlé Facebook pages / Non-Nestlé Facebook Pages  Non-Nestle Facebook pages -> Non-Nestlé Facebook pages

От, і я то думала, а може то все можливо зробити одним натиском кнопки і в різних документах?  *SCRATCH*

Подякували: 0xDADA11C7, bunyk2