ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] VBA代码自动缩进

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-8-13 12:59 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 yivifu 于 2014-8-13 20:53 编辑

有时候,我喜欢把网上搜索到的VBA教材或者文章拷贝到word中,拷贝过来后里面的示例代码经常没有正确缩进,阅读起来很不方便,于是写了下面的宏,只要代码正确,选择整段代码后运行这个宏,就可以自动将代码正确缩进。
  1. Sub VBA代码缩进()
  2. Dim aPara As Paragraph
  3. '用于计算缩进量的辅助变量
  4. Dim i As Integer, j%, k%, m%
  5. Dim sTmp As String, sResult$
  6. Dim regRight As RegExp, regLeft As RegExp, regMiddle As RegExp
  7. Set regRight = CreateObject("vbscript.regexp")
  8. Set regLeft = CreateObject("vbscript.regexp")
  9. Set regMiddle = CreateObject("vbscript.regexp")

  10. 'regLeft匹配需要增加左缩进的段落
  11. regLeft.Pattern = "(^(for|while|with|do|select|((public|private)\s)*(sub|function))\s)|(^if.+then\s+$)"
  12. regLeft.IgnoreCase = True
  13. 'regRight匹配需要减少左缩进的段落
  14. regRight.Pattern = "^(end.+\S|loop|next|wend)\s"
  15. regRight.IgnoreCase = True
  16. 'regMiddle匹配对前后段落缩进没有影响,但需要减少本段左缩进的段落,例如if-else-end if结构中间的else
  17. regMiddle.Pattern = "^(elseif|else|case)\s"
  18. regMiddle.IgnoreCase = True

  19. i = 0: j = 1
  20. For Each aPara In Selection.Paragraphs
  21. sTmp = Trim(aPara.Range.Text)
  22. '计算缩进量,如同一行中既有左括号又有右括号则不影响缩进量
  23. If regLeft.test(sTmp) Then
  24. i = i + j
  25. ElseIf regRight.test(sTmp) Then
  26. i = i - j
  27. End If

  28. '设置段落缩进,注意增加左缩进和中间结构段落,需要将前面加上的缩进量调整回去
  29. If regLeft.test(sTmp) Or regMiddle.test(sTmp) Then
  30. m = i - j
  31. Else
  32. m = i
  33. End If
  34. For k = 1 To m
  35. sTmp = Chr(9) & sTmp
  36. Next
  37. sResult = sResult & sTmp
  38. Next
  39. Selection.Text = sResult
  40. End Sub
复制代码

如果只是在word中编辑,第32行至第40行也可以用下面较简略的代码替换,只是替换后产生的结果从word中拷贝到其他文本编辑器里的时候,因为文本编辑器不认识word的段落缩进格式,所以缩进又会丢失。而上面的代码是通过添加不同数量的制表符来产生缩进,所以调整后的代码复制到其他文本编辑器(如VBE的代码编辑器)时不会出现缩进丢失问题。

  1. If regLeft.test(sTmp)) Or regMiddle.test(sTmp) Then
  2. aPara.Range.ParagraphFormat.CharacterUnitLeftIndent = i - j
  3. Else
  4. aPara.Range.ParagraphFormat.CharacterUnitLeftIndent = i
  5. End If
复制代码

如果能够确信文章中所有代码在结构上都是完整和正确的,那么第22行也可以修改成
  1. For Each aPara In Selection.Paragraphs
复制代码
并在这个for循环中取得段落文本后添加一个aPara.range.delete语句,这样,不需要选择代码段落,直接运行这个宏就可以将全文所有代码进行缩进。在文章太长时,不鼓励这样修改。如果发现缩进不正确,那么十有八九是所选择的代码结构不正确,当然也有可能是这个宏存在漏洞,这需要在应用中发现并完善。这个宏对select case结构的缩进,不是按流行的缩进case语句,然后每个case下面的语句与case平齐,而是缩进case下面的语句,case语句与select case平齐,这是我个人的喜好。



补充内容 (2023-3-24 09:18):
这个代码实际上有很多bug,不过我不知道怎么重新修改原来的代码。更完善的代码写到CSDN博客里了。

点评

缩进涉及的问题挺多的,例如下划线连接,条件编译等等  发表于 2018-4-25 19:51

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-8-13 22:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-8-14 08:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 百度不到去谷歌 于 2014-8-14 08:38 编辑

楼主辛苦 可是楼主可曾听过有个vbe插件叫做Smart Ident专门做代码缩进的 粘贴到代码区直接右键弹出菜单 可以选择过程级 模块级以及工程级别缩进 同时在vba里操作还可以测试一下代码不是个更好的  顺手给你附件吧
Smart Ident vba代码格式化.rar (274.63 KB, 下载次数: 1183)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-14 22:35 | 显示全部楼层
百度不到去谷歌 发表于 2014-8-14 08:37
楼主辛苦 可是楼主可曾听过有个vbe插件叫做Smart Ident专门做代码缩进的 粘贴到代码区直接右键弹出菜单 可以 ...

我还没听说过呢,我喜欢自己折腾

TA的精华主题

TA的得分主题

发表于 2015-6-4 16:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
每次回帖、谢谢!辛苦了。

TA的精华主题

TA的得分主题

发表于 2015-8-17 09:58 | 显示全部楼层
要是把自己写的vba缩进,这代码怎么改,怎么用?

TA的精华主题

TA的得分主题

发表于 2015-8-17 20:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
yivifu 发表于 2014-8-14 22:35
我还没听说过呢,我喜欢自己折腾

我喜欢你这句话:自已折腾!

TA的精华主题

TA的得分主题

发表于 2016-5-1 15:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
百度不到去谷歌 发表于 2014-8-14 08:37
楼主辛苦 可是楼主可曾听过有个vbe插件叫做Smart Ident专门做代码缩进的 粘贴到代码区直接右键弹出菜单 可 ...

谢谢!!帮了大忙了。

TA的精华主题

TA的得分主题

发表于 2017-1-5 15:36 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-4-27 20:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-29 14:52 , Processed in 0.057282 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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