Office自带的VBE在编辑代码时,没有自动完成代码缩进的功能,而我们在网上找到的VBA代码,经常没有实现良好的自动缩进,复制到VBE后,可读性较差。本文介绍的宏,通过使用vbscript.regexp对象,利用正则表达式匹配VBA 代码块中开始和结束关键字,完成缩进量的计算,从而实现VBA代码的格式化。
要使用vbscript.regexp对象,需要用过VBE的“工具”菜单的“引用”命令引入Microsoft VBScript Regular Expressions 5.5这个库。引入这个库后,我们构筑三个正则表达式,分别匹配VBA代码块的开始记号、结束记号及中继记号。例如一个If-Else-End If代码块,If就是这个代码块的开始记号,遇到了开始记号,下面的行就需要增加一个缩进单位;Else就是这个代码块的中继记号,遇到中继记号,不影响后续行的缩进,但本行的缩进需要减少一个单位;End If就是这个代码块的结束记号,遇到结束记号,本行和后续各行的缩进量就要减少一个单位。此外还有一个特殊情况,就是换行连接符“_”,其后续第一行也宜增加一个缩进量,如果下一行仍然太长被分行,则再下面一行不用继续增加缩进。
宏代码如下,运行宏前需先选择复制到Word文档中的整个代码块。如果所选择的代码中包含的所有代码块结构完整,则所选择的代码块被替换为缩进规范的代码。如运行宏后发现代码缩进不正确,则代码中肯定有错误,存在结构不完整的代码块。

Sub VBA代码缩进()Dim aPara As ParagraphDim CumulativeIndent As Integer, currParaIndent%, i%Dim sTmp As String, sResult$Dim regRight As RegExp, regLeft As RegExp, regMiddle As RegExpSet regRight = CreateObject("vbscript.regexp")Set regLeft = CreateObject("vbscript.regexp")Set regMiddle = CreateObject("vbscript.regexp")'regLeft匹配需要增加后续段落左缩进的段落,即段落开头为代码块开始记号的段落'if语句比较特殊,有些整个结构在一行结束,有些需要end if结束,'区别在于then是不是在行末最后的非空白字符With regLeft.Pattern = "(^(for|while|with|do|select|((public|private)\s)*(sub|function))\s)|(^(if|#if)\s+\S.*\sthen\s{0,}$)".IgnoreCase = True.MultiLine = TrueEnd With'regRight匹配需要减少本段及后续段落左缩进的段落,即段落开头为代码块结束记号的段落regRight.Pattern = "^(end\s|#end\s|loop|next|wend)"regRight.IgnoreCase = True'regMiddle匹配对前后段落缩进没有影响,但需要减少本段左缩进的段落,即段落开头为中继记号的段落regMiddle.Pattern = "^(elseif|else|#elseif|#else|case)\s"regMiddle.IgnoreCase = True'将所选择的代码原有不规范的缩进全部删除,即替换掉各段前导空格或制表符(^t),以免影响最终缩进'将过多的记号之间的空白替换为1个空格。With Selection.Find.MatchWildcards = True.Execute FindText:="^13[ ^t]{1,}", _ReplaceWith:="^p", Replace:=wdReplaceAll.Execute FindText:="[ ^t]{2,}", _ReplaceWith:=" ", Replace:=wdReplaceAllEnd With'记录一行代码前累计需添加的缩进量CumulativeIndent = 0For Each aPara In Selection.Paragraphs'将当前段落文本读入临时字符串,去掉前后空白sTmp = Trim(aPara.Range.Text)'计算缩进量'遇到代码块开始记号,左缩进增加1(注意本段增加的缩进后面需要减掉)If regLeft.test(sTmp) ThenCumulativeIndent = CumulativeIndent + 1'遇到代码块结束记号,左缩进减少1ElseIf regRight.test(sTmp) ThenCumulativeIndent = CumulativeIndent - 1End If'计算本段的段落缩进,如果本段为代码块开始记号或者是中间记号开头,'需要将本段前面加上的缩进量调整回去If regLeft.test(sTmp) Or regMiddle.test(sTmp) ThencurrParaIndent = CumulativeIndent - 1ElsecurrParaIndent = CumulativeIndentEnd If'根据需要添加的缩进量,在本段文本前添加TAB(Chr(9))For i = 1 To currParaIndentsTmp = Chr(9) & sTmpNext'如果上一行末尾是换行连接符,下一行增加一个TAB进行缩进'由于没有修改CumulativeIndent,所以这个操作不会影响其他行的缩进量 If Right(sResult, 2) = "_" & Chr(13) ThensTmp = Chr(9) & sTmpEnd If'将添加了TAB的字符串拼接到结果字符串中sResult = sResult & sTmpNextSelection.Text = Replace(sResult, Chr(13) & Chr(13), Chr(13))
End Sub

