|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 yivifu 于 2014-8-13 20:53 编辑
有时候,我喜欢把网上搜索到的VBA教材或者文章拷贝到word中,拷贝过来后里面的示例代码经常没有正确缩进,阅读起来很不方便,于是写了下面的宏,只要代码正确,选择整段代码后运行这个宏,就可以自动将代码正确缩进。
- Sub VBA代码缩进()
- Dim aPara As Paragraph
- '用于计算缩进量的辅助变量
- Dim i As Integer, j%, k%, m%
- Dim sTmp As String, sResult$
- Dim regRight As RegExp, regLeft As RegExp, regMiddle As RegExp
- Set regRight = CreateObject("vbscript.regexp")
- Set regLeft = CreateObject("vbscript.regexp")
- Set regMiddle = CreateObject("vbscript.regexp")
- 'regLeft匹配需要增加左缩进的段落
- regLeft.Pattern = "(^(for|while|with|do|select|((public|private)\s)*(sub|function))\s)|(^if.+then\s+$)"
- regLeft.IgnoreCase = True
- 'regRight匹配需要减少左缩进的段落
- regRight.Pattern = "^(end.+\S|loop|next|wend)\s"
- regRight.IgnoreCase = True
- 'regMiddle匹配对前后段落缩进没有影响,但需要减少本段左缩进的段落,例如if-else-end if结构中间的else
- regMiddle.Pattern = "^(elseif|else|case)\s"
- regMiddle.IgnoreCase = True
- i = 0: j = 1
- For Each aPara In Selection.Paragraphs
- sTmp = Trim(aPara.Range.Text)
- '计算缩进量,如同一行中既有左括号又有右括号则不影响缩进量
- If regLeft.test(sTmp) Then
- i = i + j
- ElseIf regRight.test(sTmp) Then
- i = i - j
- End If
- '设置段落缩进,注意增加左缩进和中间结构段落,需要将前面加上的缩进量调整回去
- If regLeft.test(sTmp) Or regMiddle.test(sTmp) Then
- m = i - j
- Else
- m = i
- End If
- For k = 1 To m
- sTmp = Chr(9) & sTmp
- Next
- sResult = sResult & sTmp
- Next
- Selection.Text = sResult
- End Sub
复制代码
如果只是在word中编辑,第32行至第40行也可以用下面较简略的代码替换,只是替换后产生的结果从word中拷贝到其他文本编辑器里的时候,因为文本编辑器不认识word的段落缩进格式,所以缩进又会丢失。而上面的代码是通过添加不同数量的制表符来产生缩进,所以调整后的代码复制到其他文本编辑器(如VBE的代码编辑器)时不会出现缩进丢失问题。
- If regLeft.test(sTmp)) Or regMiddle.test(sTmp) Then
- aPara.Range.ParagraphFormat.CharacterUnitLeftIndent = i - j
- Else
- aPara.Range.ParagraphFormat.CharacterUnitLeftIndent = i
- End If
复制代码
如果能够确信文章中所有代码在结构上都是完整和正确的,那么第22行也可以修改成
- 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博客里了。 |
评分
-
1
查看全部评分
-
|