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
    

      

  • 相关阅读:
    单链表反转
    C++面试题
    堆排序
    1链表:回文链表(leetcode 234)
    深信服社招linux岗面试记录
    腾讯后台开发社招记录(电话面试)
    小米社招ATE岗位记录
    诺基亚社招C++面试记录
    腾讯后台开发社招面试记录
    makefile笔记
  • 原文地址:https://www.cnblogs.com/nextseven/p/7204366.html
Copyright © 2011-2022 走看看