ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用vba代码实现vba代码的缩进排列?

如何用vba代码实现vba代码的缩进排列?

作者:绿色风 分类: 时间:2022-08-17 浏览:151
楼主
kevinchengcw
Q: 如何用vba代码实现vba代码的缩进排列?
A: 代码如下:
  1. Sub ArrangeCode()
  2. Dim Arr, Arr2, N&, T%, Str$, Dic, Result$
  3. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目,用于存储规则
  4. With Dic  '添加不同关键字对代码缩进带来的影响,key为关键字,item为影响值(规则:对本行的影响值|对下一行的影响值)
  5.     .Add "if", "0|1"
  6.     .Add "else", "-1|1"
  7.     .Add "else:", "-1|1"
  8.     .Add "elseif", "-1|1"
  9.     .Add "end if", "-1|0"
  10.     .Add "with", "0|1"
  11.     .Add "end with", "-1|0"
  12.     .Add "for", "0|1"
  13.     .Add "next", "-1|0"
  14.     .Add "do", "0|1"
  15.     .Add "loop", "-1|0"
  16.     .Add "select", "0|1"
  17.     .Add "case", "-1|1"
  18.     .Add "end select", "-1|0"
  19. End With
  20. With CreateObject("vbscript.regexp")  '创建正则项目,用于整理代码中的空白行(在其他帖子里有讲解,本例不做详述)
  21.     .Global = True
  22.     .MultiLine = True
  23.     .Pattern = "(\n[\'\s]*)(\n)"
  24.     Str = .Replace(MainWindow.TextBox1.Text, "$2")
  25.     Str = Replace(Str, vbNewLine & "End Sub" & vbNewLine, vbNewLine & "End Sub" & vbNewLine & vbNewLine)
  26.     .Pattern = "(\n)[ " & Chr(9) & "]+"  '利用正则替换掉代码前面全部的制表符及空格
  27.     Str = .Replace(Str, "$1")
  28. End With
  29. Arr = Split(Str, vbNewLine)  '以换行标记分割,将代码放到数组中
  30. T = 0  '初始化最初的代码缩进量
  31. For N = LBound(Arr) To UBound(Arr)  '循环各段代码
  32.     If N = LBound(Arr) Then  '如果是第一行,则直接等于原来代码,不做改变
  33.         Result = Arr(N)
  34.     Else  '如果是其他行,则进行相关判断
  35.         If Trim(Arr(N)) <> "" Then  '如果不是空白行,则
  36.             If LCase(Trim(Arr(N))) = "end sub" Or LCase(Trim(Arr(N))) = "end function" Then   '判断是否是程序结尾,如果是,则缩进量清零,直接串接本段代码
  37.                 T = 0
  38.                 Result = Result & vbNewLine & Arr(N)
  39.             ElseIf LCase(Trim(Arr(N))) Like "if * then *" Then  '否则如果是if...then...结构,且then后面有代码,则保持现在的缩进量
  40.                 Result = Result & vbNewLine & WorksheetFunction.Rept(vbTab, T) & Arr(N)
  41.             ElseIf Dic.exists(LCase(Trim(Arr(N)))) Then  '否则如果存在该字典项,则判断缩进量变化后是否会小于0,小于0则为0,否则为变化后的量,并串接当前缩进量数量的制表符(利用工作表函数rept完成该动作,分别处理本行及下一行的缩进量)
  42.                 If T + Val(Split(Dic(LCase(Trim(Arr(N)))), "|")(0)) >= 0 Then T = T + Val(Split(Dic(LCase(Trim(Arr(N)))), "|")(0))
  43.                 Result = Result & vbNewLine & WorksheetFunction.Rept(vbTab, T) & Arr(N)
  44.                 If T + Val(Split(Dic(LCase(Trim(Arr(N)))), "|")(1)) >= 0 Then T = T + Val(Split(Dic(LCase(Trim(Arr(N)))), "|")(1))
  45.             Else   '如果以上情况都不成立,则继续依空格拆分当前代码行放入数组,判断遇到的情况并予以处理
  46.                 Arr2 = Split(Trim(Arr(N)), " ")
  47.                 If UBound(Arr2) > 0 Then
  48.                     If LCase(Arr2(0)) = "end" And Dic.exists(LCase(Arr2(0)) & " " & LCase(Arr2(1))) Then
  49.                         If T + Val(Split(Dic(LCase(Arr2(0)) & " " & LCase(Arr2(1))), "|")(0)) >= 0 Then T = T + Val(Split(Dic(LCase(Arr2(0)) & " " & LCase(Arr2(1))), "|")(0))
  50.                         Result = Result & vbNewLine & WorksheetFunction.Rept(vbTab, T) & Arr(N)
  51.                         If T + Val(Split(Dic(LCase(Arr2(0)) & " " & LCase(Arr2(1))), "|")(1)) >= 0 Then T = T + Val(Split(Dic(LCase(Arr2(0)) & " " & LCase(Arr2(1))), "|")(1))
  52.                     ElseIf Dic.exists(LCase(Arr2(0))) Then
  53.                         If T + Val(Split(Dic(LCase(Arr2(0))), "|")(0)) >= 0 Then T = T + Val(Split(Dic(LCase(Arr2(0))), "|")(0))
  54.                         Result = Result & vbNewLine & WorksheetFunction.Rept(vbTab, T) & Arr(N)
  55.                         If T + Val(Split(Dic(LCase(Arr2(0))), "|")(1)) >= 0 Then T = T + Val(Split(Dic(LCase(Arr2(0))), "|")(1))
  56.                     Else
  57.                         Result = Result & vbNewLine & WorksheetFunction.Rept(vbTab, T) & Arr(N)
  58.                     End If
  59.                 Else
  60.                     Result = Result & vbNewLine & WorksheetFunction.Rept(vbTab, T) & Arr(N)
  61.                 End If
  62.             End If
  63.         Else
  64.             Result = Result & vbNewLine & Arr(N)
  65.         End If
  66.     End If
  67. Next N
  68. MainWindow.TextBox1.Text = Result   '显示处理后的结果
  69. Set Dic = Nothing   '清空字典项目
  70. End Sub


相关内容已集成到"VBA解释器_进化5"中,可以到下面地址下载,以上为其中代码解读。
http://www.exceltip.net/thread-6986-1-1.html
2楼
hhzjxss
谢谢版主,感谢分享,学习一下先!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap