用宏调整“应用标题样式的标题”的间距

2025-11-19 16:47:41

1、正文

         我在配置标题样式时,设置标题样式时,为了有等级与层次感,将各标题的间距设置如下:

        标题1:段前、后20磅,2.4倍行距。

        标题2:段前、后17磅,1.7倍行距。

        标题3:段前、后8磅,1.7倍行距。

        效果,应用标题的各个章节是分开的,那么效果还是令人满意的。但是如果,如果应用标题的各个章节出现依次紧跟着出现的情况,则效果很难看,章节之间间距太大了。

用宏调整“应用标题样式的标题”的间距

2、        产生的原因,标题1、标题2之间的间距=标题1段后间距+标题2段前间距=37磅。

        标题2、标题3之间的间距=标题2段后间距+标题3段前间距=25磅。

        一个比较直接的想法,是将应用标题后的内容,手工修改下其“段落”中的段前与段后的格式。大致的修改思路如下:

        对下面先1、后2,只执行1种情况,执行完了就跳出。

       (1)、如果标题2紧跟着标题1,如果标题3紧跟着标题2,标题2的段前为0,标题3的段前为0。

       (2)、如果标题2紧跟着标题1,标题2的段前为0。

        考虑到以后,经常与Word打交道,这个东西经常用,希望软件自动执行上述的判断与修改的过程。我决定用宏代码来处理。

       下面选择比较关键的地方讲解下。

       关于段落i应用的样式的返回:ActiveDocument.Paragraphs(i).Style。

       难点:if语句判断上,我直接判断“段落应用的样式”是否等于”标题1”, 直接判断“段落应用的样式”是否等于wdStyleHeading1,代码不报错,但是,不会执行,好像这句判断永远不成立。

        问题原因(个人观点):ActiveDocument.Paragraphs(i).Style的返回值,是一个“Style”的“对象”的类型。普通的字符型的量是无法与它进行是否是相等的判断。总结下,数据类型不匹配,没法直接判断。

        解决方法:定义一个数据类型为Style的变量styleBase1:

        Dim styleBase1 As Style

        把标题1的对应的“Style”类型的量返回出来,并赋给styleBase1:

        Set styleBase1 = ActiveDocument.Styles("标题 1")。

        接着判断“段落i应用的样式”是否等于”标题1”:

        If ActiveDocument.Paragraphs(i).Style = styleBase1

就可以了。

        代码见文末附录

        使用该宏代码的效果

用宏调整“应用标题样式的标题”的间距

3、        一个小问题后期文档内容更新,再用宏时会不会重复作用?从而标题配置不是想要的?

        不会,因为我写宏时,是将多余的间距设置为0,重复运行时,多余的间距已经设置为0,不会再次修改。即之间用宏配置好的标题间距不会被修改了,只会修改文档更新内容中的标题。

1、附录

%===================================================

配置标题间距_最原始版:

%===================================================

Sub sc_cs()

Dim styleBase As Style

Set styleBase = ActiveDocument.Styles("标题 3")

'Set styleBase = ActiveDocument.Paragraphs(1).Style

For i = 1 To ActiveDocument.Paragraphs.Count

    If ActiveDocument.Paragraphs(i).Style = styleBase Then

        ActiveDocument.Paragraphs(i).Style = wdStyleNormal

        MsgBox "if 成功"

    Else: MsgBox "if不成立,未执行"

    End If

Next i

End Sub

%===================================================

配置标题间距_主体实现_局部优化的宏

%===================================================

Sub sc_cs()

Dim styleBase1 As Style

Dim styleBase2 As Style

Dim styleBase3 As Style

Set styleBase1 = ActiveDocument.Styles("标题 1")

Set styleBase2 = ActiveDocument.Styles("标题 2")

Set styleBase3 = ActiveDocument.Styles("标题 3")

'标题1段前设置为0;仅处理第一页的第一个标题,其它的不再处理。手工处理好了。

If ActiveDocument.Paragraphs(1).Style = styleBase1 Then

    ActiveDocument.Paragraphs(1).SpaceBefore = 0

End If