使用vbscript.regexp实现VBA代码格式化相关推荐

  1. JavaScript防代码格式化原理

    本文出自:JShaman,一个专业的JS代码混淆平台. 防代码格式化,又称防代码美化.selfDefending. 意思是:将一段代码,经混淆加密,输出的代码是被压缩到一行的,这一行代码不可使用格式化 ...

  2. 编写高效Excel VBA代码的最佳实践(一)

    很多Excel VBA文章和图书都介绍过如何优化VBA代码,使代码运行得更快.下面搜集了一些使Excel VBA代码运行更快的技术和技巧,基本上都是实践经验的总结.如果您还有其它优化Excel VBA ...

  3. access vba代码大全_Access 与 Excel 之对比 (翻译)

    作者:Luke Chung 原文连接:Microsoft Access versus Microsoft Excel for Data Analysis and Reporting 在Excel与Ac ...

  4. Excel VBA代码学习

    艺思网    http://www.edusrc.com  提供中学教学资料下载 很多Excel VBA文章和图书都介绍过如何优化VBA代码,使代码运行得更快.下面搜集了一些使Excel VBA代码运 ...

  5. vba word 查找_Word批量查找替换VBA代码

    编写该代码的目的: 初衷 该代码最初用于我自己弄得一个用于批量化写word报告的东西,因为我原来需要写一堆格式化的报告,不同报告间除了数据发生了变化,其他几乎一模一样,我想偷懒(主要是我容易写错),就 ...

  6. VBA代码自学收集(150例)

    1.Application.CommandBars("Worksheet Menu Bar").Enabled = false 2.cells(activecell.row,&qu ...

  7. Pycharm 和 vscode 多光标、折叠代码和代码格式化快捷键

    pycharm 多光标:按住alt+shift+ctrl,用鼠标左键点击,可以出现多个光标,输入的代码可以在光标处同时增加. 折叠所有代码:Ctrl + Shift + - (减号) 展开所有代码:C ...

  8. 在线代码格式化,在线JSON校验格式化

    在线代码格式化 http://tool.oschina.net/codeformat/json 在线JSON校验格式化 http://www.kjson.com/ 两个好用工具

  9. Zend Studio 10代码格式化设置

    2019独角兽企业重金招聘Python工程师标准>>> 1.设置位置 窗口>首选项>PHP>代码样式>格式化程序 2.点击New新创建一个格式配置文件 Pro ...

最新文章

  1. java基础(十三)-----详解内部类——Java高级开发必须懂的
  2. springboot实现简单的文件上传与回显
  3. 自定义控件 - 流式布局:TagFlowLayout
  4. 2月国内操作系统市场份额:Windows XP持续下降
  5. Bumblebee微服务网关之Url重写
  6. if laytpl 非_Layui-神奇的layui.laytpl
  7. mongodb定时删除数据(索引删除)
  8. vscode使用Git Graph提交成功,但是仓库没有更新
  9. ES6中变量的解构赋值
  10. JavaWeb — 请求响应流程图
  11. MacOs中Docker与宿主机网络互通问题解决
  12. .net程序逆向之de4dot的使用
  13. plsql 64位连接oracle,Plsql连接Oracle 64位
  14. 无人驾驶技术(交通标志识别)
  15. AABB包围盒和OBB包围盒区别
  16. DTCMS添加栏目教程
  17. HCI 基础知识之一
  18. 我是如何来进行项目管理-时间管理的
  19. 语音交互的基本概念和设计实践
  20. [CTSC2016]时空旅行

热门文章

  1. 动态壁纸安卓_【安卓】能够虚化加缩放的动态壁纸
  2. 【汽车产业抢占AI赛道】北京汽车产业创新大集参赛项目盘点
  3. 后疫情时代,医疗产业的第三次革命
  4. android mi4 分辨率,小米4c的屏幕尺寸是多少?小米4c的分辨率是多少?
  5. C++多线程:Lambda表达式
  6. ps工笔画效果教程-庞姿姿
  7. 产品的思路——来自腾讯张小龙的分享
  8. 2021-湖湘杯-Web
  9. 一年Android工作经验,今日头条 阿里 百度 网易 美团 小米 快手面经
  10. 中谷教育python精讲_中谷教育Python视频教程