ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 选项对齐(宏)最新更新 2022-10-01

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-9-17 12:34 | 显示全部楼层 |阅读模式
本帖最后由 413191246se 于 2022-10-1 20:56 编辑

* 在学习 tangqingfu 兄的《Word查找和替换的实例和方法》的帖子时,浏览到了另一个《选项对齐》的帖子。前一段我也写了此宏,方法是文本转表格、表格再转文本;又观 守柔版主(顾问)并未用表格,而我用表格实在是下策,速度必然慢。后来,又反复录制设置、清除制表位的宏,略有心得,遂从昨晚直到现在,终于完成此宏的试用版,希望能给需要的朋友们带来方便(英文过程名可以自行改为中文过程名)。
* 为精简代码,仅针对 ABCD 四个选项,用制表位分隔,速度较快,结果还算差强人意,敬请各位朋友们试用,谢谢!
* 祝论坛各位朋友——国庆节快乐!
* 示例文档: OptionAlignDemo.rar (11.5 KB, 下载次数: 50)
  1. Sub OptionAlign()
  2. '选项对齐
  3.     Dim t As Table, i As Paragraph, lenTable!, oTab!, Tab1!, Tab2!, Tab3!

  4.     With ActiveDocument
  5.         .Tables.Add .Range(0, 0), 1, 1
  6.         lenTable = Round(.Tables(1).Cell(1, 1).Width / 28.35, 2)
  7.         .Tables(1).Delete
  8.         'cm=char/2.7
  9.         oTab = (Int((lenTable - 2 * 0.19) * 2.7 + 0.5) - 2) / 4
  10.         Tab1 = Round((2 + 1 * oTab) / 2.7, 2)
  11.         Tab2 = Round((2 + 2 * oTab) / 2.7, 2)
  12.         Tab3 = Round((2 + 3 * oTab) / 2.7, 2)

  13.         .Content.Find.Execute "^l", , , 0, , , , , , "^p", 2

  14.         For Each t In .Tables
  15.             With t.Range.Rows
  16.                 .WrapAroundText = False
  17.                 .Alignment = wdAlignRowCenter
  18.             End With
  19.         Next

  20.         With .Content.Find
  21.             .Execute "(^13)([  ^s^t]{1,})", , , 1, , , , , , "\1", 2
  22.             .Execute "([  ^s^t]{1,})(^13)", , , 1, , , , , , "\2", 2
  23.             .Execute "([A-D])[.、]", , , 1, , , , , , "\1.", 2
  24.             .Execute "([  ^s^t^13]{1,})([B-D].)", , , 1, , , , , , "^t\2", 2
  25.             .Execute "(^13)([0-9]{1,})[.、]", , , 1, , , , , , "\1\2.", 2
  26.         End With

  27.         For Each i In .Paragraphs
  28.             With i.Range
  29.                 If Not .Information(12) Then
  30.                     If .Text Like "A.*" Then
  31.                         .Font.Color = wdColorRed

  32.                         With .ParagraphFormat.TabStops
  33.                             .ClearAll
  34.                             .Add Position:=CentimetersToPoints(Tab1)
  35.                             .Add Position:=CentimetersToPoints(Tab2)
  36.                             .Add Position:=CentimetersToPoints(Tab3)
  37.                         End With

  38.                         If .ComputeStatistics(1) = 2 Then
  39.                             .Find.Execute "^t(C.)", , , 1, , , , , , "^p\1", 2
  40.                             With .ParagraphFormat.TabStops
  41.                                 .ClearAll
  42.                                 .Add Position:=CentimetersToPoints(Tab2)
  43.                             End With
  44.                         ElseIf .ComputeStatistics(1) >= 3 Then
  45.                             .Find.Execute "^t([B-D].)", , , 1, , , , , , "^p\1", 2
  46.                         End If

  47.                         With .ParagraphFormat
  48.                             .CharacterUnitFirstLineIndent = 0
  49.                             .FirstLineIndent = CentimetersToPoints(0)
  50.                             .CharacterUnitFirstLineIndent = 2
  51.                         End With
  52.                     End If
  53.                 End If
  54.             End With
  55.         Next
  56.     End With
  57. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-9-18 23:48 | 显示全部楼层