For i = 1 To ActiveDocument.Paragraphs.Count

     '段数是至少在倒数第二段之前时

     If ActiveDocument.Paragraphs.Count - i >= 2 Then

    

        'case1:标题1、2,3紧跟着的情况;

        If ActiveDocument.Paragraphs(i).Style = styleBase1 And _

        ActiveDocument.Paragraphs(i + 1).Style = styleBase2 And _

        ActiveDocument.Paragraphs(i + 2).Style = styleBase3 Then

           ActiveDocument.Paragraphs(i + 1).SpaceBefore = 0  '紧跟着的标题2段前设置为0;

           ActiveDocument.Paragraphs(i + 2).SpaceBefore = 0  '紧跟着的标题3段前设置为0;

                                     

         'case2:case1不成立,且出现标题1、2紧跟着的情况;

        ElseIf ActiveDocument.Paragraphs(i).Style = styleBase1 And _

        ActiveDocument.Paragraphs(i + 1).Style = styleBase2 Then

            ActiveDocument.Paragraphs(i + 1).SpaceBefore = 0  '紧跟着的标题2段前设置为0;

           

        'case3:case1、2不成立,且出现标题2、3紧跟着的情况;

        ElseIf ActiveDocument.Paragraphs(i).Style = styleBase2 And _

        ActiveDocument.Paragraphs(i + 1).Style = styleBase3 Then

            ActiveDocument.Paragraphs(i + 1).SpaceBefore = 0  '紧跟着的标题2段前设置为0;

                  

        End If     '对for内第二个总体的If结束

    End If     '对for内第一个总体的If结束

            

    '段数至少在最后一段之前时,更具体些,段数在倒数第二段,且标题1、2紧跟着的情况,

    '这种情况实际我用时,不会出现,没有意义。不再展开了。

Next i

End Sub

%===================================================

配置标题间距我参考帮助文档中的代码

%============================================================

Word 开发人员参考

Paragraph.Style 属性

返回或设置指定对象的样式。可读写 Variant 类型。

语法

表达式.Style

表达式   必选。一个代表 Paragraph 对象的变量。

说明

要设置该属性,请指定样式的本地名称、一个整数、一个 WdBuiltinStyle 常量或一个代表样式的对象。

示例

以下示例显示活动文档中各段的样式。

Visual Basic for Applications

For Each para in ActiveDocument.Paragraphs

    MsgBox para.Style

Next para

以下示例将活动文档中所有段落交替设置为“标题 3”和“正文”样式。

Visual Basic for Applications

For i = 1 To ActiveDocument.Paragraphs.Count

    If i Mod 2 = 0 Then

        ActiveDocument.Paragraphs(i).Style = wdStyleNormal

    Else: ActiveDocument.Paragraphs(i).Style = wdStyleHeading3

    End If

Next i

%============================================================

And 运算符示例

本示例使用 And 运算符来做两个表达式结果的逻辑合取(a logical conjunction)。

Dim A, B, C, D, MyCheck

A = 10: B = 8: C = 6: D = Null    ' 设置变量初值。

MyCheck = A > B And B > C    ' 返回 True。

MyCheck = B > A And B > C    ' 返回 False。

MyCheck = A > B And B > D    ' 返回 Null。

MyCheck = A And B    ' 返回 8(位比较的结果)。

%============================================================

Paragraphs.CloseUp 方法

清除指定段落前的段落间距。

语法

表达式.CloseUp

表达式   必选。一个代表 Paragraphs 集合的变量。

说明

以下两个语句是等价的:

Visual Basic for Applications

ActiveDocument.Paragraphs.CloseUp

ActiveDocument.Paragraphs.SpaceBefore = 0

%============================================================

Sub 宏1_sc()

'我自己录制的一个宏。

    Selection.MoveUp Unit:=wdLine, Count:=3

    Selection.HomeKey Unit:=wdLine, Extend:=wdExtend

    Selection.Style = ActiveDocument.Styles("标题 3")

    Selection.MoveDown Unit:=wdLine, Count:=1

    Selection.HomeKey Unit:=wdLine, Extend:=wdExtend

    Selection.Style = ActiveDocument.Styles("标题 3")

End Sub

%============================================================

本示例返回文档正文段落样式所用的基本样式。

Dim styleBase As Style

set styleBase = ActiveDocument.Styles(wdStyleBodyText).BaseStyle

MsgBox styleBase

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