VBA Word - formatowanie zakresów tekstu

Anonimowe
2022-11-21T01:06:07+00:00

Czy jest możliwe w Word ustawienie jednakowego formatowania dla różnego zakresu tekstu?

Piszę o co chodzi. Chciałbym, aby zgodnie ze stylem o nazwie "wypunktowanie" były formatowane akapity składające się z następującej konstrukcji:

"[imie] - [ocena]".

Kategoria [imie] zawiera (jak nazwa wskazuje) imiona :), na przykład "Tomek", "Michał", "Andrzej", "Jakub".

A kategoria [ocena] zawiera opisowe oceny: "bardzo źle", "źle", "średnio", "dobrze", "bardzo dobrze".

Jak dokonać formatowania tekstu, dla pojedynczej oceny wybranej osoby to wiem:

Dim objDoc As Document

Set objDoc = ActiveDocument

With objDoc.Content.Find

.ClearFormatting 

.Text = imie1 & Chr(32) & Chr(150) & Chr(32) & ocena1 

.MatchWildcards = True 

With .Replacement 

.ClearFormatting 

.Style = "wypunktowanie" 

End With 

.Execute Wrap:=wdFindContinue, Format:=True, Replace:=wdReplaceAll 

End With

Pytanie czy jest możliwość ustawienia takiego formatowania, które będzie obejmowało wszystkie możliwe zakresy dla konstrukcji "[imie] - [ocena]"?

Będę wdzięczny za pomoc i sugestie.

Microsoft 365 i pakiet Office | Word | Do użytku biznesowego | Windows

Pytanie zablokowane. To pytanie zostało zmigrowane ze społeczności pomocy technicznej firmy Microsoft. Możesz zagłosować, czy pytanie jest pomocne, ale nie możesz dodawać komentarzy ani odpowiedzi, ani też śledzić pytania.

Komentarze: 0 Brak komentarzy
Odpowiedź zaakceptowana przez autora pytania
Oskar Shon 49,336 Punkty reputacji Moderator wolontariuszy
2022-11-22T08:15:50+00:00

No bardzo dobrze. Za wile tych deklaracji na górze oraz zapis trochę rozciągasz ale to szczegóły do wyrobienia.

Tablice zawsze są od zera więc nie musisz wyliczać min dla tablicy.

No a spacje średnik masz w pierwszym poście.

Wkleję ci tutaj połączenie 2ch pętli abyś załapał.

Spróbuj na bazę tego poprawić swój kod:

Dim imie As Variant: imie = Array("Tomasz", "Michał", "Anna", "Janusz", "Wiktor") 

Dim ocena As Variant: ocena = Array("bardzo źle", "źle", "średnio", "dobrze", "bardzo dobrze") 

Dim i As Integer, j As Integer 

For j = 0 To UBound(ocena) 

      For i = 0 To UBound(imie) 

          Debug.Print imie(i) & Chr(32) & Chr(150) & Chr(32) & ocena(j) 

      Next 

Next

Wykorzystuj okno debugera [Ctrl+g] co da się przekazać wartości zmiennych aby upewnić się ze mechanizm dobrze jest skonstruowany:

Obraz

Pozdrawiam.

Czy ta odpowiedź była pomocna?

1 osoba uznała tę odpowiedź za pomocną.
Komentarze: 0 Brak komentarzy

Dodatkowe odpowiedzi: 4

Sortuj według: Najbardziej pomocne
  1. Oskar Shon 49,336 Punkty reputacji Moderator wolontariuszy
    2022-11-24T10:40:02+00:00

    Proszę bardzo. :)

    Cieszę się że marchewka i wędka zadziałała.

    Pozdrawiam.

    Czy ta odpowiedź była pomocna?

    Komentarze: 0 Brak komentarzy
  2. Anonimowe
    2022-11-24T00:30:52+00:00

    u mnie w sumie działa. Ale pewnie da się to dużo prościej napisać niż to zrobiłem :)

    Dim wrdDoc As Document: Set wrdDoc = Application.ActiveDocument 
    Dim wrdFind As Find 
    
    Dim wrdRng As Range 
    
    Dim imie As Variant: imie = Array("Tomasz", "Michał", "Anna", "Janusz", "Wiktor") 
    
    Dim ocena As Variant: ocena = Array("bardzo źle", "źle", "średnio", "dobrze", "bardzo dobrze") 
    
    Dim i As Integer, j As Integer
    
    For j = 0 To UBound(ocena) 
    
          For i = 0 To UBound(imie) 
    
                Set wrdRng = wrdDoc.Content 
    
                Set wrdFind = wrdRng.Find 
    
                With wrdFind 
    
                .ClearFormatting 
    
                .Text = imie(i) & Chr(32) & Chr(150) & Chr(32) & ocena(j) 
    
                .MatchWildcards = True 
    
                .MatchWholeWord = True 
    
                .MatchCase = True 
    
                .Format = True 
    
                End With 
    
        Do While wrdFind.Execute = True 
    
            wrdRng.Style = "wypunktowanie_normal" 
    
        Loop 
    
            Debug.Print imie(i) & Chr(32) & Chr(150) & Chr(32) & ocena(j) 
    
          Next 
    Next
    
    Dziękuję Oskarze za pomoc!
    

    Czy ta odpowiedź była pomocna?

    Komentarze: 0 Brak komentarzy
  3. Anonimowe
    2022-11-22T00:57:04+00:00

    Tablicę i pętlę dla pojedynczego zaktresu jestem w stanie zrobić i działa:

    Dim wrdFind As Find

    Dim wrdRng As Range

    Dim wrdDoc As Document

    Dim i As Integer

    Dim imie As Variant

    Dim ocena As Variant

    Dim wrdSearchFromat As Variant

    Set wrdDoc = Application.ActiveDocument

    Dim imie

    imie = Array("Tomasz", "Michał", "Anna", "Janusz", Wiktor")

    Dim ocena

    ocena = Array("bardzo źle", "źle", "średnio", "dobrze", "bardzo dobrze")

    For i = LBound(imie) To UBound(imie)

    Set wrdRng = wrdDoc.Content 
    
    Set wrdFind = wrdRng.Find 
    
    With wrdFind 
    
        .Text = imie(i) 
    
        .ClearFormatting 
    
        .MatchWildcards = True 
    
    End With 
    
    Do While wrdFind.Execute = True 
    
        wrdRng.Style = "wypunktowanie\_normal" 
    
    Loop 
    

    Next

    Ale nie mam pojęcia jak połączyć ze sobą 2 tablice jednocześnie i dodatkowo dać " - " między nimi :/ Próbowałem, ale w trybie Debug cały czas mi błędy wywala :/

    Czy ta odpowiedź była pomocna?

    Komentarze: 0 Brak komentarzy
  4. Oskar Shon 49,336 Punkty reputacji Moderator wolontariuszy
    2022-11-21T17:58:33+00:00

    Imiona do tablicy, oceny do drugiej i pętla na ten procedurce z podmianą danych z tablic.

    Spróbuj na razie sam.

    Pozdrawiam.

    Czy ta odpowiedź była pomocna?

    Komentarze: 0 Brak komentarzy