ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 对代码进行缩格整理的函数代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-6-3 00:18 | 显示全部楼层 |阅读模式
Function ChangeCodeFormat2(myCode As String) As String
'=====================================================
'日期  :2009-6-3
'编制  :花生牛奶
'功能  :将包含在myCode中的vba代码进行格式整理
'返回值:按缩格形式整理的代码
'关联  :需要调用ClearQuotes函数(清除双引号的字符串)
'=====================================================
   '和前一行是否为同一语句的标记
   Dim SameLineFlag As Boolean
   '当前行的类型,1表示复合体的开始,2表示复合体中间的控制语句,3表示结束,5表示空行,0表示普通语句
   Dim ControlFlagType As Integer
   'myPreStr1控制语句的空格串来控制缩格
   ' myPreStr2普通语句的缩格
   Dim myPreStr1 As String, myPreStr2 As String
   '循环变量
   Dim i As Integer, j As Integer
   's2为trim后的原来语句,s1为小写的完整原来语句,s为剔除注释后的主语句
   Dim s As String, s1 As String, s2 As String, sNext As String, sCur As String
   'code存储格式整理后的语句
   Dim Code As String
   '保存将原来的所有语句按回车进行分解的数组,每个元素为一行语句,可能带chr(13)
   Dim X
   '预定义缩格一次的长度
   Const myPreSpaceNum As Integer = 3
   'myMemoPos注释的单引号位置
   Dim myRemPos As Integer
   
   X = Split(myCode, Chr(10))
   myPreStr1 = ""
   myPreStr2 = ""
   ControlFlagType = 0
   
   For i = 0 To UBound(X)
      s2 = X(i)
      If Right(s2, 1) = Chr(13) Then s2 = Left(s2, Len(s2) - 1)
      s2 = Trim(s2)
      s1 = LCase(ClearQuotes(s2))
      myRemPos = InStr(s1, "'")
      If myRemPos > 1 Then '检查语句是否带注释内容,如果有则去掉
         s = Trim(Left(s1, myRemPos - 1)) 'ClearRem(s1)
         
      Else
         s = s1
      End If
      sCur = s
      
      If Not SameLineFlag Then
         If Right(s, 1) = "_" Then
            j = 1
            Do
               sNext = X(i + j)
               If Right(sNext, 1) = Chr(13) Then sNext = Left(sNext, Len(sNext) - 1)
               sNext = ClearQuotes(LCase(Trim(sNext)))
               
               myRemPos = InStr(sNext, "'")
               If myRemPos > 1 Then '检查语句是否带注释内容,如果有则去掉
                  s = Trim(Left(sNext, myRemPos - 1))
               End If
               s = s & " " & sNext '空格用来分隔
               j = j + 1
            Loop Until Right(sNext, 1) <> "_"
            
            SameLineFlag = True
         End If
         
         '以下长长的if语句判断当前语句的类型
         If s Like "function *" Or s Like "* function *" Then
            ControlFlagType = 1
         ElseIf s Like "sub *" Or s Like "* sub *" Then
            ControlFlagType = 1
         ElseIf s Like "property *" Or s Like "* property *" Then
            ControlFlagType = 1
         ElseIf s Like "if * then" Or s Like "#if * then" Then
            ControlFlagType = 1
         ElseIf s Like "for *" Then
            ControlFlagType = 1
         ElseIf s Like "with *" Then
            ControlFlagType = 1
         ElseIf s Like "select *" Then
            ControlFlagType = 1
         ElseIf s Like "do" Or s Like "do *" Then
            ControlFlagType = 1
         ElseIf s Like "while *" Then
            ControlFlagType = 1
         ElseIf s Like "end *" Or s Like "#end if" Then
            ControlFlagType = 3
         ElseIf s = "next" Or s Like "next *" Then
            ControlFlagType = 3
         ElseIf s Like "loop *" Or s = "loop" Then
            ControlFlagType = 3
         ElseIf s Like "wend" Then
            ControlFlagType = 3
         ElseIf s Like "elseif *" Or s Like "#elseif *" Then
            ControlFlagType = 2
         ElseIf s = "else" Or s = "#else" Then
            ControlFlagType = 2
         ElseIf s Like "case *" Then
            ControlFlagType = 2
         ElseIf s <> "" Then
            ControlFlagType = 0
         Else
            ControlFlagType = 5
         End If
         
         '针对不同类型的语句,选择不同的缩格
         '并决定后续的语句缩格长度
         Select Case ControlFlagType
         Case 0, 5 '一般语句
            Code = Code & myPreStr1 & s2 & vbLf
         Case 1 '开始语句
            myPreStr2 = myPreStr1 '控制语句同开始前的语句
            myPreStr1 = myPreStr1 & Space(myPreSpaceNum) '后续普通语句缩格
            Code = Code & myPreStr2 & s2 & vbLf
         Case 2 '中间语句
            Code = Code & myPreStr2 & s2 & vbLf
         Case 3 '结束语句,分别回缩,如果顶格则不动
            Code = Code & myPreStr2 & s2 & vbLf
            If Len(myPreStr1) >= myPreSpaceNum Then myPreStr1 = Left(myPreStr1, Len(myPreStr1) - myPreSpaceNum)
            If Len(myPreStr2) >= myPreSpaceNum Then myPreStr2 = Left(myPreStr2, Len(myPreStr2) - myPreSpaceNum)
            'myPreStr2 = myPreStr1
         End Select
         
      Else '和之前语句实际为同一语句则缩进去
         If Not Right(sCur, 1) = "_" Then SameLineFlag = False
         Select Case ControlFlagType
         Case 0, 5
            Code = Code & Space(myPreSpaceNum) & myPreStr1 & s2 & vbLf
         Case 1, 2, 3
            Code = Code & Space(myPreSpaceNum) & myPreStr2 & s2 & vbLf
         End Select
         
      End If
      
   Next
   ChangeCodeFormat2 = Code
End Function

Function ClearQuotes(tmpStr As String) As String
'=====================================================
'日期  :2009-6-3
'编制  :花生牛奶
'功能  :将tmpstr中不带双引号之间的内容复制,便于后续判断处理
'返回值:返回没有双引号之间内容的字符串
'关联  :无
'=====================================================
   Dim myPos1 As Integer, myPos2 As Integer
   Dim ss As String
   ss = tmpStr
   myPos1 = InStr(ss, Chr(34))
   Do While myPos1
      myPos2 = InStr(myPos1 + 1, ss, Chr(34))
      If myPos2 Then
        ss = Left(ss, myPos1 - 1) & Right(ss, Len(ss) - myPos2)
      Else
        Exit Do
      End If
      myPos1 = InStr(ss, Chr(34))
   Loop
   ClearQuotes = ss
End Function

TA的精华主题

TA的得分主题

发表于 2009-6-3 07:37 | 显示全部楼层
缩格是什么意思,是用于word文档的么?

TA的精华主题

TA的得分主题

发表于 2009-7-8 08:27 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-5 12:33 , Processed in 0.028901 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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