zoukankan      html  css  js  c++  java
  • 20170719xlVBASmartIndent

    Public Sub SmartIndenterProcedure()
        Dim OneComp As VBComponent
        Dim StartLine As Long, EndLine As Long
        Dim LineIndex As Long, LineNo As Long, LineCount
        Dim StartCol As Long, EndCol As Long
        Dim LineText As String
        Dim ProcName As String, KeyWord As String
        Dim IndentLevel As Integer, IsAfterUnderLine As Boolean
        Dim IndentThisLine As Boolean, BackThisLine As Boolean
        Dim IndentNextLine As Boolean, BackNextLine As Boolean
        
        
        For Each OneComp In ActiveWorkbook.VBProject.VBComponents
            
            LineCount = OneComp.CodeModule.CountOfLines
            For LineNo = 1 To LineCount
             
                ProcName = OneComp.CodeModule.ProcOfLine(LineNo, vbext_pk_Proc)
            
                ProcLineCount = OneComp.CodeModule.ProcCountLines(ProcName, vbext_pk_Proc)
                LineNo = LineNo + ProcLineCount - 1
                
                
                StartLine = OneComp.CodeModule.ProcStartLine(ProcName, vbext_pk_Proc)
                EndLine = OneComp.CodeModule.ProcCountLines(ProcName, vbext_pk_Proc) + StartLine
                
                '循环每一行,删除行首缩进
                For LineIndex = StartLine To EndLine
                    LineText = OneComp.CodeModule.Lines(LineIndex, 1)
                    Do Until Left(LineText, 1) <> " "
                        OneComp.CodeModule.ReplaceLine LineIndex, Mid(LineText, 2)
                        LineText = OneComp.CodeModule.Lines(LineIndex, 1)
                    Loop
                Next LineIndex
                
                IndentLevel = 0
                For LineIndex = StartLine To EndLine
                    LineText = OneComp.CodeModule.Lines(LineIndex, 1)
                    KeyWord = Left(LineText, IIf(InStr(LineText, " ") = 0, Len(LineText), InStr(LineText, " ") - 1))
                    
                    Select Case KeyWord
                    Case "Do", "For", "Private", "Select", "Sub", "While", "With", "Function", "Type"
                        IndentNextLine = True
                    Case "If"
                        If Right(LineText, 4) = "Then" Then IndentNextLine = True
                    Case "Loop", "Next", "End"
                        BackThisLine = True
                    Case "Case", "Else", "ElseIf"
                        BackThisLine = True
                        IndentNextLine = True
                    Case "Public", "Private"
                        If Split(LineText, " ")(1) = "Sub" Or Split(LineText, " ")(1) = "Function" Then
                            IndentNextLine = True
                        End If
                    End Select
                    
                    '判断续行问题
                    If Right(LineText, 2) = " _" And IsAfterUnderLine = False Then
                        IndentNextLine = True
                        IsAfterUnderLine = True
                    ElseIf Right(LineText, 2) <> " _" And IsAfterUnderLine Then
                        BackNextLine = True
                        IsAfterUnderLine = False
                    End If
                    
                    '处理本行的缩进级别
                    If IndentThisLine Then
                        IndentLevel = IndentLevel + 1
                        IndentThisLine = False
                    End If
                    If BackThisLine Then
                        IndentLevel = IndentLevel - 1
                        BackThisLine = False
                    End If
                    
                    On Error GoTo ErrHandler
                    OneComp.CodeModule.ReplaceLine LineIndex, Space$(IndentLevel * 4) & LineText
                    On Error GoTo 0
                    
                    If IndentNextLine Then
                        IndentLevel = IndentLevel + 1
                        IndentNextLine = False
                    End If
                    If BackNextLine Then
                        IndentLevel = IndentLevel - 1
                        BackNextLine = False
                    End If
                    
                Next LineIndex
                
            Next LineNo
            
        Next OneComp
        
        Set OneComp = Nothing
        
        Exit Sub
    ErrHandler:
        If IndentLevel < 0 Then IndentLevel = 0
        Resume Next
    End Sub
    

      

  • 相关阅读:
    [置顶] Django 微信开发(一)——环境搭建
    opencv学习_5 (IplImage的结构)
    HDU 3910 (13.10.31)
    Python源码学习七 .py文件的解释
    Android高效加载大图、多图解决方案,有效避免程序内存溢出现象
    记录cocos2d-html5与cocosd-x jsb中遇到的坑
    【PAT Advanced Level】1011. World Cup Betting (20)
    Linux文件实时同步,可实现一对多
    mahout源码分析之DistributedLanczosSolver(五)Job over
    php引入lucene方法
  • 原文地址:https://www.cnblogs.com/nextseven/p/7204366.html
Copyright © 2011-2022 走看看