ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 写了段word文档数学公式自动编号的代码,欢迎测试

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-1-6 17:11 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 liujunwei4321 于 2014-1-9 15:55 编辑

我这两天不干正事,受守柔的《word文档规范助理使用文档》中有关内容的启发,也写了一个小程序,可以实现对公式的自动编号,编号后的公式可以交叉引用,由于使用域对公式编号,删除部分公式后,不会影响公式编号的正确性。

要求:需要编号的公式单独占一行,编号前公式前允许有空格(编号后会删除空格),后面允许有一个标点(限 , . ; :这四个)及空格tab等。
Copy of equationAdd.rar (88.89 KB, 下载次数: 62)




说明:本人是菜鸟(如果你想看代码就知道了),欢迎大家试用并提出意见或建议,如果你能优化更好了,希望顺便也发我一个优化后的。

更新: 1. 程序运行时,禁止屏幕刷新;(Thanks to zhanglei1371           
           2. 修改兼容Word 2003;(Thanks to zhanglei1371
           3. 修改行间公式判断算法(改成正则表达式判断);(Thanks to my high school deskmate J.L. Ma.)
           4. 添加判断如果公式所在段落已存在样式分隔符,则不再对公式编号;
           5. 添加3个标签标注制表符位置;
           6. 修正公式引用时会同时引用公式本身的错误(使用样式分隔符);
           7. 修正引导符号有时错误的bug。

程序中有用到两个function。GetParNum:得到光标所在处的段落是第几段(借用的);RE6:使用正则表达式(也是借用的)。你可能会用得到。


equationAdd.rar (74.58 KB, 下载次数: 31)


更新:1. 修复如果公式由于太长被迫移动到下一行的话,此公式同样会被编号的问题;
          2. 修复如果公式独占一段,而且公式后面有tab符号时,出错的问题。

equationAdd.rar (66.96 KB, 下载次数: 35)



更新:1. 修复如果公式太长或公式左边本身已有制表符时,编号置左时,对齐出错的问题。这次就给个模块。         
           2. 修正公式左边内容判断方法。
           3. 修复中文版Word运行出错的问题。
NewMacros.rar (4.19 KB, 下载次数: 38)

本人平时不怎么上论坛,有问题邮箱联系我吧(liujunwei4321#gmail.com)

addeqnum.png







补充内容 (2014-3-13 17:07):
发现问题:如果有多个分节,而每节的页面设置又不一样,出错。

补充内容 (2014-3-14 13:42):
已修复:如果有多个分节,而每节的页面设置又不一样,出错。
更新:可以对不同节单独设置编号格式。

补充内容 (2014-3-14 14:21):
目前还没有添加对07和10版自带的公式编辑器编辑出来的公式的支持,要支持这个应该不难,等楼主有空再研究。

补充内容 (2014-5-9 10:26):
已经添加对Office 2007及以上版本内嵌公式编辑器编写出来的公式的自动编号。有需要可以联系我。

公式自动编号

公式自动编号

TA的精华主题

TA的得分主题

发表于 2014-1-7 10:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 zhanglei1371 于 2014-1-7 10:09 编辑

感谢楼主分享,能做到这个水平(界面相当专业),已经是本版块的高手了!
不过似乎工具是针对最新版office制作,对于2003的话不通用,如Selection.ClearParagraphAllFormatting方法,在03中就无法使用。(换成Selection.ClearFormatting就OK了)另外,处理过程中屏幕会闪动,最好再加个application.screenupadating=false

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-7 10:10 | 显示全部楼层
本帖最后由 liujunwei4321 于 2014-1-9 10:23 编辑

我有空在03版中测试一下,进行修改。屏幕闪的话,这次确实没有加上,回头加上。不过我发的这个版本目前交叉引用的时候会把公式本身也引用进去,我已经修复此问题。等更多改进后重新发。
发现新问题:如果公式由于太长被迫移动到下一行的话,此公式同样会被编号,正修复中……

已修复,同时修复如果公式独占一段,而且公式后面有tab键时,出错的问题。

发现问题:如果公式太长,或公式编号前左边已有制表符,编号置左时,不能正确对齐。(已修复)

TA的精华主题

TA的得分主题

发表于 2014-1-8 22:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
交流,小弟水平很挫,这是之前写的给单个公式添加编号的宏。
方法就是选中公式嵌入式对象,执行后就自动在右侧添加好编号,且交叉引用时不会出错。
方法是先计算图片的大小和尺寸,将图片左缩进到正中间位置,插入样式分隔符,再插入公式域。。。
  1. Sub 插入公式编号()
  2. Application.ScreenUpdating = False
  3.     Dim a As Boolean
  4.     a = (Selection.Type <> wdSelectionInlineShape)
  5.     If a Then
  6.         MsgBoxEx 0, "未选定公式或者公式不是嵌入型" & vbCrLf & "本功能需要先选中嵌入型公式对象", "本窗口5s内自动关闭", vbOKOnly, 0, 4500
  7.     Else
  8.         Dim L!, r!, pgW!, shW!, pg!, i&
  9.         pgW = ActiveDocument.PageSetup.PageWidth
  10.         shW = Selection.InlineShapes(1).Width
  11.         With ActiveDocument.PageSetup
  12.             L = .LeftMargin
  13.             R = .RightMargin
  14.         End With
  15.         With Selection.ParagraphFormat
  16.             .SpaceBeforeAuto = False
  17.             .SpaceAfterAuto = False
  18.             .FirstLineIndent = (pgW - L - r - shW) / 2
  19.             .Alignment = wdAlignParagraphLeft
  20.         End With
  21.         With Selection
  22.             .EndKey
  23.             pg = .Information(wdHorizontalPositionRelativeToTextBoundary)
  24.             .Paragraphs.TabStops.Add pg, wdAlignTabLeft '在图片右边插入一个左对齐制表符
  25.             .Paragraphs.TabStops.Add CentimetersToPoints(15.5), wdAlignTabRight   '页面最右端插入一个右对齐制表符
  26.             .TypeText vbTab
  27.             i = .Start                          '
  28.             .TypeParagraph                      '这三行为消除Bug而设,否则会影响下文内容
  29.             ActiveDocument.Range(i, i).Select   '
  30.             .InsertStyleSeparator
  31.             .MoveLeft wdCharacter, 1, wdExtend
  32.             .Delete
  33.             .TypeText ("(")
  34.             With CaptionLabels("公式")
  35.                 .NumberStyle = wdCaptionNumberStyleArabic
  36.                 .IncludeChapterNumber = True
  37.                 .ChapterStyleLevel = 1
  38.                 .Separator = wdSeparatorPeriod
  39.             End With
  40.             .InsertCaption Label:="公式", TitleAutoText:="", Title:="", _
  41.             Position:=wdCaptionPositionAbove, ExcludeLabel:=1
  42.             .TypeText (")")
  43.         End With
  44.     End If
  45. Application.ScreenUpdating = True
  46. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-1-8 22:12 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-9 10:17 | 显示全部楼层
本帖最后由 liujunwei4321 于 2014-1-9 10:24 编辑
loquat 发表于 2014-1-8 22:12
看楼主的代码好长。Mark

因为楼主很挫,所以代码很长,楼主是业余的,让你见笑了!如果你有兴趣可以优化精简一下的。这个我不在行。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-9 10:19 | 显示全部楼层
本帖最后由 liujunwei4321 于 2014-1-9 11:12 编辑
loquat 发表于 2014-1-8 22:04
交流,小弟水平很挫,这是之前写的给单个公式添加编号的宏。
方法就是选中公式嵌入式对象,执行后就自动在 ...

交叉引用已经修复,同样使用了样式分隔符。我公式居中和编号对齐方式同样使用的是制表符对齐的。我大概看了一下,我的功能应该和你的差不多,不过好像更强大而已。在模块里还有两个子程序,可以实现插入公式后自动编号,不过可能不能实现正确的交叉引用,稍加修改应该可以实现。

TA的精华主题

TA的得分主题

发表于 2015-8-7 20:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-4-23 16:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
(1)楼主您好,我阅读了您的贴吧:http://club.excelhome.net/thread-1086447-1-1.html。我是用word自带的公式编辑器写的公式,所给的宏代码会改变公式在文档中的显示方式吗?例如,一个分式如果在一句话中会自动缩小字体,而在一个单独的段落中则以专业模式显示。(2)另外,请发最新代码给我,谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 03:53 , Processed in 0.027885 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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