ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6154|回复: 6

[求助] 求助word排版中的选项对齐

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-3-27 17:54 | 显示全部楼层 |阅读模式
试问在此文档中如何利用“查找与替换”方式实现各小题中的A、B、C、D四个选项都能上下对齐?

桌面.rar

7.98 KB, 下载次数: 68

TA的精华主题

TA的得分主题

发表于 2009-3-27 18:07 | 显示全部楼层
请利用制表符对齐:
参考
http://club.excelhome.net/viewth ... ngqingfu&page=2
16楼的方法
守版的VBA代码如下:
Sub 选项对齐之四个选项()
'基于选定内容的查找与替换
    Dim myFind() As Variant, myReplace As String
    Dim aArray As Variant, mySet As String, N As Integer, M As Integer
    Dim myRange As Range, myBk As Bookmark
    myFind = Array("A", "B", "C", "D", "A", "B", "C", "D")
    If Selection.Type = wdSelectionIP Then Exit Sub
    Application.ScreenUpdating = False
    Set myBk = ActiveDocument.Bookmarks.Add(Name:="Temp", Range:=Selection.Range)
    With myBk.Range
        '删除段落的首行缩进\左缩进和右缩进
        With .ParagraphFormat
            .CharacterUnitLeftIndent = 0    '如果不想要运行绿色的这几行代码,请在代码前面添加'
            .CharacterUnitRightIndent = 0
            .CharacterUnitFirstLineIndent = 0
            .LeftIndent = CentimetersToPoints(0)
            .RightIndent = CentimetersToPoints(0)
            .FirstLineIndent = CentimetersToPoints(0)
            .TabStops.ClearAll    '清除文档中所有制表位
            .Space1    '单倍行距
        End With
        '设置字体字号
        With .Font
            .NameFarEast = "宋体"
            .NameAscii = "Times New Roman"
            .NameOther = "Times New Roman"
            .Name = ""
            .Size = 10.5
        End With
        '先删除文档中所有制表符
        With .Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Wrap = wdFindStop
            .MatchWildcards = False
            .Execute findtext:="^t", replacewith:="", Replace:=wdReplaceAll
        End With
        '删除文档中所有非下划线的非英文后的一个或者多个全角\半角空格,包括段前空格\括号间空格
        With .Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = "([!a-zA-Z])[  " & ChrW(160) & "]{1,}"
            .MatchWildcards = True
            .Wrap = wdFindStop
            .Font.Underline = False
            .Execute replacewith:="\1", Replace:=wdReplaceAll
        End With
        '将连续5个中文字符以上段落的行距设置为20磅固定行距,可视具体情况更改之
        With .Find
            .ClearFormatting
            .Format = True
            .Replacement.ClearFormatting
            .Replacement.ParagraphFormat.LineSpacingRule = wdLineSpaceExactly
            .Replacement.ParagraphFormat.LineSpacing = 20
            .MatchWildcards = True
            .Wrap = wdFindStop
            .Text = "[一-龥]{5,}"
            .Execute replacewith:="", Replace:=wdReplaceAll
        End With
        '以下查找与替换设置制表位,使选项对齐,此替换维持原有选项样式
        With .Find
            .ClearFormatting
            With .Replacement
                .ClearFormatting
                .ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(0.63)
                .ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(4.03)
                .ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(7.43)
                .ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(10.83)
            End With
            .Text = "[A-DA-D][.、.]"
            .Replacement.Text = "^t^&"
            .Wrap = wdFindStop
            .Format = True
            .MatchWildcards = True
            .Execute Replace:=wdReplaceAll
        End With
        '针对AB和CD选项为两个段落的情况,重设制表位(删除4.03cm)
        Set myRange = myBk.Range
NR1:         With myRange.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = "A[.、.][!^13]@B[.、.][!^13]@^13^tC[.、.]*D[.、.]*^13"
            .MatchWildcards = True
            Do While .Execute
                With myRange
                    .ParagraphFormat.TabStops.ClearAll
                    .ParagraphFormat.TabStops.Add CentimetersToPoints(0.63)
                    .ParagraphFormat.TabStops.Add CentimetersToPoints(7.43)
                    .SetRange .End, myBk.Range.End
                    GoTo NR1
                End With
            Loop
        End With
        '规避查找中的过于复杂的表达式
        Set myRange = myBk.Range
NR2:         With myRange.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = "A[.、.][!^13]@B[.、.][!^13]@^13^tC[.、.]*D[.、.]*^13"
            .MatchWildcards = True
            Do While .Execute
                With myRange
                    .ParagraphFormat.TabStops.ClearAll
                    .ParagraphFormat.TabStops.Add CentimetersToPoints(0.63)
                    .ParagraphFormat.TabStops.Add CentimetersToPoints(7.43)
                    .SetRange .End, myBk.Range.End
                    GoTo NR2
                End With
            Loop
        End With
        '进行中英文括号替换,中间加入一个制表符
        With .Find
            .ClearFormatting
            .Replacement.ClearFormatting
            '            .Replacement.ParagraphFormat.TabStops.ClearAll
            '            .Replacement.Font.Spacing = 12
            .MatchWildcards = True
            '替换为带有两个全角空格的西文括号
            '            .Execute findtext:="[\((][\))]", replacewith:="(" & vbTab & ")", Replace:=wdReplaceAll
            .Execute findtext:="[\((][\))]", replacewith:="(^32^32^32) ", Replace:=wdReplaceAll
        End With
        With .ParagraphFormat
            .LineUnitBefore = 0
            .LineUnitAfter = 0
            .SpaceBefore = 0
            .SpaceAfter = 0
            .SpaceBeforeAuto = False
            .SpaceAfterAuto = False
        End With
        '更改或者统一文档选项样式
        mySet = VBA.InputBox(Prompt:="请选择选项样式,1为'A.',2为'A.',3为 'A、',单击取消退出替换!", Title:="选项样式设置", Default:=1)
        Select Case mySet
        Case ""
            myBk.Delete
            Exit Sub
        Case 1
            myReplace = ". "    '"[A-D]."还一个半角空格,防止拼写检查错误
            N = 64
        Case 2
            myReplace = "."    '"[A-D]."
            N = 64           '如果要替换为ABCD的样式,则N=-23616
        Case 3
            myReplace = "、"    '"[A-D]、"
            N = 64
        Case Else
            myReplace = aArray
            If aArray = "[A-D]." Then
                N = -23616
            Else
                N = 64
            End If
        End Select
        For Each aArray In myFind
            M = M + 1
            If M = 5 Then M = 1
            '            Debug.Print VBA.Chr(M + N) & myReplace
            With .Find
                .ClearFormatting
                .Replacement.ClearFormatting
                .MatchWildcards = True
                .Wrap = wdFindStop
                .Execute findtext:=aArray & "[.、.]", replacewith:=VBA.Chr(M + N) & myReplace, Replace:=wdReplaceAll
            End With
        Next
        myBk.Delete
    End With
    Application.ScreenUpdating = True
End Sub

效果.rar

5 KB, 下载次数: 79

TA的精华主题

TA的得分主题

发表于 2009-3-27 18:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
此问题我已为楼主解决。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-27 21:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-9-13 16:44 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-1-12 13:29 | 显示全部楼层
守柔版主的代码一定要学习的

TA的精华主题

TA的得分主题

发表于 2017-1-12 13:52 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-13 10:42 , Processed in 0.022749 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表