вторник, 23 декабря 2008 г.

Использование макросов в Word

Существует множество ресурсов в сети, на которых обсуждается создание и применение макросов в Word. Конечно, я не собираюсь их обгонять и вообще как либо с ними соревноваться. В этом блоге я буду размещать свои макросы и наработки по работе с ними.
Приступим.
1 Sub ВзятьВКавычки()
2 With Selection
3 If Right(.Text, 1) = Chr(32) Or _
4 Right(.Text, 1) = Chr(13) Then
5 .MoveLeft wdCharacter, 1, wdExtend
6 End If
7 If .Text <> "" Then
8 .InsertAfter "»"
9 .InsertBefore "«"
10 End If
11 End With
12 End Sub


1 Sub СделатьРимскойЦифрой()
2 Dim a As String
3 With Selection
4 .MoveLeft Unit:=wdWord, Count:=1, Extend:=wdWord
5 a = Trim(.Text)
6 .Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
7 divserveFormatting:=False, Text:="= " + a + " \*ROMAN"
8 .MoveLeft Unit:=wdWord, Count:=1, Extend:=wdWord
9 a = Trim(.Text)
10 .TypeText a & " "
11 End With
12 End Sub


Усовершенствованный макрос находится здесь
1 Sub Формула_с_нумерацией()
2 With Selection.ParagraphFormat
3 .SpaceBeforeAuto = False
4 .SpaceAfterAuto = False
5 .FirstLineIndent = CentimetersToPoints(0)
6 End With
7 With Selection
8 .ParagraphFormat.TabStops.ClearAll
9 .ParagraphFormat.TabStops.Add Position:=(ActiveDocument.PageSetup.PageWidth - ActiveDocument.PageSetup.LeftMargin - ActiveDocument.PageSetup.RightMargin) / 2 _
10 , Alignment:=wdAlignTabCenter, Leader:=wdTabLeaderSpaces
11 .ParagraphFormat.TabStops.Add Position:=(ActiveDocument.PageSetup.PageWidth - ActiveDocument.PageSetup.LeftMargin - ActiveDocument.PageSetup.RightMargin) _
12 , Alignment:=wdAlignTabRight, Leader:=wdTabLeaderSpaces
13 .TypeText Text:=vbTab
14 .InsertStyleSeparator
15 .TypeBackspace
16 .TypeText Text:=vbTab & "("
17 .InsertCaption Label:="Формула", TitleAutoText:="InsertCaption1", _
18 Title:="", Position:=wdCaptionPositionAbove, ExcludeLabel:=1
19 .TypeText Text:=")"
20 .MoveLeft Unit:=wdWord, Count:=5
21 .InlineShapes.AddOLEObject ClassType:="Equation.3", LinkToFile:= _
22 False, DisplayAsIcon:=False
23 End With
24 End Sub

1 комментарий:

  1. If Right(.Text, 1) = Chr(32) Or _
    Right(.Text, 1) = Chr(13) Then

    1. Такая запись ухудшает самодокументацию кода, и требует лишнего вызова Chr. Chr(13)=vbCr; Chr(32)=" " (что я лично люблю больше чем константу делать) или Const cSpace as string = " " .
    2. Если длинную инструкцию разбиваешь на несколько строк, то лучше начинать перенесённое с оператора или разделителя.

    Итого:

    If Right(.Text, 1) = " " _
    Or Right(.Text, 1) = vbCr Then

    3. От Selection отцепляйся всегда, как можно скорее! В случае ошибки или появления модального окна или активации другого документа (мышкой клик прошёл), selection может слететь, а это с ~50% вероятностью приведёт к зависанию всего Word'а.

    4. Использование {selection или что-то аналогичное}.MoveXXX плохой стиль, т.к. меняет положение каретки. Или возвращай каретку наместо или по другому делай.

    ОтветитьУдалить