ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-1 20:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
顶一下。。

TA的精华主题

TA的得分主题

发表于 2022-10-2 12:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
效果很好,楼主辛苦了!
您看看下面这个要不要考虑分成两排?另为颜色保持不变是不是好点?
选项对齐.PNG

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-2 12:50 | 显示全部楼层
你好!你图片中所示的结果,是用 1 楼最新宏代码运算出来的结果吗?在我的 Word2019 中是正常的。

TA的精华主题

TA的得分主题

发表于 2022-10-2 13:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
413191246se 发表于 2022-10-2 12:50
你好!你图片中所示的结果,是用 1 楼最新宏代码运算出来的结果吗?在我的 Word2019 中是正常的。

你好!是的,我的是office 2016。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-2 20:05 | 显示全部楼层
扬帆 朋友,你好! 一是请重新再试试;二是如果有条件,换一台电脑换一个 Word 版本 试试。
因为,我的宏都是在 Word 2019 中反复测试后才上传的,在我这里效果很好。

TA的精华主题

TA的得分主题

发表于 2022-10-3 00:08 | 显示全部楼层
结合楼主与tangqingfu兄的附件文档试写了个宏,只做了简单测试。对中英文字符只做了简单判断,有5个与6个选项的情形不作处理。假设段落与字符格式常规。
  1. Sub test()
  2.     Dim i%, n%, wid!
  3.     Dim myRange As Range
  4.     Dim oRange As Range
  5.    
  6.     With ActiveDocument.PageSetup
  7.         wid = .PageWidth - .LeftMargin - .RightMargin - .Gutter
  8.     End With
  9.    
  10.     With ActiveDocument.Content.Find
  11.         .Text = "[^13^s^t.  ][A-F][..]"
  12.         .MatchWildcards = True
  13.         Do While .Execute
  14.             With .Parent
  15.                 Set oRange = .Duplicate
  16.                 If .Characters(2) = "A" Then
  17.                     Set oRange = .Duplicate
  18.                     If myRange Is Nothing Then
  19.                         Set myRange = oRange.Characters(2)
  20.                     Else
  21.                         myRange.End = .Start
  22.                         myRange.End = FindLastOption(myRange.Duplicate).End
  23.                         OptionsSetting i, wid, myRange
  24.                         Set myRange = oRange.Characters(2)
  25.                     End If
  26.                     i = 0
  27.                     n = n + 1
  28.                 End If
  29.             End With
  30.             i = i + 1
  31.         Loop
  32.         myRange.End = oRange.End
  33.         myRange.End = FindLastOption(myRange.Duplicate).End
  34.         OptionsSetting i, wid, myRange
  35.     End With
  36.     MsgBox "共处理了" & n & "题。"
  37. End Sub

  38. Function FindLastOption(aRange As Range) As Range
  39.     With aRange.Find
  40.         .Text = "[^13^s^t  ][B-F][..]"
  41.         .MatchWildcards = True
  42.         .Forward = False
  43.         If .Execute Then
  44.             Set FindLastOption = .Parent
  45.             FindLastOption.EndOf wdParagraph, 1
  46.         Else
  47.             MsgBox "异常选项!请检查文档内容"
  48.         End If
  49.     End With
  50. End Function

  51. Sub OptionsSetting(i As Integer, wid As Single, aRange As Range)
  52.     Dim n%, s%, t%, st&, aIndent!, pos!, info$()
  53.     Dim TF As Boolean
  54.     Dim Reg As Object
  55.     Dim Match As Object
  56.    
  57.     With aRange.Paragraphs.First
  58.         aIndent = .LeftIndent + .FirstLineIndent
  59.     End With
  60.     Set Reg = CreateObject("VBScript.RegExp")
  61.     With Reg
  62.         .Global = True
  63.         .MultiLine = True
  64.         .Pattern = "(\b[A-F][..][^\r]+?)[\s ]*?(?=[A-F][..]|$)"
  65.         For Each Match In .Execute(aRange.Text)
  66.             ReDim Preserve info(n)
  67.             info(n) = Match.submatches(0)
  68.             If Len(info(n)) > s Then s = Len(info(n))
  69.             n = n + 1
  70.         Next
  71.     End With
  72.    
  73.     Application.ScreenUpdating = False
  74.     With aRange
  75.         .End = .End - 1
  76.         st = .Start - .Paragraphs(1).Range.Start
  77.         If st > 0 Then aIndent = aIndent + st * .Font.Size
  78.         Reg.Pattern = "[\u4e00-\u9fa5]"
  79.         If Reg.test(.Text) Then TF = True
  80.         If TF = True Then t = 1 Else t = 2
  81.         .ParagraphFormat.TabStops.ClearAll
  82.         Select Case i
  83.         Case 4
  84.             If (wid - aIndent) / 4 * t > (s + 1) * .Font.Size Then
  85.                 pos = (wid - aIndent) / 4
  86.                 For n = 1 To 3
  87.                     .ParagraphFormat.TabStops.Add pos * n + aIndent
  88.                 Next
  89.                 .Text = Join(info, vbTab)
  90.             ElseIf (wid - aIndent) / 2 * t > (s + 1) * .Font.Size Then
  91.                 pos = (wid - aIndent) / 2 + .Font.Size
  92.                 For n = 1 To 2
  93.                     .ParagraphFormat.TabStops.Add pos * n + aIndent
  94.                 Next
  95.                 .Text = Join(info, vbTab)
  96.                 Reg.Pattern = "(\t[^\t]+)\t([\w\W]+$)"
  97.                 .Text = Reg.Replace(.Text, "$1" & Chr(13) & "$2")
  98.                 If st > 0 Then .Paragraphs(2).Range.InsertBefore String(st, .Paragraphs(1).Range.Characters(1))
  99.             End If
  100.         Case 3
  101.             If (wid - aIndent) / 3 * t > (s + 1) * .Font.Size Then
  102.                 pos = (wid - aIndent) / 3
  103.                 For n = 1 To 2
  104.                     .ParagraphFormat.TabStops.Add pos * n + aIndent
  105.                 Next
  106.                 .Text = Join(info, vbTab)
  107.             ElseIf (wid - aIndent) / 2 * t > (s + 1) * .Font.Size Then
  108.                 pos = (wid - aIndent) / 2 + .Font.Size
  109.                 .ParagraphFormat.TabStops.Add pos + aIndent
  110.                 .Text = Join(info, vbTab)
  111.                 Reg.Pattern = "(\t[^\t]+)\t([\w\W]+$)"
  112.                 .Text = Reg.Replace(.Text, "$1" & Chr(13) & "$2")
  113.                 If st > 0 Then .Paragraphs(2).Range.InsertBefore String(st, .Paragraphs(1).Range.Characters(1))
  114.             End If
  115.         Case 2
  116.             If (wid - aIndent) / 2 * t > (s + 1) * .Font.Size Then
  117.                 pos = (wid - aIndent) / 2
  118.                 .ParagraphFormat.TabStops.Add pos * n + aIndent
  119.                 .Text = Join(info, vbTab)
  120.             End If
  121.         Case Else
  122.             '5、6个选项时自定义(略)
  123.         End Select
  124.         .HighlightColorIndex = wdYellow
  125.         TF = False
  126.     End With
  127.     Application.ScreenUpdating = True
  128. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-3 11:14 | 显示全部楼层
