poniedziałek, 21 września 2015

Jak wyrównać tekst w kształtach Shape

Pomysł na niniejszy wpis powstał po przeczytaniu pytania i kilku odpowiedzi w serwisie StackOverflow. Postawione pytanie było proste lecz tu przedstawię je w zmodyfikowanej i bardziej rozbudowanej formie- jak uzyskać efekt, w którym poszczególne paragrafy w kształcie są naprzemiennie wyrównane do prawej i lewej strony (zgodnie z tym co prezentuje poniższy przykładowy obrazek)?

Oto prosty kod realizujący zadanie wraz z kilkoma komentarzami:

01Sub AlignParagraphs_In_Shape()
02 
03    'definiujemy ksztalt...
04    Dim SHP As Shape
05    Set SHP = ActiveSheet.Shapes(1)
06 
07    '...i istotny jego wewnętrzny obiekt
08    'powiązany z warstwą tekstową kształtu
09    Dim txtRNG2 As TextRange2
10    Set txtRNG2 = SHP.TextFrame2.TextRange
11 
12    'w pętli dokonujemy naprzemiennego wyrównania do lewej lub prawej
13    Dim i As Byte
14    With txtRNG2
15        For i = 1 To .Paragraphs.Count
16             
17            'wyrównanie osobno dla paragrafów parzystych i nieparzystych
18            If i Mod 2 Then
19                .Paragraphs(i).ParagraphFormat.Alignment = msoAlignRight
20            Else
21                .Paragraphs(i).ParagraphFormat.Alignment = msoAlignLeft
22            End If
23             
24        Next i
25    End With
26 
27End Sub

środa, 2 września 2015

Microsoft Word- zamiana tekstu na obiekt ContentControl (lub inny)

Operacja do wykonania wydaje się być prosta- określone wystąpienie tekstu w dokumencie chcemy zamienić nie na inny tekst lecz na…obiekt. Pierwsza myśl to często- 'jaki jest symbol specjalny dla danego obiektu?'. W istocie, w metodzie .Find możemy zastosować znaki specjalne (Wildcards) w celu wyszukiwania i podmiany tekstu. Tutaj zastosujemy jednak inne i jednocześnie bardzo proste rozwiązanie- w miejscu wyszukanego tekstu po prostu wstawimy (dodamy) interesujący nas obiekt (w przykładzie będzie to ContentControl). Oto przykład wraz z dodatkowymi komentarzami.
01Sub Zamien_tekst_na_ContentControl()
02 
03    'standardowa procedura definicji wyszukiwania
04    Selection.Find.ClearFormatting
05    Selection.Find.Replacement.ClearFormatting
06 
07    With Selection.Find
08    'definiujemy wyszukiwany tekst
09        .Text = "tekst do wyszukania"
10        '.Replacement.Text = … linię dot. zastępowania całkowicie pomijamy
11        .Forward = True
12        .Wrap = wdFindContinue
13        .Format = True
14        .MatchCase = False
15        .MatchWholeWord = False
16        .MatchWildcards = False
17        .MatchSoundsLike = False
18        .MatchAllWordForms = False
19    End With
20 
21    ' w pętli odnajdujemy wszystkie wystąpienia wyszukiwanego tektsu
22    Do While Selection.Find.Execute
23 
24        'wariant A) jeżeli chcemy podmienić tekst na
25            'pusty ContentControl kod pozostaje bez zmian
26        'wariant B) jeżeli chcemy wstawić ContentControl
27            'wokół tekstu należy wykomentować poniższą linię   
28        Selection.Text = ""
29        Selection.Range.ContentControls.Add (wdContentControlRichText)
30 
31    Loop
32End Sub