wtorek, 5 listopada 2013

Ograniczona ilość znaków w linii (MS Word)

Wyobraźmy sobie sytuację, że określonym dokumencie MS Word chcemy dokonać takiego podziału tekstu, aby w żadnej linii nie było więcej niż 30 znaków. Przykładowy paragraf, który pierwotnie wygląda następująco: 

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna. Nunc viverra imperdiet enim. Fusce est. 

chcemy automatycznie podzielić na następujące linie, z których żadna nie ma więcej niż 30 znaków: 

Lorem ipsum dolor sit amet,
consectetuer adipiscing elit.
Maecenas porttitor congue
massa. Fusce posuere, magna
sed pulvinar ultricies, purus
lectus malesuada libero, sit
amet commodo magna eros quis
urna. Nunc viverra imperdiet
enim. Fusce est.


Poniższe makro wykona za nas tą operację dla wszystkich paragrafów aktywnego dokumentu. Tym razem wszystkie uwagi, ciekawostki i założenia zostały omówione w postaci komentarzy wewnątrz kodu.

01Sub Rozwiązanie()
02    Dim PAR As Paragraph
03    
04    'zmienne pomocnicze odpowiedzialne za
05    'kontrolę długości poszczególnych fragmentów
06    'tekstu dokumentu
07    Dim znakPAR&, startPAR&, i&, znakCEL&
08    
09        'dla każdego paragrafu dokumentu
10        For Each PAR In ActiveDocument.Paragraphs
11            
12            'określamy długość paragrafu, jego punkt początkowy,
13            'ilość znaków w linii (tu: 30)
14            znakPAR = PAR.Range.Characters.Count
15            startPAR = PAR.Range.Start
16            znakCEL = 30
17        
18        'dalsza procedura ma sens o ile długość paragrafu
19        'jest większa od limitu długości linii
20        If znakPAR > znakCEL Then
21          
22          For i = (startPAR + znakCEL) To (startPAR + znakPAR) Step znakCEL
23            'sprawdzamy czy znak podziału nie wypada w środku wyrazu
24            If Len(Trim(ActiveDocument.Range(i - 1, i + 1).Text)) < 2 Then
25                
26                'jeżeli nie to wstawiamy miękki znak podziału
27                'sprawdziwszy gdzie jest pusta spacja
28                If ActiveDocument.Range(i - 1, i) = " " Then
29                    ActiveDocument.Range(i, i).InsertBefore Chr(11)
30                Else
31                    ActiveDocument.Range(i + 1, i + 1).InsertAfter Chr(11)
32                End If
33                
34            Else
35                'jeżeli podział miałby nastąpić w środku wyrazu to
36                'przesuwamy się na początek tegoż i wstawiamy przejście
37                'do nowej linii
38                ActiveDocument.Range(i, i).Select
39                Selection.MoveLeft wdWord
40                Selection.InsertBefore Chr(11)
41                i = Selection.Start
42            End If
43            
44          Next
45        End If
46        Next
47End Sub

Brak komentarzy:

Prześlij komentarz