顶。。。。

TA的精华主题

TA的得分主题

发表于 2022-9-20 14:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
413191246se兄,测试下,发现选项2行的,选项C没能选项A对齐,选项4行的,选项B、C、D没能和选项A对齐。
不知能否实现根据选项内容长短(以选项中内容最长的文本为判断标准),智能判断选项是分一行、还是两行,或者是四行显示 ,进行重新排版?

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-9-20 19:12 | 显示全部楼层
唐兄:你好!——我的宏自认为是智能判断的,当然算法比较简单。不知你是不是用我提供的范文,还是另外自己提供的文本。还有,如果正文字体太大(如三号字),可能有对不齐的情况。我觉得正文最好是四号、小四、五号这几种较小字号才好看。也许有个别的选项段落是对不齐的,大多数是对齐的(唐兄 方便的话可以提供另外的文本或截图上来,因为,宏是我反复测试无误后才上传的)。

TA的精华主题

TA的得分主题

发表于 2022-9-21 06:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
413191246se 发表于 2022-9-20 19:12
唐兄:你好!——我的宏自认为是智能判断的,当然算法比较简单。不知你是不是用我提供的范文,还是另外自己 ...

比如第2题和第5题
2022-09-21_06-39-26.png

TA的精华主题

TA的得分主题

发表于 2022-9-21 06:47 | 显示全部楼层
第8题能否智能替换成2行的选项,如果像第7题这样的选项是分4行显示,能否智能替换成1行显示?
2022-09-21_06-44-32.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-9-21 08:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
* 唐兄:我和 sylun 兄 都是使用 Win10x64+Office2019 系统,在我的 Word 2019 中,《选项对齐》宏能完美排版。不知你的电脑是什么系统?
* 究其原因,之所以出现问题,是因为各个 Word 版本之间有细微的差别,主要表现在样式设置上。
* 制表位,我代码中都是先清除,再设置。还是水平较低,未做到位,认识不深。
* 唐兄,我请你先试试一个过渡(临时应付)的办法。假设该试卷中没有表格,你先 全选,再 新建文档,再 选择性粘贴,以纯文本格式粘贴,再试试此宏,看看是否正常了(2题、5题、8题)?
* 还有,第7题、第8题,你说是否能智能变为一行?如果想这么做的话,也是能做到的,以空格填充就行了。但是,这么做,就不规范了。因为,判断 ABCD 能否在一行中,是靠代码智能判断的,是依靠制表位的。AB一行,CD一行,但 B、D 都是大约在中间的,是制表位限制的。比如,A选项比较长,B选项比较短, A、B 可以靠空格维持在一行中,但这与制表位不符(填充空格会比较麻烦,不如制表位瞬间设置完毕)。当然,现在还没完全搞清制表位的清除。——所以,我的宏暂时算是 试用版 吧!
* 请暂时先将文本全选,复制,并以 纯文本格式 粘贴到 新建文档 中,试用此宏。。。

TA的精华主题

TA的得分主题

发表于 2022-9-21 11:54 | 显示全部楼层
我的想法是能否根据选项内容长短智能分行,以各选项中内容最长的文本为准,智能判断选项是分一行、还是两行,或者是四行。
我使用 Win10 x64+Office2016 系统

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-9-21 12:20 | 显示全部楼层
唐兄 的意思是,不管 B D 是否对齐,只要两个选项能放在一行就放一行?(不管制表位的美观了?)

TA的精华主题

TA的得分主题

发表于 2022-9-21 14:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
413191246se 发表于 2022-9-21 12:20
唐兄 的意思是,不管 B D 是否对齐,只要两个选项能放在一行就放一行?(不管制表位的美观了?)

刚才认真测试,发现413191246se兄可以实现我说的效果
2022-09-21_14-14-06.png
2022-09-21_14-17-16.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 10:30 , Processed in 0.047351 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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