* sylun 兄:多谢!辛苦!你的代码很高深,我看得一知半解的。正则、函数 都不懂。
* 针对测试结果,不好意思,我觉得有必要提一提。
* 当选项为 2 行时,应该与 1 行时的选项对齐,B 与 C 对齐。
* 还有,兄上次给 相见是缘8 朋友写的代码,里面有 .screenupdating 语句,我前几天测试时(因为我给他添加了 宏运行时间 语句),也没好好看,直接就运行了好几次。昨天晚上,看到 兄 的代码,发现有 .screenupdating 语句,可吓坏我了!我不敢用这条语句,怕的就是万一程序运行到半道出差错了,显示器会不会搞坏?就是 false 这种情况设置了,结果半道出错,没有及时 true,显示器会不会有问题?——所以,我一直不敢用 .screenupdating 屏幕刷新 这两句代码。兄 可否给我解释一下会不会有问题?
* 兄 的代码高级,无可挑剔!但最近我喜欢小代码,感觉 兄 的代码太多了,超我一倍。可否请 兄 试用一下我 1 楼的代码?是我前几天最新更新的。
* 下面是 兄 的代码 与我的代码分别测试后的对比情况:(请注意看 BD 与 C 的对齐情况)。
   不过,我觉得判断制表位的位置数据,我的不一定对,可能是 兄 的更对;但表面看起来,似乎我的处理结果更好看。
vspic.gif

TA的精华主题

TA的得分主题

发表于 2022-10-4 12:22 | 显示全部楼层
早上查看了我的代码,确实存在问题:是对一行两个选项的情形时制表位值多加了一个字符的长度,即原第93行和110行代码应改为:pos = (wid - aIndent) / 2
另外,该种情形只需加一个自定义制表位即可,第二个是多余的。

总的说来,1.我的制表位参数依据是文档的版心宽度减去左边缩进值(以空格作缩进也算,忽略右缩进及节格式页边距差异);2.每题以其中有效最多字符的选项为判断选项排列依据;3.处理时不修改原段落的缩进格式,但其中的个别特殊文本格式不会保留;4.如果各选项均没有中文字符,字符宽度按半角字符减半计算;5.根据每题选项数及其有效字符长度进行相应排列设置(暂处理2到4个的)。
因处理方式不同,se兄的代码确实短很多,一般情况下可行。对有的情形,如各选项的字符长度差别太大,可能导致以段落自然行数为选项排列唯一判断标准出现误差。因段落自定义制表位只有三个,之后的制表符只对齐默认制表位即可。另外,如果需要磅值与厘米的度量单位转换,可用PointsToCentimeters或CentimetersToPoints方法获得。
至于ScreenUpdating属性设置问题,一般用于需要实际修改word文档内容或格式等情形,以提高程序运行速度。楼主可以亲自测试的,比如在每次运行本宏前添加一句显示该属性性,看看是不是一样,不管中途是否改变过其属性值。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-4 19:40 | 显示全部楼层
* sylun 兄:我用表格填充版心再减去两个 0.19 厘米(想起过去《表格处理》宏里面的 .padding=0.19)得到当前版心宽度,就是怕遇到分栏时计算的烦琐(图省事)。
* 前些天,我也编了一个儿能处理 2、3、4、5 个选项的宏;然而,前几天,我觉得平时大家并不怎么处理有这些选项的试卷,代码大而无用,我就将其重新编写为仅处理四个选项的宏,这个比较常用,代码量大大减少。
* 今天上午,我重新就一篇示例文档,重新探究公文自动排版,测试时间是 0.22 秒(未完善)。平时,这篇文档正常都是 0.63/0.67/1.02 秒等处理完毕。我在想,各个标题编号是否需要自动编号?如果不自动编号,会不会减少不少时间?我现在想减少过度排版。
* 我的代码,兄 是否观看了?可能不会有一个宏被 兄 看好吧?水平太低了。大多数是我自编的,都是基本 VBA 代码,不少是在录制宏的基础上修改的。

TA的精华主题

TA的得分主题

发表于 2022-10-4 21:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 tangqingfu 于 2022-10-4 21:38 编辑
sylun 发表于 2022-10-3 00:08
结合楼主与tangqingfu兄的附件文档试写了个宏,只做了简单测试。对中英文字符只做了简单判断,有5个与6个选 ...

sylun兄,用您的代码测试附件的文档,好像效果不好,是不是我操作不对
2022-10-04_21-31-48.png

test.rar

597.95 KB, 下载次数: 6

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 03:51 , Processed in 0.041409 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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