Excel VBA - 코드 편집기에서 라인 번호를 켜는 방법
엑셀 VBA 코드 에디터에서 라인 번호를 켜려면 어떻게 해야 합니까?저는 엑셀 2013 버전을 사용하고 있습니다.
감사해요.
여기 VBE IDE에 라인 번호를 추가하는 코드가 있습니다.엑셀 MVP 마이크릭슨이 여기서 제공하는 솔루션을 개선한 것입니다.이미 만난 적이 있는 드문 경우가 있기 때문에 VBE가 디버그 모드로 들어갈 수 없습니다. 예를 들어 를 사용하는 경우가 있습니다.코드에서 Line 메서드를 바꿉니다.실제로 한번 실행되면 디버그 모드로 들어갈 수 없기 때문에 Erl은 디버그 대신 디버그에 유용할 수 있습니다.Print). 다음과 같은 기능을 추가했습니다.
- 할 수 .
10: Dim foo as bar
: 또는탭 으로구분단일숫자된와드:10 Dim foo as bar
- 절차 종료 문에 줄 번호를 추가하고, 절차 선언 행의 들여쓰기를 해당 절차 종료 문 행에 일치시킬 수 있습니다.그렇지 않으면.
- 빈 줄에 줄 번호를 추가할 수 있는지 여부
- [WIP] 모듈의 특정 프로시저에 라인 번호를 추가할 수 있음
- [WIP] 코드 줄의 모든 들여쓰기를 줄 번호와 일치시켜 들여쓰기된 마지막 줄의 들여쓰기와 일치시킵니다.마지막 줄이 다음과 같다면
200: End Sub
30: With ActiveSheet
다음과 같이 다시 들여쓰기됩니다.30: ActiveSheet
- [WIP] VBE IDE 명령을 추가하여 현재 모듈/proc를 매개 변수로 사용하여 직접 호출
Public Enum vbLineNumbers_LabelTypes
vbLabelColon ' 0
vbLabelTab ' 1
End Enum
Public Enum vbLineNumbers_ScopeToAddLineNumbersTo
vbScopeAllProc ' 1
vbScopeThisProc ' 2
End Enum
Sub AddLineNumbers(ByVal wbName As String, _
ByVal vbCompName As String, _
ByVal LabelType As vbLineNumbers_LabelTypes, _
ByVal AddLineNumbersToEmptyLines As Boolean, _
ByVal AddLineNumbersToEndOfProc As Boolean, _
ByVal Scope As vbLineNumbers_ScopeToAddLineNumbersTo, _
Optional ByVal thisProcName As String)
' USAGE RULES
' DO NOT MIX LABEL TYPES FOR LINE NUMBERS! IF ADDING LINE NUMBERS AS COLON TYPE, ANY LINE NUMBERS AS VBTAB TYPE MUST BE REMOVE BEFORE, AND RECIPROCALLY ADDING LINE NUMBERS AS VBTAB TYPE
Dim i As Long
Dim j As Long
Dim procName As String
Dim startOfProcedure As Long
Dim lengthOfProcedure As Long
Dim endOfProcedure As Long
Dim strLine As String
With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule
.CodePane.Window.Visible = False
If Scope = vbScopeAllProc Then
For i = 1 To .CountOfLines
strLine = .Lines(i, 1)
procName = .ProcOfLine(i, vbext_pk_Proc) ' Type d'argument ByRef incompatible ~~> Requires VBIDE library as a Reference for the VBA Project
If procName <> vbNullString Then
startOfProcedure = .ProcStartLine(procName, vbext_pk_Proc)
bodyOfProcedure = .ProcBodyLine(procName, vbext_pk_Proc)
countOfProcedure = .ProcCountLines(procName, vbext_pk_Proc)
prelinesOfProcedure = bodyOfProcedure - startOfProcedure
'postlineOfProcedure = ??? not directly available since endOfProcedure is itself not directly available.
lengthOfProcedure = countOfProcedure - prelinesOfProcedure ' includes postlinesOfProcedure !
'endOfProcedure = ??? not directly available, each line of the proc must be tested until the End statement is reached. See below.
If endOfProcedure <> 0 And startOfProcedure < endOfProcedure And i > endOfProcedure Then
GoTo NextLine
End If
If i = bodyOfProcedure Then InProcBodyLines = True
If bodyOfProcedure < i And i < startOfProcedure + countOfProcedure Then
If Not (.Lines(i - 1, 1) Like "* _") Then
InProcBodyLines = False
PreviousIndentAdded = 0
If Trim(strLine) = "" And Not AddLineNumbersToEmptyLines Then GoTo NextLine
If IsProcEndLine(wbName, vbCompName, i) Then
endOfProcedure = i
If AddLineNumbersToEndOfProc Then
Call IndentProcBodyLinesAsProcEndLine(wbName, vbCompName, LabelType, endOfProcedure)
Else
GoTo NextLine
End If
End If
If LabelType = vbLabelColon Then
If HasLabel(strLine, vbLabelColon) Then strLine = RemoveOneLineNumber(.Lines(i, 1), vbLabelColon)
If Not HasLabel(strLine, vbLabelColon) Then
temp_strLine = strLine
.ReplaceLine i, CStr(i) & ":" & strLine
new_strLine = .Lines(i, 1)
If Len(new_strLine) = Len(CStr(i) & ":" & temp_strLine) Then
PreviousIndentAdded = Len(CStr(i) & ":")
Else
PreviousIndentAdded = Len(CStr(i) & ": ")
End If
End If
ElseIf LabelType = vbLabelTab Then
If Not HasLabel(strLine, vbLabelTab) Then strLine = RemoveOneLineNumber(.Lines(i, 1), vbLabelTab)
If Not HasLabel(strLine, vbLabelColon) Then
temp_strLine = strLine
.ReplaceLine i, CStr(i) & vbTab & strLine
PreviousIndentAdded = Len(strLine) - Len(temp_strLine)
End If
End If
Else
If Not InProcBodyLines Then
If LabelType = vbLabelColon Then
.ReplaceLine i, Space(PreviousIndentAdded) & strLine
ElseIf LabelType = vbLabelTab Then
.ReplaceLine i, Space(4) & strLine
End If
Else
End If
End If
End If
End If
NextLine:
Next i
ElseIf AddLineNumbersToEmptyLines And Scope = vbScopeThisProc Then
End If
.CodePane.Window.Visible = True
End With
End Sub
Function IsProcEndLine(ByVal wbName As String, _
ByVal vbCompName As String, _
ByVal Line As Long) As Boolean
With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule
If Trim(.Lines(Line, 1)) Like "End Sub*" _
Or Trim(.Lines(Line, 1)) Like "End Function*" _
Or Trim(.Lines(Line, 1)) Like "End Property*" _
Then IsProcEndLine = True
End With
End Function
Sub IndentProcBodyLinesAsProcEndLine(ByVal wbName As String, ByVal vbCompName As String, ByVal LabelType As vbLineNumbers_LabelTypes, ByVal ProcEndLine As Long)
Dim procName As String
Dim startOfProcedure As Long
Dim endOfProcedure As Long
With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule
procName = .ProcOfLine(ProcEndLine, vbext_pk_Proc)
bodyOfProcedure = .ProcBodyLine(procName, vbext_pk_Proc)
endOfProcedure = ProcEndLine
strEnd = .Lines(endOfProcedure, 1)
j = bodyOfProcedure
Do Until Not .Lines(j - 1, 1) Like "* _" And j <> bodyOfProcedure
strLine = .Lines(j, 1)
If LabelType = vbLabelColon Then
If Mid(strEnd, Len(CStr(endOfProcedure)) + 1 + 1 + 1, 1) = " " Then
.ReplaceLine j, Space(Len(CStr(endOfProcedure)) + 1) & strLine
Else
.ReplaceLine j, Space(Len(CStr(endOfProcedure)) + 2) & strLine
End If
ElseIf LabelType = vbLabelTab Then
If endOfProcedure < 1000 Then
.ReplaceLine j, Space(4) & strLine
Else
Debug.Print "This tool is limited to 999 lines of code to work properly."
End If
End If
j = j + 1
Loop
End With
End Sub
Sub RemoveLineNumbers(ByVal wbName As String, ByVal vbCompName As String, ByVal LabelType As vbLineNumbers_LabelTypes)
Dim i As Long
With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule
For i = 1 To .CountOfLines
procName = .ProcOfLine(i, vbext_pk_Proc)
If procName <> vbNullString Then
If i = .ProcBodyLine(procName, vbext_pk_Proc) Then InProcBodyLines = True
LenghtBefore = Len(.Lines(i, 1))
If Not .Lines(i - 1, 1) Like "* _" Then
InProcBodyLines = False
.ReplaceLine i, RemoveOneLineNumber(.Lines(i, 1), LabelType)
Else
If IsInProcBodyLines Then
' do nothing
Else
.ReplaceLine i, Mid(.Lines(i, 1), RemovedChars_previous_i + 1)
End If
End If
LenghtAfter = Len(.Lines(i, 1))
LengthBefore_previous_i = LenghtBefore
LenghtAfter_previous_i = LenghtAfter
RemovedChars_previous_i = LengthBefore_previous_i - LenghtAfter_previous_i
If Trim(.Lines(i, 1)) Like "End Sub*" Or Trim(.Lines(i, 1)) Like "End Function" Or Trim(.Lines(i, 1)) Like "End Property" Then
LenOfRemovedLeadingCharacters = LenghtBefore - LenghtAfter
procName = .ProcOfLine(i, vbext_pk_Proc)
bodyOfProcedure = .ProcBodyLine(procName, vbext_pk_Proc)
j = bodyOfProcedure
strLineBodyOfProc = .Lines(bodyOfProcedure, 1)
Do Until Not strLineBodyOfProc Like "* _"
j = j + 1
strLineBodyOfProc = .Lines(j, 1)
Loop
LastLineBodyOfProc = j
strLastLineBodyOfProc = strLineBodyOfProc
strLineEndOfProc = .Lines(i, 1)
For k = bodyOfProcedure To j
.ReplaceLine k, Mid(.Lines(k, 1), 1 + LenOfRemovedLeadingCharacters)
Next k
i = i + (j - bodyOfProcedure)
GoTo NextLine
End If
Else
' GoTo NextLine
End If
NextLine:
Next i
End With
End Sub
Function RemoveOneLineNumber(ByVal aString As String, ByVal LabelType As vbLineNumbers_LabelTypes)
RemoveOneLineNumber = aString
If LabelType = vbLabelColon Then
If aString Like "#:*" Or aString Like "##:*" Or aString Like "###:*" Then
RemoveOneLineNumber = Mid(aString, 1 + InStr(1, aString, ":", vbTextCompare))
If Left(RemoveOneLineNumber, 2) Like " [! ]*" Then RemoveOneLineNumber = Mid(RemoveOneLineNumber, 2)
End If
ElseIf LabelType = vbLabelTab Then
If aString Like "# *" Or aString Like "## *" Or aString Like "### *" Then RemoveOneLineNumber = Mid(aString, 5)
If aString Like "#" Or aString Like "##" Or aString Like "###" Then RemoveOneLineNumber = ""
End If
End Function
Function HasLabel(ByVal aString As String, ByVal LabelType As vbLineNumbers_LabelTypes) As Boolean
If LabelType = vbLabelColon Then HasLabel = InStr(1, aString & ":", ":") < InStr(1, aString & " ", " ")
If LabelType = vbLabelTab Then
HasLabel = Mid(aString, 1, 4) Like "# " Or Mid(aString, 1, 4) Like "## " Or Mid(aString, 1, 4) Like "### "
End If
End Function
Function RemoveLeadingSpaces(ByVal aString As String) As String
Do Until Left(aString, 1) <> " "
aString = Mid(aString, 2)
Loop
RemoveLeadingSpaces = aString
End Function
Function WhatIsLineIndent(ByVal aString As String) As String
i = 1
Do Until Mid(aString, i, 1) <> " "
i = i + 1
Loop
WhatIsLineIndent = i
End Function
Function HowManyLeadingSpaces(ByVal aString As String) As String
HowManyLeadingSpaces = WhatIsLineIndent(aString) - 1
End Function
다음과 같은 전화를 걸 수 있습니다.
Sub AddLineNumbers_vbLabelColon()
AddLineNumbers wbName:="EvaluateCall.xlsm", vbCompName:="ModLineNumbers_testDest", LabelType:=vbLabelColon, AddLineNumbersToEmptyLines:=True, AddLineNumbersToEndOfProc:=True, Scope:=vbScopeAllProc
End Sub
Sub AddLineNumbers_vbLabelTab()
AddLineNumbers wbName:="EvaluateCall.xlsm", vbCompName:="ModLineNumbers_testDest", LabelType:=vbLabelTab, AddLineNumbersToEmptyLines:=True, AddLineNumbersToEndOfProc:=True, Scope:=vbScopeAllProc
End Sub
Sub RemoveLineNumbers_vbLabelColon()
RemoveLineNumbers wbName:="EvaluateCall.xlsm", vbCompName:="ModLineNumbers_testDest", LabelType:=vbLabelColon
End Sub
Sub RemoveLineNumbers_vbLabelTab()
RemoveLineNumbers wbName:="EvaluateCall.xlsm", vbCompName:="ModLineNumbers_testDest", LabelType:=vbLabelTab
End Sub
또한 주의할 점으로 라인 번호에 대한 몇 가지 규칙을 컴파일합니다.
- 하위/함수 선언 문 앞에는 허용되지 않습니다.
- 프로시저 외부에서 허용되지 않음
- 줄 연속 문자 "_"(밑줄) 뒤에 오는 줄에는 사용할 수 없습니다.
- 코드 라인당 둘 이상의 라벨/라인 번호를 가질 수 없습니다 ~~> 라인 번호 이외의 기존 라벨은 테스트해야 합니다. 그렇지 않으면 라인 번호를 강제로 적용하려는 컴파일 오류가 발생합니다.
- ~~을 의미하는 특수 VBA가 이미 있는 문자는 사용할 수 없습니다. 허용되는 문자는 [a-Z], [0-9], 에, 에, 오, €, £, § 및 ":" 단독입니다!
- 컴파일러는 레이블 앞에 있는 모든 공간을 트리밍할 것입니다 ~~> 따라서 레이블이 있는 경우 줄의 첫 번째 문자는 레이블의 첫 번째 문자이므로 공백이 될 수 없습니다.
- 콜론이 있는 라인 번호를 추가하면 ":"와 첫 번째 다음 문자 사이에 공백이 삽입됩니다.
- 탭/스페이스가 있는 줄 번호를 추가할 때 마지막 숫자와 첫 번째 다음 문자 사이에 공백이 적어도 하나 있어야 합니다. 컴파일러는 콜론 구분 기호가 있는 레이블에 대해 추가할 때처럼 추가하지 않습니다.
- .ReplaceLine 메소드는 새로운 라인을 선택하거나 수동으로 컴파일을 다시 시작할 때와 마찬가지로 컴파일 오류를 표시하지 않고 컴파일 규칙을 재정의합니다.
- 컴파일러는 'VBA 환경/시스템보다 빠름'입니다. 예를 들어, 콜론이 있고 공백이 없는 줄 번호 뒤에 를 삽입했습니다.의 경우 선을 바꿉니다.줄 속성이 호출되어 새 문자열을 가져옵니다. 콜론 문자와 문자열의 첫 번째 문자 사이의 공백이 해당 문자열에 이미 추가되었습니다!
- 다음에는 디버그 모드로 전환할 수 없습니다.ReplaceLine은 코드가 실행되고 실행이 재설정될 때까지(편집 중인 모듈 내부 또는 외부에서) 호출되었습니다.
엑셀 2016에 대한 짧은 답변, 2013년에 아직 시도하지 않았습니다.
한 번 실행:
- final의 큰 코드를 붙여넣습니다.
Module2
워크북에 있는 이 답변에 있습니다. - 최종 코드를 붙여넣습니다.
Module3
이 답변의 워크북에 있습니다. - 최종 코드를 붙여넣습니다.
Module4
이 답변의 워크북에 있습니다. - 그런 다음 선을 붙여넣습니다.
Global allow_for_line_addition As String
이는 모든 모듈의 첫 번째 줄에 라인 번호'를 자동으로 추가할 수 있도록 하기 위한 것입니다. - 빈 합니다. ( " " " 않도록" ("Lost")를 입력합니다.
end sub
,end function
또는End Property
모듈의 경우). - VBA 편집기에서 코드를 실행하지 않고 "break" 모드에 있지 않은 동안: 'Microsoft Visual Basic for Applications Extensibility 5'를 클릭합니다.3"
코드를 수정할 때마다 다음을 수행합니다.
- *최종 코드 실행
Module3
워크북의 모든 모듈에 대한 라인 번호를 제거합니다. - *최종 코드 실행
Module4
워크북의 모든 모듈에 줄 번호를 추가합니다.
에 따라 할 수 . put (*put)line 2440:
이상의line 2303:
줄가 다시
긴 답변(학습 단계 및 시도 포함) - 저는 Hymced의 답변을 구현하는 것이 간단하지 않았기 때문에 VBA 코드 편집기(*)에서 모듈에 라인 번호를 추가하는 데 필요한 단계를 문서화했습니다.작동하기 위해 다음 단계를 수행했습니다.
- 이 링크를 통해 vb 구성 요소가 모듈이 될 수 있다는 것을 알게 되었습니다.
- 나는 주어진 첫 번째 코드를 임시로 복사했습니다.
Module2
그리고 두 번째 코드는 임시로 Hymed에 의해 주어진 것입니다.Module3
. 그런 다음 임시로 두 번째 코드의 첫 번째 줄을 수정했습니다.
Module3
대상:AddLineNumbers wbName:="Book1.xlsm", vbCompName:="Module1", LabelType:=vbLabelColon, AddLineNumbersToEmptyLines:=True, AddLineNumbersToEndOfProc:=True, Scope:=vbScopeAllProc
라인에서 오류가 발생했습니다.
procName = .ProcOfLine(i, vbext_pk_Proc) ` Type d`argument ByRef incompatible ~~> Requires VBIDE library as a Reference for the VBA Project
그래서 저는 VBIDE 라이브러리를 활성화해야 한다는 것을 읽었습니다.
그래서 코드를 멈추고, tools > references를 클릭했고, VBIDE 라이브러리를 찾을 수 없었습니다.
이 포럼에서 VBA 확장성 라이브러리에 참조를 추가하여 VBIDE를 사용할 수 있음을 알게 되었습니다.
VBE에서 Tools-References를 클릭하고 아래로 스크롤하여 Microsoft Visual Basic for Applications Extensibility 5.3 항목을 선택합니다.
따라서 이 작업을 수행한 후 첫 번째 오류가 사라졌고 어떤 행도 강조 표시되지 않았지만 "Invalid procedure call or argument"라는 오류가 발생했습니다.
아직 vbCompName에 대해 잘 모르기 때문에 모듈 대신 서브를 알아야 할 것 같아서 임시로 두 번째 코드를 수정하려고 했습니다.
Module3
대상:AddLineNumbers wbName:="Book1.xlsm", vbCompName:="learn", LabelType:=vbLabelColon, AddLineNumbersToEmptyLines:=True, AddLineNumbersToEndOfProc:=True, Scope:=vbScopeAllProc
이는 다음과 같이 강조되었습니다.
With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule
다음과 같은 말:subscript out of range
(그래서 저도 시도했습니다.Module1.learn
그리고.Module1:learn
보하는양을 subscript out of range
-오류.
알고 보니,
AddLineNumbers wbName:="Book1.xlsm", vbCompName:="Module1", LabelType:=vbLabelColon, AddLineNumbersToEmptyLines:=True, AddLineNumbersToEndOfProc:=True, Scope:=vbScopeAllProc
가 라인 제는서다브가같음과은라는 입니다.Module1
설명하는 첫 번째 오류가 발생하지만 코드에 라인 번호를 추가합니다(다음을 포함하는 첫 번째 라인 제외).sub ...
에는 다을포마줄지막는하가 들어있습니다.end sub
.에서테스트 대상Module1
이름 지어진sub learn()
에서 "Excel 2016"이라는 이름은 "Excel 2016"입니다.Book1.xlsm
를 위해 성도를위하여완여▁forlearn
요소:
Sub learn()
ThisWorkbook.Worksheets("Sheet1").Activate
Range("A1").Activate
Range("A1").Select
Range("A1").Value = Range("A1").Value + 1
End Sub
그러나 돌아오는 길에 라인 번호를 제거하고 .lines(0,1)를 물어 오류가 발생했습니다.procName
Sub AddLineNumbers...
그래서 아래의 변경된 코드를 final로 넣어 .lines(0,1)를 제외하도록 수정하였습니다.
Module2
:Public Enum vbLineNumbers_LabelTypes vbLabelColon ' 0 vbLabelTab ' 1 End Enum Public Enum vbLineNumbers_ScopeToAddLineNumbersTo vbScopeAllProc ' 1 vbScopeThisProc ' 2 End Enum Sub AddLineNumbers(ByVal wbName As String, _ ByVal vbCompName As String, _ ByVal LabelType As vbLineNumbers_LabelTypes, _ ByVal AddLineNumbersToEmptyLines As Boolean, _ ByVal AddLineNumbersToEndOfProc As Boolean, _ ByVal Scope As vbLineNumbers_ScopeToAddLineNumbersTo, _ Optional ByVal thisProcName As String) ' USAGE RULES ' DO NOT MIX LABEL TYPES FOR LINE NUMBERS! IF ADDING LINE NUMBERS AS COLON TYPE, ANY LINE NUMBERS AS VBTAB TYPE MUST BE REMOVE BEFORE, AND RECIPROCALLY ADDING LINE NUMBERS AS VBTAB TYPE Dim i As Long Dim j As Long Dim procName As String Dim startOfProcedure As Long Dim lengthOfProcedure As Long Dim endOfProcedure As Long Dim strLine As String With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule .CodePane.Window.Visible = False If Scope = vbScopeAllProc Then For i = 1 To .CountOfLines - 1 strLine = .Lines(i, 1) procName = .ProcOfLine(i, vbext_pk_Proc) ' Type d'argument ByRef incompatible ~~> Requires VBIDE library as a Reference for the VBA Project If procName <> vbNullString Then startOfProcedure = .ProcStartLine(procName, vbext_pk_Proc) bodyOfProcedure = .ProcBodyLine(procName, vbext_pk_Proc) countOfProcedure = .ProcCountLines(procName, vbext_pk_Proc) prelinesOfProcedure = bodyOfProcedure - startOfProcedure 'postlineOfProcedure = ??? not directly available since endOfProcedure is itself not directly available. lengthOfProcedure = countOfProcedure - prelinesOfProcedure ' includes postlinesOfProcedure ! 'endOfProcedure = ??? not directly available, each line of the proc must be tested until the End statement is reached. See below. If endOfProcedure <> 0 And startOfProcedure < endOfProcedure And i > endOfProcedure Then GoTo NextLine End If If i = bodyOfProcedure Then inprocbodylines = True If bodyOfProcedure < i And i < startOfProcedure + countOfProcedure Then If Not (.Lines(i - 1, 1) Like "* _") Then inprocbodylines = False PreviousIndentAdded = 0 If Trim(strLine) = "" And Not AddLineNumbersToEmptyLines Then GoTo NextLine If IsProcEndLine(wbName, vbCompName, i) Then endOfProcedure = i If AddLineNumbersToEndOfProc Then Call IndentProcBodyLinesAsProcEndLine(wbName, vbCompName, LabelType, endOfProcedure) Else GoTo NextLine End If End If If LabelType = vbLabelColon Then If HasLabel(strLine, vbLabelColon) Then strLine = RemoveOneLineNumber(.Lines(i, 1), vbLabelColon) If Not HasLabel(strLine, vbLabelColon) Then temp_strLine = strLine .ReplaceLine i, CStr(i) & ":" & strLine new_strLine = .Lines(i, 1) If Len(new_strLine) = Len(CStr(i) & ":" & temp_strLine) Then PreviousIndentAdded = Len(CStr(i) & ":") Else PreviousIndentAdded = Len(CStr(i) & ": ") End If End If ElseIf LabelType = vbLabelTab Then If Not HasLabel(strLine, vbLabelTab) Then strLine = RemoveOneLineNumber(.Lines(i, 1), vbLabelTab) If Not HasLabel(strLine, vbLabelColon) Then temp_strLine = strLine .ReplaceLine i, CStr(i) & vbTab & strLine PreviousIndentAdded = Len(strLine) - Len(temp_strLine) End If End If Else If Not inprocbodylines Then If LabelType = vbLabelColon Then .ReplaceLine i, Space(PreviousIndentAdded) & strLine ElseIf LabelType = vbLabelTab Then .ReplaceLine i, Space(4) & strLine End If Else End If End If End If End If NextLine: Next i ElseIf AddLineNumbersToEmptyLines And Scope = vbScopeThisProc Then End If .CodePane.Window.Visible = True End With End Sub Function IsProcEndLine(ByVal wbName As String, _ ByVal vbCompName As String, _ ByVal Line As Long) As Boolean With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule If Trim(.Lines(Line, 1)) Like "End Sub*" _ Or Trim(.Lines(Line, 1)) Like "End Function*" _ Or Trim(.Lines(Line, 1)) Like "End Property*" _ Then IsProcEndLine = True End With End Function Sub IndentProcBodyLinesAsProcEndLine(ByVal wbName As String, ByVal vbCompName As String, ByVal LabelType As vbLineNumbers_LabelTypes, ByVal ProcEndLine As Long) Dim procName As String Dim startOfProcedure As Long Dim endOfProcedure As Long With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule procName = .ProcOfLine(ProcEndLine, vbext_pk_Proc) bodyOfProcedure = .ProcBodyLine(procName, vbext_pk_Proc) endOfProcedure = ProcEndLine strEnd = .Lines(endOfProcedure, 1) j = bodyOfProcedure Do Until Not .Lines(j - 1, 1) Like "* _" And j <> bodyOfProcedure strLine = .Lines(j, 1) If LabelType = vbLabelColon Then If Mid(strEnd, Len(CStr(endOfProcedure)) + 1 + 1 + 1, 1) = " " Then .ReplaceLine j, Space(Len(CStr(endOfProcedure)) + 1) & strLine Else .ReplaceLine j, Space(Len(CStr(endOfProcedure)) + 2) & strLine End If ElseIf LabelType = vbLabelTab Then If endOfProcedure < 1000 Then .ReplaceLine j, Space(4) & strLine Else Debug.Print "This tool is limited to 999 lines of code to work properly." End If End If j = j + 1 Loop End With End Sub Sub RemoveLineNumbers(ByVal wbName As String, ByVal vbCompName As String, ByVal LabelType As vbLineNumbers_LabelTypes) Dim i As Long With Workbooks(wbName).VBProject.VBComponents(vbCompName).CodeModule 'MsgBox ("nr of lines = " & .CountOfLines & vbNewLine & "Procname = " & procName) 'MsgBox ("nr of lines REMEMBER MUST BE LARGER THAN 7! = " & .CountOfLines) For i = 1 To .CountOfLines procName = .ProcOfLine(i, vbext_pk_Proc) If procName <> vbNullString Then If i > 1 Then 'MsgBox ("Line " & i & " is a body line " & .ProcBodyLine(procName, vbext_pk_Proc)) If i = .ProcBodyLine(procName, vbext_pk_Proc) Then inprocbodylines = True If .Lines(i - 1, 1) <> "" Then 'MsgBox (.Lines(i - 1, 1)) End If If Not .Lines(i - 1, 1) Like "* _" Then 'MsgBox (inprocbodylines) inprocbodylines = False 'MsgBox ("recoginized a line that should be substituted: " & i) 'MsgBox ("about to replace " & .Lines(i, 1) & vbNewLine & " with: " & RemoveOneLineNumber(.Lines(i, 1), LabelType) & vbNewLine & " with label type: " & LabelType) .ReplaceLine i, RemoveOneLineNumber(.Lines(i, 1), LabelType) Else If IsInProcBodyLines Then ' do nothing 'MsgBox (i) Else .ReplaceLine i, Mid(.Lines(i, 1), RemovedChars_previous_i + 1) End If End If End If Else ' GoTo NextLine End If NextLine: Next i End With End Sub Function RemoveOneLineNumber(ByVal aString As String, ByVal LabelType As vbLineNumbers_LabelTypes) RemoveOneLineNumber = aString If LabelType = vbLabelColon Then If aString Like "#:*" Or aString Like "##:*" Or aString Like "###:*" Or aString Like "####:*" Then RemoveOneLineNumber = Mid(aString, 1 + InStr(1, aString, ":", vbTextCompare)) If Left(RemoveOneLineNumber, 2) Like " [! ]*" Then RemoveOneLineNumber = Mid(RemoveOneLineNumber, 2) End If ElseIf LabelType = vbLabelTab Then If aString Like "# *" Or aString Like "## *" Or aString Like "### *" Or aString Like "#### *" Then RemoveOneLineNumber = Mid(aString, 5) If aString Like "#" Or aString Like "##" Or aString Like "###" Or aString Like "####" Then RemoveOneLineNumber = "" End If End Function Function HasLabel(ByVal aString As String, ByVal LabelType As vbLineNumbers_LabelTypes) As Boolean If LabelType = vbLabelColon Then HasLabel = InStr(1, aString & ":", ":") < InStr(1, aString & " ", " ") If LabelType = vbLabelTab Then HasLabel = Mid(aString, 1, 4) Like "# " Or Mid(aString, 1, 4) Like "## " Or Mid(aString, 1, 4) Like "### " Or Mid(aString, 1, 5) Like "#### " End If End Function Function RemoveLeadingSpaces(ByVal aString As String) As String Do Until Left(aString, 1) <> " " aString = Mid(aString, 2) Loop RemoveLeadingSpaces = aString End Function Function WhatIsLineIndent(ByVal aString As String) As String i = 1 Do Until Mid(aString, i, 1) <> " " i = i + 1 Loop WhatIsLineIndent = i End Function Function HowManyLeadingSpaces(ByVal aString As String) As String HowManyLeadingSpaces = WhatIsLineIndent(aString) - 1 End Function
경는우에서 대체 .sub learn()
아래 코드로 임시로 붙여넣음 module3
:
Sub AddLineNumbers_vbLabelColon()
AddLineNumbers wbName:="Book1.xlsm", vbCompName:="Module1", LabelType:=vbLabelColon, AddLineNumbersToEmptyLines:=True, AddLineNumbersToEndOfProc:=True, Scope:=vbscopeallproc
End Sub
Sub AddLineNumbers_vbLabelTab()
AddLineNumbers wbName:="Book1.xlsm", vbCompName:="Module1", LabelType:=vbLabelTab, AddLineNumbersToEmptyLines:=True, AddLineNumbersToEndOfProc:=True, Scope:=vbscopeallproc
End Sub
Sub RemoveLineNumbers_vbLabelColon()
RemoveLineNumbers wbName:="Book1.xlsm", vbCompName:="Module1", LabelType:=vbLabelColon
End Sub
Sub RemoveLineNumbers_vbLabelTab()
RemoveLineNumbers wbName:="Book1.xlsm", vbCompName:="Module1", LabelType:=vbLabelTab
End Sub
이제 작동했습니다(라인 번호 추가 및 제거 모두 가능, 임시로 붙여넣은 라인 번호의 추가/제거를 호출하는 4가지 방법 모두 사용). module2
(단일 서브의 경우)module1
는 같은두 개의 했습니다.그래서 같은 모듈에 2개의 서브를 서로 뒤로 붙이려고 했습니다.이 경우 코드는 두 번째 서브에 대한 추가 라인 번호를 변경하지 않았습니다.
저는 위서에다줄추다니습가했을 위에 했습니다.
Module1
:Global allow_for_line_addition As String
Module1
모양:
Global allow_for_line_addition As String
Sub learn()
ThisWorkbook.Worksheets("Sheet1").Activate
Range("A1").Activate
Range("A1").Select
Range("A1").Value = Range("A1").Value + 1
End Sub
Sub learn2()
ThisWorkbook.Worksheets("Sheet1").Activate
Range("A1").Activate
Range("A1").Select
Range("A1").Value = Range("A1").Value + 1
End Sub
했습니다.s answer as well and already put it in the long code of **final**
모듈 2'.
참고: 하위 또는 함수의 끝에 빈 흰색 줄이 있으면 스크립트를 실행하여 줄 번호를 추가할 때마다 흰색 줄이 계속 추가됩니다(첫 번째 실행 후에는 줄 번호만 업데이트됨).이러한 빈 줄 번호는 코드를 실행할 때 오류를 발생시키므로 한 번 제거해야 합니다.하위 항목의 끝에 빈 줄이 없으면 이 코드도 새 줄을 추가하지 않습니다.
워크북의 모든 모듈에 라인 번호를 추가하려면 긴 코드를 마지막으로 유지합니다.
Module2
내가 수정하고 임시 코드를 대체했기 때문에.Module3
최종적으로Module3
:Global allow_for_line_addition As String 'this is just so that you can automatically add linenumbers Sub remove_line_numbering_all_modules() 'source: https://stackoverflow.com/questions/36791473/vba-getting-the-modules-in-workbook 'This code numbers all the modules in your .xlsm Dim vbcomp As VBComponent Dim modules As Collection Set modules = New Collection For Each vbcomp In ThisWorkbook.VBProject.VBComponents 'if normal or class module If ((vbcomp.Type = vbext_ct_StdModule) Or (vbcomp.Type = vbext_ct_ClassModule)) Then 'V0: RemoveLineNumbers wbName:=ThisWorkbook.name, vbCompName:=vbcomp.name, LabelType:=vbLabelColon 'V1: 'Call RemoveLineNumbers(ThisWorkbook.name, vbcomp.name) End If Next vbcomp End Sub
그리고 다음 코드를 final에 추가합니다.
Module4
:Global allow_for_line_addition As String 'this is just so that you can automatically add linenumbers 'This sub adds line numbers to all the modules after you have added the following line to every module 'add tools references microsoft visual basic for applications (5.3) as checked 'Source httpsstackoverflow.comquestions40731182excel-vba-how-to-turn-on-line-numbers-in-code-editor50368332#50368332 Sub add_line_numbering_all_modules() 'source: https://www.stackoverflow.com/questions/36791473/vba-getting-the-modules-in-workbook 'This code numbers all the modules in your .xlsm Dim vbcomp As VBComponent Dim modules As Collection Set modules = New Collection For Each vbcomp In ThisWorkbook.VBProject.VBComponents 'if normal or class module If ((vbcomp.Type = vbext_ct_StdModule) Or (vbcomp.Type = vbext_ct_ClassModule)) Then 'V0: Call AddLineNumbers(ThisWorkbook.name, vbcomp.name, vbLabelColon, True, True, vbScopeAllProc) 'v1 'Call AddLineNumbers(ThisWorkbook.name, vbcomp.name) End If Next vbcomp End Sub
당신이 대체할 수 있는 곳."Book1.xlsm"
워크북 이나 자의워이로으름는, 또신북과 .thisworkbook
("아니오"로 표시) 또는 그 반대입니다.
간편한 솔루션:
- VBA 편집기에서 CTRL+A를 누르고 모든 코드를 복사합니다.
- 새 단어 문서로 이동하여 코딩 통과
- 리본에서 'Layout(레이아웃)'을 선택하고 'Line Numbering(라인 번호 지정)'을 선택합니다.
- '연속'을 선택합니다.
코딩에 있는 Voila 라인 번호 ;-)
언급URL : https://stackoverflow.com/questions/40731182/excel-vba-how-to-turn-on-line-numbers-in-code-editor
'programing' 카테고리의 다른 글
ASP.NET Core: 게시 시 파일 제외 또는 포함 (0) | 2023.07.12 |
---|---|
Android Developer Console의 앱 목록에서 프로그램을 제거하는 방법 (0) | 2023.07.12 |
ORA-02273 수정: 이 고유/기본 키가 일부 외부 키에서 참조됩니다. (0) | 2023.07.12 |
한 Gitrepo에서 다른 Gitrepo로 커밋을 복사하는 방법은 무엇입니까? (0) | 2023.07.12 |
Java 구성을 사용하는 @Spring(Boot)의 예약된 작업에 대한 범용 예외 처리기 (0) | 2023.07.12 |