1 / 31

VBA w MS Word

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).

urbain
Download Presentation

VBA w MS Word

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. Podstawy komunikacji z użytkownikiem(przydatne podczas testowania procedur) MsgBox (Komunikat [,przycisk][,tytuł] Przykład typów przycisków: vbOKOnly równy 0 VbOKCancel równy 1 vbRetryCancel równy 5 Typy ikon (dodawane do przycisków) vbCritical równa 16 vbInformation równa 64 Przycisk domyślny vbDefaultButton1 równy 0 (przycisk pierwszy) vbDefaultButton2 równy 256 (przycisk drugi) Są też parametry "modalności" Przykłady: MsgBox "Kontynuować?", vbQuestion+vbYesNo InputBox (komunikat, [,tytuł][,WartośćDomyślna] sNazwisko=InputBox("Wpisz nazwisko", "Nazwisko", "Malinowski")

  3. Operacje na łańcuchach znaków Len("Styczeń") zwróci 7 UCase(ŁańcuchZnaków) i LCase(ŁańcuchZnaków) Przykład: MsgBox(LCase("Malinowski")) Left (ŁańcuchZnaków,x) Right, Mid Przykład: MsgBox Right("Alicja Kwiatkowska", 11) Przykład: MsgBoxMid("Biblioteka.doc",12) do znalezienia położenia w łańcuchu: InStr(Początek, ŁańcuchPrzeszukiwany,ŁańcuchDoZnalezienia) Przykład: MsgBoxInStr(1,"Alicja Kwiatkowska","Kwiatkowska") Konwersja liczba - łańcuch znaków Przykład: Str(123) Przykład: Val("4.5") Przykład: Val("1234 ulica Szeroka”) Uwaga: Val("$12,00") zwróci 0 !

  4. Operacje na łańcuchach znaków Usuwanie spacji: Funkcje Trim, LTrim, RTrim Przykład: Trim(" dodatkowe ") Porównywanie łańcuchów znaków: ŁańcuchZnakówLike Wzór StrComp("ŁańcuchZnaków1, ŁańcuchZnaków2 [, compare]) Uwaga: ustawienia porównań: Option CompareBinary lub Text (lokalne, krajowe) Przykład: MyCheck = "aM5b" Like "a[L-P]#[!c-e]" MyStr1 = "ABCD": MyStr2 = "abcd" MyComp = StrComp(MyStr1, MyStr2, 1) ' Zwraca 0 MyComp = StrComp(MyStr1, MyStr2, 0) ' Zwraca -1.

  5. Ważniejsze struktury sterujące Switch(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: SubWyswietlTypDokumentu(RozszerzenieDokumentu As String) DimTypDokumentu As Variant TypDokumentu = Switch(RozszerzenieDokumentu = "dot", "Szablon", _ RozszerzenieDokumentu = "docx", "Dokument") 'Wyświetlenie rezultatu If Not IsNull(TypDokumentu) Then MsgBoxTypDokumentu Else MsgBox "Typ nieznany" End If End Sub

  6. Ważniejsze struktury sterujące If...Then Przykład: Usuwa bieżące zaznaczenie w aktywnym dokumencie jeśli zawiera ono wyraz "Bartok" DimsTekst as String sTekst = Selection.Text IfInStr(sTekst, "Bartok") Then Selection.Delete

  7. Ważniejsze struktury sterujące Pę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 Ifakapit.Style = "Nagłówek 1" Then akapit.Style = "Nagłówek 2" End If Next i

  8. Ważniejsze struktury sterujące Pętla For ... Next Przykłady: For i = 0 to 10 iTablica(i) = 0 Next i Dim i As Integer Dim akapit As Paragraph For 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 IfTrim(akapit.Range.Words(1)) = "Dziękuję" Then Exit For Next i akapit.Range.Bold = True

  9. Ważniejsze struktury sterujące Pętla For Each - dla kolekcji obiektów For EachZmiennaObiektowa In NazwaKolekcji 'blok kodu NextZmiennaObiektowa jest równoważna ale bardziej zwięzła i szybsza niż: For i = 1 To Kolekcja.Count 'blok kodu Next i

  10. Ważniejsze struktury sterujące Pętla For Each - dla kolekcji obiektów Przykłady: Dim akapit As Paragraph For Each akapit In ActiveDocument.Paragraphs 'zmień styl z Nagłówek 1 na Nagłówek 2 Ifakapit.Style = "Nagłówek 1" Then akapit.Style = "Nagłówek 2" End If Next akapit

  11. Ważniejsze struktury sterujące Pętla Do ... Loop Odmiany: Do {While | Until} Przykłady: Przechodzenie przez akapity dopóki zawierają dowolne znaki 'Weź pierwszy akapit Set akapit = ActiveDocument.Paragraphs(1) Do Whileakapit.Range.Characters.Count 'blok kodu 'Weź następny akapit 'Uwaga: pusty akapit tzn. zawierający znak końca akapitu ma .Count równy 1 Loop

  12. Ważniejsze struktury sterujące Pętla Do ... Loop Inna wersja: 'Weź pierwszy akapit Set akapit = ActiveDocument.Paragraphs(1) Do 'blok kodu 'Weź następny akapit LoopWhileakapit.Range.Characters.Count > 1 Przykład: Formatujemy kursywą każdy wyraz danego akapitu aż dojdziemy do wyrazu pogrubionego Dim akapit As Paragraph Dim fragment As Range DimiWyraz As Long DimiLicznikWyrazow As Long 'Inicjalizuj iWyraz = 1 'Weź pierwszy akapit Set akapit = ActiveDocument.Paragraphs(1) 'Oblicz liczbę wyrazów w akapicie iLicznikWyrazow = akapit.Range.Words.Count 'Wykonuj pętlę, dopóki są wyrazy Do WhileiWyraz <=iLicznikWyrazow 'Weź wyraz Set fragment = akapit.Range.Words(iWyraz) 'wyjdź z pętli, jeżeli wyraz jest pogrubiony Iffragment.Bold = True Then Exit Do 'Sformatuj wyraz kursywą fragment.Italic = True 'Następny wyraz iWyraz = iWyraz + 1 Loop Uwaga na niebezpieczeństwo utworzenia nieskończonych pętli!

  13. Ważniejsze struktury sterujące Select .. 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 przypadkach End Select

  14. Funkcje obsługi plików i folderów Dir, 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

  15. Ważniejsze kolekcje obiektów Worda Characters, 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 Document Set 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")

  16. Zmienna obiektowa Zmienna 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 Range Set fragment = ActiveDocument.Paragraphs(1).Range fragment.Bold = True jest równoważne Dim czcionka As Font Set czcionka = ActiveDocument.Paragraphs(1).Range.Font czcionka.Bold = True Zwalnianie zmiennej obiektowej: Set akapit = Nothing

  17. Konstrukcje, które warto znać.Obiekt Document ActiveDocument - tylko do odczytu a zatem Documents("Mój list").Activate MsgBoxDocuments.Count ObiektDocument.Add(szablon, True | False) ' domyślnie szablon Normal ObiektDocument.Open(FileName, ConfirmConverstions, ReadOnly, ...) ObiektDocument.Close(SaveChanges, OriginalFormat, RouteDocument) Przykład: ActiveDocument.CloseSaveChanges := wdSaveChanges, _ OriginalFormat :=wdOriginalDocumentFormat ObiektDocument.Save ObiektDocument.SaveAs(Filename, FileFormat, ... ) Właściwości związane z nazwą dokumentu: Name, FullName, Path Metody obiektu Document Documents("MójList").Activate

  18. Konstrukcje, które warto znać.Obiekt Document Obiekt Bookmark - dodawanie zakładki ActiveDocument.Bookmarks.Add "Zaznaczenie", Selection.Range Usuwanie wszystkich zakładek Dimzakladka As Bookmark For Eachzakladka In ActiveDocument.Bookmarks zakladka.Delete NextZakladka Kolekcje Characters, Words, Sentences ActiveDocument.Words(1) - zwraca obiekt typu Range Obiekt Paragraphs - operacje na akapitach zmiana tekstu we fragmencie akapitu Akapit.Range.Text = "nowy tekst"

  19. 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 dokumencie obiekty Range - wiele w dokumencie

  20. Konstrukcje, które warto znać.Obiekty Range i Selection Przykład (najpierw trzeba wprowadzić w dokumencie tekst dwuakapitowy) Dim fragment As Range Dim zaznaczenie1 As Selection Dim zaznaczenie2 As Selection ActiveWindow.Split = True ActiveWindow.Panes(1).Activate ActiveDocument.Paragraphs(1).Range.Select Set Zaznaczenie1 = Selection ActiveWindow.Panes(2).Activate ActiveDocument.Paragraphs(2).Range.Select Set Zaznaczenie2 = Selection zaznaczenie2.MoveStart wdCharacter, zaznaczenie1.Characters.Count

  21. Konstrukcje, które warto znać.Obiekty Range i Selection Tworzenie obiektu Range lub Selection ActiveDocument.Select Set zaznaczenie = ActiveDocument.ActiveWindow.Selection ActiveDocument.Fields(2).Select Set zaznaczenie = ActiveDocument.ActiveWindow.Selection.Delete Selection.Delete Wstawianie tekstu do dokumentu przez tzw. punkt wstawiania kursora Set fragment = ActiveDocument.Paragraphs(2).Range fragment.CollapsewdCollapseStart fragment.Text = "Wstawiony tekst ..."

  22. Konstrukcje, które warto znać.Obiekty Range i Selection Wstawianie tekstu do dokumentu na początku/końcu dokumentu Set fragment = ActiveDocument.Range fragment.CollapsewdCollapseStart fragment.Text = "Początek dokumentu" & vbCr Set fragment = ActiveDocument.Range(Start:=0, End:=0) fragment.Text ="Początek dokumentu" & vbCr Set fragment = ActiveDocument.Range fragment.StartOfwdStory, wdMove fragment.Text = "Początek dokumentu" & vbCr Set fragment = ActiveDocument.Paragraphs(2).Range fragment.CollapsewdCollapseEnd fragment.Text = "Początek akapitu 3" & vbCr Set fragment = ActiveDocument.Range fragment.EndOfwdStory, wdMove fragment.Text = "Koniec dokumentu" & vbCr

  23. Konstrukcje, które warto znać.Obiekty Range i Selection Obiekt Find Przykład - szukanie w zdaniu łańcucha znaków i zaznaczenie go Set fragment = ActiveDocument.Sentences(1) fragment.Find.Text = "Alicja" fragment.Find.Execute Iffragment.Find.Found = True Then fragment.Select Endif Ważniejsze metody obiektu Range Next, Previous SetRange, Start, End StartOf, EndOf HomeKey, EndKey Collapse, Expand Extend (dla obiektu Selection) WholeStory Move, 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

  24. Konstrukcje, które warto znać.Obiekty Range i Selection Przykład: Dim fragment As Range ' Utwórz obiekt Range, który ' wskazuje początek zaznaczenia Set fragment = Selection.Range fragment.CollapseDirection:=wdCollapseStart Do ' 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.ExpandwdWord ' jeżeli fragment.Range reprezentuje tylko znak ' akapitu, to nie wyświetlaj go, ponieważ otrzymalibyśmy ' dwa puste wiersze zamiast jednego Iffragment.Text = vbCr Then Debug.Print Else Debug.Printfragment.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 IsNothing Then ExitSub fragment.CollapsewdCollapseStart End If Loop

  25. 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.EndOfwdLine, 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 tekst fragment.InsertAfter, fragment.InsertBefore Przykład: Set fragment = ActiveDocument.Paragraphs(1).Range ' usuń znak końca akapitu z obiektu Range fragment.MoveEndwdCharacter, -1 fragment.InsertAfter "Koniec"

  26. 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.EndOfwdLine, 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 tekst fragment.InsertAfter, fragment.InsertBefore Przykład: Set fragment = ActiveDocument.Paragraphs(1).Range ' usuń znak końca akapitu z obiektu Range fragment.MoveEndwdCharacter, -1 fragment.InsertAfter "Koniec"

  27. 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.InsertParagraphAfter fragment.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: DimnowyDokument As Document Set nowyDokument = Documents.Add nowyDokument.Content.InsertAfter "jabłko" & Chr(13) _ & "cukinia" & Chr(13) & "brzoskwinia" & Chr(13) nowyDokument.Content.SortSortOrder:=wdSortOrderAscending

  28. 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 = wdFindContinue End With Selection.Find.Execute Dim fragment As Range ' przeszukiwanie całego dokumentu Set fragment = ActiveDocument.Content With fragment.Find .ClearFormatting .Text = "Być albo nie być" .Wrap = wdFindStop .Execute End With fragment.Select With Selection.Find .ClearFormatting 'bez formatowania .Text = "Być albo nie być" .Forward = True .Wrap = wdFindContinue .Format .MatchCase .MatchWholeWord .MatchWildcards .MatchSoundsLike .MatchAllWordForms End With Selection.Find.Execute IfSelection.Find.Found = True Then MsgBox "Znaleziono tekst" Else MsgBox "Nie znaleziono tekstu" End If

  29. Konstrukcje, które warto znać.Obiekty Find i Replace Zastępowanie - przykład Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "Znajdź" .Replacement.Text = "zastąp" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildCards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.ExecuteReplace:=wdReplaceAll

  30. Programowanie w Wordziez poziomu innej aplikacji Przykład: 'najpierw w IDE VBA musimy włączyć Tools | References | Microsoft Word X.0 Object Library DimWrd As Word.Application Set Wrd = New Word.Application Wrd.Visible = True Dim dokument As Document Set dokument = Wrd.Documents.Add dokument.Content = "być albo nie być" dokument.Save Wrd.Quit

  31. Programowanie w Wordziez poziomu innej aplikacji Przykład: Dimwrd As Word.Application On Error Resume Next ' Spróbuj uzyskać dostęp do uruchomionego Worda Set wrd = GetObject(, "Word.Application") IfErr.Number = 429 Then ' z powodu tego błędu musimy utworzyć nowy obiekt Set wrd = CreateObject("Word.Application") ElseIfErr.Number <> 0 Then ' mamy inny błąd więc informujemy o nim MsgBox "Błąd: " & Err.Description ExitSub End If wrd.Visible = True Przykład: DimWrd As Object Dim dokument As Object Set Wrd = CreateObject("Word.Application") Wrd.Visible = True Set dokument = Wrd.Documents.Add dokument.Content = "Być albo nie być" dokument.Save

More Related