VBA w MS Word

31
VBA w MS Word Źródła: Steven Roman, Word.Makrodefinicje, Helion 2000 System pomocy VBA WinWord http://shop.oreilly.com/product/9781565927254.do http://examples.oreilly.com/9781565927254/ Examples.zip

description

VBA w MS Word. Źródła: Steven Roman, Word.Makrodefinicje, Helion 2000 System pomocy VBA WinWord http://shop.oreilly.com/product/9781565927254.do http://examples.oreilly.com/9781565927254/Examples.zip. Podstawy komunikacji z użytkownikiem (przydatne podczas testowania procedur). - PowerPoint PPT Presentation

Transcript of VBA w MS Word

Page 1: VBA w MS Word

VBA w MS Word

Źródła:Steven Roman, Word.Makrodefinicje, Helion 2000

System pomocy VBA WinWordhttp://shop.oreilly.com/product/9781565927254.do

http://examples.oreilly.com/9781565927254/Examples.zip

Page 2: VBA w MS Word

Podstawy komunikacji z użytkownikiem(przydatne podczas testowania procedur)

MsgBox (Komunikat [,przycisk][,tytuł]Przykład typów przycisków:vbOKOnly równy 0VbOKCancel równy 1vbRetryCancel równy 5Typy ikon (dodawane do przycisków)vbCritical równa 16vbInformation równa 64Przycisk domyślnyvbDefaultButton1 równy 0 (przycisk pierwszy)vbDefaultButton2 równy 256 (przycisk drugi)Są też parametry "modalności"

Przykłady:MsgBox "Kontynuować?", vbQuestion+vbYesNoInputBox (komunikat, [,tytuł][,WartośćDomyślna]sNazwisko=InputBox("Wpisz nazwisko", "Nazwisko", "Malinowski")

Page 3: VBA w MS Word

Operacje na łańcuchach znakówLen("Styczeń") zwróci 7UCase(ŁańcuchZnaków) i LCase(ŁańcuchZnaków)

Przykład: MsgBox(LCase("Malinowski"))

Left (ŁańcuchZnaków,x) Right, MidPrzykład: MsgBox Right("Alicja Kwiatkowska", 11)Przykład: MsgBox Mid("Biblioteka.doc",12)

do znalezienia położenia w łańcuchu:InStr(Początek, ŁańcuchPrzeszukiwany,ŁańcuchDoZnalezienia)Przykład: MsgBox InStr(1,"Alicja Kwiatkowska","Kwiatkowska")

Konwersja liczba - łańcuch znakówPrzykład: Str(123)Przykład: Val("4.5") Przykład: Val("1234 ulica Szeroka”)Uwaga: Val("$12,00") zwróci 0 !

Page 4: VBA w MS Word

Operacje na łańcuchach znakówUsuwanie spacji:Funkcje Trim, LTrim, RTrimPrzykład: Trim(" dodatkowe ")

Porównywanie łańcuchów znaków:ŁańcuchZnaków Like WzórStrComp("ŁańcuchZnaków1, ŁańcuchZnaków2 [, compare])

Uwaga: ustawienia porównań: Option Compare Binary lub Text (lokalne, krajowe)Przykład: MyCheck = "aM5b" Like "a[L-P]#[!c-e]"

MyStr1 = "ABCD": MyStr2 = "abcd"MyComp = StrComp(MyStr1, MyStr2, 1) ' Zwraca 0MyComp = StrComp(MyStr1, MyStr2, 0) ' Zwraca -1.

Page 5: VBA w MS Word

Ważniejsze struktury sterująceSwitch(wyraż1, wartość1, wyraż2, wartość2, ... , wyrażN, wartośćN)Uwaga: zawsze ocenia wszystkie wyrażenia a zwraca wartość odpowiadająca pierwszemu prawdziwemu

Przykład:Sub WyswietlTypDokumentu(RozszerzenieDokumentu As String)

Dim TypDokumentu As Variant TypDokumentu = Switch(RozszerzenieDokumentu = "dot", "Szablon", _ RozszerzenieDokumentu = "docx", "Dokument")

'Wyświetlenie rezultatu If Not IsNull(TypDokumentu) Then MsgBox TypDokumentu Else MsgBox "Typ nieznany" End IfEnd Sub

Page 6: VBA w MS Word

Ważniejsze struktury sterująceIf...Then

Przykład: Usuwa bieżące zaznaczenie w aktywnym dokumencie jeśli zawiera ono wyraz "Bartok"

Dim sTekst as StringsTekst = Selection.TextIf InStr(sTekst, "Bartok") Then Selection.Delete

Page 7: VBA w MS Word

Ważniejsze struktury sterującePętla For ... Next

Przykłady:

For i = 1 To ActiveDocument.Paragraphs.Count 'weź następny akapit Set akapit = ActiveDocument.Paragraphs(i) 'zmień styl z Nagłówek 1 na Nagłówek 2 If akapit.Style = "Nagłówek 1" Then akapit.Style = "Nagłówek 2" End IfNext i

Page 8: VBA w MS Word

Ważniejsze struktury sterującePętla For ... Next

Przykłady:

For i = 0 to 10 iTablica(i) = 0Next i

Dim i As IntegerDim akapit As ParagraphFor i = 1 to ActiveDocument.Paragraphs.Count 'weź następny akapit Set akapit = ActiveDocument.Paragraphs(i) 'jeżeli pierwszy wyraz to "Dziękuję", 'wyjdź z pętli For 'Words zwraca wyraz wraz ze spacjami po nim występującymi If Trim(akapit.Range.Words(1)) = "Dziękuję" Then Exit ForNext iakapit.Range.Bold = True

Page 9: VBA w MS Word

Ważniejsze struktury sterującePętla For Each - dla kolekcji obiektów

For Each ZmiennaObiektowa In NazwaKolekcji 'blok koduNext ZmiennaObiektowa

jest równoważna ale bardziej zwięzła i szybsza niż:

For i = 1 To Kolekcja.Count 'blok koduNext i

Page 10: VBA w MS Word

Ważniejsze struktury sterującePętla For Each - dla kolekcji obiektów

Przykłady:

Dim akapit As ParagraphFor Each akapit In ActiveDocument.Paragraphs 'zmień styl z Nagłówek 1 na Nagłówek 2 If akapit.Style = "Nagłówek 1" Then akapit.Style = "Nagłówek 2" End IfNext akapit

Page 11: VBA w MS Word

Ważniejsze struktury sterującePętla Do ... Loop

Odmiany:

Do {While | Until}

Przykłady:

Przechodzenie przez akapity dopóki zawierają dowolne znaki'Weź pierwszy akapitSet akapit = ActiveDocument.Paragraphs(1)Do While akapit.Range.Characters.Count 'blok kodu 'Weź następny akapit 'Uwaga: pusty akapit tzn. zawierający znak końca akapitu ma .Count równy 1Loop

Page 12: VBA w MS Word

Ważniejsze struktury sterującePętla Do ... LoopInna wersja:'Weź pierwszy akapitSet akapit = ActiveDocument.Paragraphs(1)Do 'blok kodu 'Weź następny akapitLoop While akapit.Range.Characters.Count > 1

Przykład:Formatujemy kursywą każdy wyraz danego akapitu aż dojdziemy do wyrazu pogrubionego

Dim akapit As ParagraphDim fragment As RangeDim iWyraz As LongDim iLicznikWyrazow As Long'InicjalizujiWyraz = 1'Weź pierwszy akapit

Set akapit = ActiveDocument.Paragraphs(1)'Oblicz liczbę wyrazów w akapicieiLicznikWyrazow = akapit.Range.Words.Count'Wykonuj pętlę, dopóki są wyrazy

Do While iWyraz <=iLicznikWyrazow 'Weź wyraz Set fragment = akapit.Range.Words(iWyraz) 'wyjdź z pętli, jeżeli wyraz jest pogrubiony If fragment.Bold = True Then Exit Do 'Sformatuj wyraz kursywą fragment.Italic = True 'Następny wyraz iWyraz = iWyraz + 1Loop

Uwaga na niebezpieczeństwo utworzenia nieskończonych pętli!

Page 13: VBA w MS Word

Ważniejsze struktury sterująceSelect .. Case

Select Case wyrażenie Case wartość1 ' blok instrukcji wykonywanych gdy wyrażenie jest równe wartość1 Case wartość2 ' blok instrukcji wykonywanych gdy wyrażenie jest równe wartość2 ... Case Else ' blok instrukcji wykonywanych w pozostałych przypadkachEnd Select

Page 14: VBA w MS Word

Funkcje obsługi plików i folderówDir, FileLen, FileTimeDate, FileCopy, Kill, Name, RmDir, MkDir

Przykład sprawdzenia czy plik istnieje:If Len(Dir("c:\nazwa_sprawdzanego_pliku.docx")) = 0 Then Msgbox "Plik nie istnieje"Else Msgbox "Plik istnieje"End If

Page 15: VBA w MS Word

Ważniejsze kolekcje obiektów WordaCharacters, Documents, Paragraphs, RecentFiles, Columns, Rows, Tables, Sections, Sentences, Words, TabStops

Przykłady korzystania z kolekcji Documents:

MsgBox "Liczba otwartych dokumentów: " & Application.Documents.Count

KolekcjaDocuments.Add(Szablon,True | False)

czyli:Dim dok as DocumentSet dok = Application.Documents.Add("Nazwa szablonu", False)

odwołanie przez referencję do otwartego dokumentu

Application.Documents.Item("Chwilowy.doc")Application.Documents(2)Application.Documents("Chwilowy.doc")

Page 16: VBA w MS Word

Zmienna obiektowaZmienna obiektowa (jest zmienną wskaźnikową)czyli kilka zmiennych obiektowych może wskazywać ten sam obiekt

ActiveDocument.Paragraphs(1).Range.Font.Bold = True

jest równoważne

Dim fragment As RangeSet fragment = ActiveDocument.Paragraphs(1).Rangefragment.Bold = True

jest równoważne

Dim czcionka As FontSet czcionka = ActiveDocument.Paragraphs(1).Range.Fontczcionka.Bold = True

Zwalnianie zmiennej obiektowej:

Set akapit = Nothing

Page 17: VBA w MS Word

Konstrukcje, które warto znać.Obiekt Document

ActiveDocument - tylko do odczytu a zatemDocuments("Mój list").ActivateMsgBox Documents.CountObiektDocument.Add(szablon, True | False) ' domyślnie szablon NormalObiektDocument.Open(FileName, ConfirmConverstions, ReadOnly, ...)ObiektDocument.Close(SaveChanges, OriginalFormat, RouteDocument)Przykład:ActiveDocument.Close SaveChanges := wdSaveChanges, _ OriginalFormat :=wdOriginalDocumentFormat

ObiektDocument.SaveObiektDocument.SaveAs(Filename, FileFormat, ... )

Właściwości związane z nazwą dokumentu:Name, FullName, Path

Metody obiektu DocumentDocuments("MójList").Activate

Page 18: VBA w MS Word

Konstrukcje, które warto znać.Obiekt Document

Obiekt Bookmark - dodawanie zakładkiActiveDocument.Bookmarks.Add "Zaznaczenie", Selection.Range

Usuwanie wszystkich zakładekDim zakladka As BookmarkFor Each zakladka In ActiveDocument.Bookmarks zakladka.DeleteNext Zakladka

Kolekcje Characters, Words, SentencesActiveDocument.Words(1) - zwraca obiekt typu Range

Obiekt Paragraphs - operacje na akapitachzmiana tekstu we fragmencie akapituAkapit.Range.Text = "nowy tekst"

Page 19: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Range i Selection

Dostęp do tekstu pierwszego akapitu w aktywnym dokumencie:ActiveDocument.Paragraphs(1).Range.Text

wybranie całego tekstu dokumentu:Set fragment = ActiveDocument.Range(0,0)fragment.WholeStory

obiekt Selection - tylko jeden w dokumencieobiekty Range - wiele w dokumencie

Page 20: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Range i Selection

Przykład (najpierw trzeba wprowadzić w dokumencie tekst dwuakapitowy)

Dim fragment As RangeDim zaznaczenie1 As SelectionDim zaznaczenie2 As Selection

ActiveWindow.Split = True

ActiveWindow.Panes(1).ActivateActiveDocument.Paragraphs(1).Range.SelectSet Zaznaczenie1 = Selection

ActiveWindow.Panes(2).ActivateActiveDocument.Paragraphs(2).Range.SelectSet Zaznaczenie2 = Selectionzaznaczenie2.MoveStart wdCharacter, zaznaczenie1.Characters.Count

Page 21: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Range i Selection

Tworzenie obiektu Range lub SelectionActiveDocument.SelectSet zaznaczenie = ActiveDocument.ActiveWindow.Selection

ActiveDocument.Fields(2).SelectSet zaznaczenie = ActiveDocument.ActiveWindow.Selection.DeleteSelection.Delete

Wstawianie tekstu do dokumentu przez tzw. punkt wstawiania kursoraSet fragment = ActiveDocument.Paragraphs(2).Rangefragment.Collapse wdCollapseStartfragment.Text = "Wstawiony tekst ..."

Page 22: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Range i Selection

Wstawianie tekstu do dokumentu na początku/końcu dokumentu

Set fragment = ActiveDocument.Rangefragment.Collapse wdCollapseStartfragment.Text = "Początek dokumentu" & vbCr

Set fragment = ActiveDocument.Range(Start:=0, End:=0)fragment.Text ="Początek dokumentu" & vbCr

Set fragment = ActiveDocument.Rangefragment.StartOf wdStory, wdMovefragment.Text = "Początek dokumentu" & vbCr

Set fragment = ActiveDocument.Paragraphs(2).Rangefragment.Collapse wdCollapseEndfragment.Text = "Początek akapitu 3" & vbCr

Set fragment = ActiveDocument.Rangefragment.EndOf wdStory, wdMovefragment.Text = "Koniec dokumentu" & vbCr

Page 23: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Range i Selection

Obiekt Find

Przykład - szukanie w zdaniu łańcucha znaków i zaznaczenie goSet fragment = ActiveDocument.Sentences(1)fragment.Find.Text = "Alicja"fragment.Find.ExecuteIf fragment.Find.Found = True Then fragment.SelectEndif

Ważniejsze metody obiektu Range

Next, PreviousSetRange, Start, EndStartOf, EndOfHomeKey, EndKeyCollapse, ExpandExtend (dla obiektu Selection)WholeStoryMove, MoveEnd, MoveStart, MoveUp, MoveDown i inne

Warto zajrzeć:http://stackoverflow.com/questions/20634065/word-vba-find-a-line-which-starts-with-a-term-and-delete-it

Page 24: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Range i Selection

Przykład:Dim fragment As Range' Utwórz obiekt Range, który' wskazuje początek zaznaczeniaSet fragment = Selection.Rangefragment.Collapse Direction:=wdCollapseStartDo ' zatrzymaj się, jeżeli fragment nie znajduje ' się już w obrębie zaznaczenia If Not fragment.InRange(Selection.Range) Then Exit Do Else ' powiększ obiekt Range, aby zawierał pierwszy wyraz fragment.Expand wdWord ' jeżeli fragment.Range reprezentuje tylko znak ' akapitu, to nie wyświetlaj go, ponieważ otrzymalibyśmy ' dwa puste wiersze zamiast jednego If fragment.Text = vbCr Then Debug.Print Else

Debug.Print fragment.Text End If ' niech zmienna fragment wskazuje ' początek następnego akapitu Set fragment = fragment.Next(wdParagraph, 1) ' jeżeli dojdziemy do końca akapitu ' metoda Next nie będzie mogła zostać wykonana, więc ' referencja do obiektu fragment zostanie ustawiona na Nothing ' teraz czas zakończyć procedurę If fragment Is Nothing Then Exit Sub fragment.Collapse wdCollapseStart End IfLoop

Page 25: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Range i Selection

Przykłady:

ActiveWindow.Selection.SetRange(0,0) fragment.End = fragment.End + 1 fragment.End = fragment.Start fragment.Start = fragment.End

ActiveDocument.Characters(1).Select Selection.EndOf wdLine, wdExtend ' zaznacza cały wiersz

ActiveDocument.Characters(1).Select Selection.Extend "#" ' zaznacza treść dokumentu od początku do znaku #

Metody edycyjne (odpowiedniki funkcji dawnego Menu "Edycja")fragment.Copy, fragment.Cut, fragment.Delete, fragment.Paste

fragment.PasteSpecial(IconIndex, Link, Placement, DisplayAsIcon, DataType, IconFileName, IconLabel)

Metody wstawiające tekstfragment.InsertAfter, fragment.InsertBefore

Przykład:Set fragment = ActiveDocument.Paragraphs(1).Range' usuń znak końca akapitu z obiektu Rangefragment.MoveEnd wdCharacter, -1fragment.InsertAfter "Koniec"

Page 26: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Range i Selection

Przykłady:

ActiveWindow.Selection.SetRange(0,0) fragment.End = fragment.End + 1 fragment.End = fragment.Start fragment.Start = fragment.End

ActiveDocument.Characters(1).Select Selection.EndOf wdLine, wdExtend ' zaznacza cały wiersz

ActiveDocument.Characters(1).Select Selection.Extend "#" ' zaznacza treść dokumentu od początku do znaku #

Metody edycyjne (odpowiedniki funkcji dawnego Menu "Edycja")fragment.Copy, fragment.Cut, fragment.Delete, fragment.Paste

fragment.PasteSpecial(IconIndex, Link, Placement, DisplayAsIcon, DataType, IconFileName, IconLabel)

Metody wstawiające tekstfragment.InsertAfter, fragment.InsertBefore

Przykład:Set fragment = ActiveDocument.Paragraphs(1).Range' usuń znak końca akapitu z obiektu Rangefragment.MoveEnd wdCharacter, -1fragment.InsertAfter "Koniec"

Page 27: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Range i Selection

Metody wstawiające akapit

fragment.InsertParagraph(kasuje poprzedni w tym miejscu. Rozważyć uprzednie zwijanie fragmentu)fragment.InsertParagraphAfterfragment.InsertParagraphBefore

Metody symulacji klawiatury (dla obiektu Selection)HomeKey, EndKey, EscapeKey, TypeBackspace, TypeParagraph, TypeText (rozważyć ReplaceSelection)

Przykład:Selection.TypeText "12345678"

Sortowanie tekstu

fragment.Sort(ExcludeHeader,FieldNumber,SortFieldType, ...)

Przykład:Dim nowyDokument As DocumentSet nowyDokument = Documents.AddnowyDokument.Content.InsertAfter "jabłko" & Chr(13) _ & "cukinia" & Chr(13) & "brzoskwinia" & Chr(13)nowyDokument.Content.Sort SortOrder:=wdSortOrderAscending

Page 28: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Find i Replace

Przykłady:

With Selection.Find .ClearFormatting 'bez formatowania .Text = "Być albo nie być" .Forward = True .Wrap = wdFindContinueEnd WithSelection.Find.Execute

Dim fragment As Range' przeszukiwanie całego dokumentuSet fragment = ActiveDocument.ContentWith fragment.Find .ClearFormatting .Text = "Być albo nie być" .Wrap = wdFindStop .ExecuteEnd Withfragment.Select

With Selection.Find .ClearFormatting 'bez formatowania .Text = "Być albo nie być" .Forward = True .Wrap = wdFindContinue .Format .MatchCase .MatchWholeWord .MatchWildcards .MatchSoundsLike .MatchAllWordFormsEnd WithSelection.Find.ExecuteIf Selection.Find.Found = True Then MsgBox "Znaleziono tekst"Else MsgBox "Nie znaleziono tekstu"End If

Page 29: VBA w MS Word

Konstrukcje, które warto znać.Obiekty Find i Replace

Zastępowanie - przykład

Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find .Text = "Znajdź" .Replacement.Text = "zastąp" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildCards = False .MatchSoundsLike = False .MatchAllWordForms = FalseEnd WithSelection.Find.Execute Replace:=wdReplaceAll

Page 30: VBA w MS Word

Programowanie w Wordziez poziomu innej aplikacji

Przykład:'najpierw w IDE VBA musimy włączyć Tools | References | Microsoft Word X.0 Object Library

Dim Wrd As Word.ApplicationSet Wrd = New Word.ApplicationWrd.Visible = TrueDim dokument As DocumentSet dokument = Wrd.Documents.Adddokument.Content = "być albo nie być"dokument.SaveWrd.Quit

Page 31: VBA w MS Word

Programowanie w Wordziez poziomu innej aplikacji

Przykład:

Dim wrd As Word.ApplicationOn Error Resume Next' Spróbuj uzyskać dostęp do uruchomionego WordaSet wrd = GetObject(, "Word.Application")If Err.Number = 429 Then ' z powodu tego błędu musimy utworzyć nowy obiekt Set wrd = CreateObject("Word.Application")ElseIf Err.Number <> 0 Then ' mamy inny błąd więc informujemy o nim MsgBox "Błąd: " & Err.Description Exit SubEnd Ifwrd.Visible = True

Przykład:

Dim Wrd As ObjectDim dokument As ObjectSet Wrd = CreateObject("Word.Application")Wrd.Visible = TrueSet dokument = Wrd.Documents.Adddokument.Content = "Być albo nie być"dokument.Save