Excel VBA — Как включить номера строк в редакторе кода

Пожалуйста, помогите: как мне включить номера строк в редакторе кода Excel VBA? Я использую версию Excel 2013.

Спасибо.


Вот мой код для добавления номеров строк в VBE IDE. Это усовершенствование решения, предоставленного здесь Excel MVP mikerickson. Я работал над этим, потому что в некоторых редких случаях, которые я уже встречал, VBE не может войти в режим отладки, например, когда у вас есть метод .ReplaceLine в вашем коде. Действительно, вы не можете войти в режим отладки после его выполнения, поэтому Erl может быть полезен для отладки (вместо Debug.Print). Я добавил несколько функций, таких как:

  • возможность добавлять номера строк в виде меток: 10: Dim foo as bar или в виде отдельных чисел, отделенных от кода табуляцией: 10 Dim foo as bar
  • возможность добавлять номера строк в операторы конца процедур и соответствовать отступ строк объявления процедуры до строки оператора End после нумерации. Или нет.
  • возможность добавления номеров строк к пустым строкам или нет
  • [WIP] возможность добавления номеров строк к определенной процедуре в модуле
  • [WIP] сопоставить все отступы строк кода с номерами строк, чтобы соответствовать отступу последней строки с отступом. Если последняя строка — 200: End Sub , строка 30: With ActiveSheet будет иметь новый отступ как 30: ActiveSheet
  • [WIP] добавление команды VBE IDE для прямого выполнения вызовов с текущим модулем/proc в качестве параметра
   Public Enum vbLineNumbers_LabelTypes vbLabelColon '0 vbLabelTab' 1End EnumPublic Enum vbLineNumbers_ScopeToAddLineNumbersTo vbScopeAllProc '1 vbScopeThisProc' 2END EnumSub AddLineNumbers (ByVal wbName As String, _ ByVal vbCompName As String, _ ByVal LabelType Как vbLineNumbers_LabelTypes, _ ByVal AddLineNumbersToEmptyLines As Boolean, _  ByVal AddLineNumbersToEndOfProc как логическое, _ ByVal Scope как vbLineNumbers_ScopeToAddLineNumbersTo, _ необязательно ByVal thisProcName как строка) «ПРАВИЛА ИСПОЛЬЗОВАНИЯ» НЕ СМЕШАЙТЕ ТИПЫ ЭТИКЕТКИ ДЛЯ НОМЕРОВ СТРОК!  ПРИ ДОБАВЛЕНИИ НОМЕРОВ СТРОК В КАЧЕСТВЕ ТОЛЧКОЙ ТИПА, ЛЮБЫЕ НОМЕРА СТРОК В КАЧЕСТВЕ ТИПА VBTAB ДОЛЖНЫ БЫТЬ УДАЛЕНЫ ПЕРЕД, И ДОБАВЛЕНИЕ НОМЕРА СТРОК В КАЧЕСТВЕ VBTAB TYPE  Длинная Dim strLine как строка с книгами (wbName) .VBProject.VBComponents (vbCompName) .CodeModule .CodePane.Window.Visible = FalseIf Scope = vbScopeAllProc Then For i = 1 To .CountOfLines strLine = 1 procName =.  ProcOfLine (i, vbext_pk_Proc) 'Тип аргумента ByRef несовместим ~~> Требуется библиотека VBIDE в качестве ссылки для проекта VBA.  countOfProcedure =. ProcCountLines (procName, vbext_pk_Proc) prelinesOfProcedure = bodyOfProcedure - startOfProcedure 'postlineOfProcedure = ???  не доступен напрямую, так как endOfProcedure не доступен напрямую.  lengthOfProcedure = countOfProcedure - prelinesOfProcedure 'включает postlinesOfProcedure!  'endOfProcedure = ???  не доступен напрямую, каждая строка процедуры должна быть протестирована, пока не будет достигнут оператор End.  См. ниже.  Если endOfProcedure  0 и startOfProcedure  endOfProcedure Then GoTo NextLine End If If i = bodyOfProcedure Then InProcBodyLines = True If bodyOfProcedure  bodyOfProcedure strLine = .Lines (j, 1) Если LabelType = vbLabelColon Then If (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  vbNullString Then If i = .ProcBodyLine (procName, vbext_pk_Proc) Then InProcBodyLines = True LenghtBefore = Len (.Lines) Если Not (i., 1Lines)  (i - 1, 1) Как "* _" Тогда InProcBodyLines = False .ReplaceLine i, RemoveOneLineNumber (.Lines (i, 1), LabelType) Иначе Если IsInProcBodyLines Then 'ничего не делать Остальное .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, Like (1 Sub)  * "Или обрезать (.Lines (i, 1)) как" End Function "или Trim (.Lines (i, 1)) Like" End  Свойство «Then LenOfRemovedLeadingCharacters = LenghtBefore - LenghtAfter procName = .ProcOfLine (i, vbext_pk_Proc) bodyOfProcedure = .ProcBodyLine (procName, vbext_pk_Proc) j = bodyOfProcedure» _strcOfLine = jBodyOf  + 1 strLineBodyOfProc = .Lines (j, 1) Цикл LastLineBodyOfProc = j strLastLineBodyOfProc = strLineBodyOfProc strLineEndOfProc = .Lines (i, 1) For k = bodyOfProcedure To j .ReplaceLine k, Mid (. Строки (k, 1), 1 + LenOfRemovedLeadingCharacters) Next ki = i + (j - bodyOfProcedure) GoTo NextLine End If Else 'GoTo NextLine End IfNextLine: Next i End WithEnd Подфункция RemoveOneLineNumber (ByValTringAStringOstring As String, ByVal_Val Label)  = aString If LabelType = vbLabelColon Then If aString Like "#: *" Или aString Like "##: *" Или aString Like "###: *" Тогда 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" # * "или aString Like" ## *  "Или aString Like" ### * "Тогда RemoveOneLineNumber = Mid (aString, 5) Если aString Like" # "Или aString Like" ## "или aString Like" ### ", то RemoveOneLineNumber =" "End IfEnd FunctionFunction HasLabel (  ByVal aString как String, ByVal LabelType как vbLineNumbers_LabelTypes) как Boolean Если LabelType = vbLabelColon Then HasLabel = InStr (1, aSt  ring & ":", ":")  "" aString = Mid (aString  , 2) Цикл RemoveLeadingSpaces = aStringEnd FunctionFunction WhatIsLineIndent (ByVal aString As String) As String i = 1 Do до Mid (aString, i, 1)  "" i = i + 1 Loop WhatIsLineIndent = iEnd FunctionFunction HowManyLeadingSpaces (ByVal aString As  ) As String HowManyLeadingSpaces = WhatIsLineIndent (aString) - 1End Function  

Вы можете выполнять следующие вызовы:

  Sub AddLineNumbers_vbLabelColon ()  AddLineNumbers wbName: = «EvaluateCall.xlsm», vbCompName: = «ModLineNumbers_testDest», LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = vbLineScope: = vbLineScope:  s wbName: = "EvaluateCall.xlsm", vbCompName: = "ModLineNumbers_testDest", LabelType: = vbLabelTab, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = True, ScopeNumbers: = vbEndOfProc: = True, ScopeScopeScope: = vbLineNumbers  vbCompName: = "ModLineNumbers_testDest", LabelType: = vbLabelColonEnd SubSub RemoveLineNumbers_vbLabelTab () RemoveLineNumbers wbName: = "EvaluateCall. xlsm ", vbCompName: =" ModLineNumbers_testDest ", LabelType: = vbLabelTabEnd Sub  

И как напоминание, вот некоторые правила компиляции о номерах строк:

  • не допускается перед оператором объявления Sub/Function
  • не допускается вне процедуры
  • не допускается в строке, следующей за символом продолжения строки «_» (подчеркивание)
  • не допускается иметь более одной метки/номера строки на строку кода ~~> Существующие метки, отличные от номеров строк, должны быть проверены, иначе произойдет ошибка компиляции при попытке принудительно номер строки.
  • не разрешено использовать символы, которые уже имеют специальное значение VBA ~~> Допустимые символы: [aZ], [0-9], é, è, ô, ù, € , £, § и даже «:» в одиночку!
  • компилятор обрежет любое пространство перед меткой ~~> Таким образом, если есть метка, первый символ строки является первым символом строки метка, это не может быть пробел.
  • добавление номера строки с двоеточием приведет к вставке пробела между «:» и th первый следующий символ, если его нет
  • при добавлении номера строки с табуляцией/пробелом должен быть хотя бы один пробел между последней цифрой и первым следующим символом, компилятор не будет добавлять это так же, как и для метки с разделителем двоеточия.
  • метод .ReplaceLine переопределит правила компиляции без отображения каких-либо ошибок компиляции, как это происходит в режиме разработки при выборе новой строки или при ручном перезапуске компиляции
  • компилятор «быстрее, чем среда/система VBA»: например, сразу после номера строки с двоеточием и без пробела был вставлен с помощью .ReplaceLine, если свойство .Lines вызывается чтобы получить новую строку, пробел (между символом двоеточия и первым символом строки) уже добавлен в эту строку!
  • невозможно войти в режим отладки после того, как .ReplaceLine имеет был вызван (изнутри или вне модуля, который он редактирует), но не до тех пор, пока код не будет запущен, и выполнения сброса.

Вот мой код для добавления номеров строк в VBE IDE. Это усовершенствование решения, предоставленного здесь Excel MVP mikerickson. Я работал над этим, потому что в некоторых редких случаях, которые я уже встречал, VBE не может войти в режим отладки, например, когда у вас есть метод .ReplaceLine в вашем коде. Действительно, вы не можете войти в режим отладки после его выполнения, поэтому Erl может быть полезен для отладки (вместо Debug.Print). Я добавил несколько функций, таких как:

  • возможность добавлять номера строк в виде меток: 10: Dim foo as bar или в виде отдельных чисел, отделенных от кода табуляцией: 10 Dim foo as bar
  • возможность добавлять номера строк в операторы конца процедур и соответствовать отступ строк объявления процедуры до строки оператора End после нумерации. Или нет.
  • возможность добавления номеров строк к пустым строкам или нет
  • [WIP] возможность добавления номеров строк к определенной процедуре в модуле
  • [WIP] сопоставить все отступы строк кода с номерами строк, чтобы соответствовать отступу последней строки с отступом. Если последняя строка — 200: End Sub , строка 30: With ActiveSheet будет иметь новый отступ как 30: ActiveSheet
  • [WIP] добавление команды VBE IDE для прямого выполнения вызовов с текущим модулем/proc в качестве параметра
   Public Enum vbLineNumbers_LabelTypes vbLabelColon '0 vbLabelTab' 1End EnumPublic Enum vbLineNumbers_ScopeToAddLineNumbersTo vbScopeAllProc '1 vbScopeThisProc' 2END EnumSub AddLineNumbers (ByVal wbName As String, _ ByVal vbCompName As String, _ ByVal LabelType Как vbLineNumbers_LabelTypes, _ ByVal AddLineNumbersToEmptyLines As Boolean, _  ByVal AddLineNumbersToEndOfProc как логическое, _ ByVal Scope как vbLineNumbers_ScopeToAddLineNumbersTo, _ необязательно ByVal thisProcName как строка) «ПРАВИЛА ИСПОЛЬЗОВАНИЯ» НЕ СМЕШАЙТЕ ТИПЫ ЭТИКЕТКИ ДЛЯ НОМЕРОВ СТРОК!  ПРИ ДОБАВЛЕНИИ НОМЕРОВ СТРОК В КАЧЕСТВЕ ТОЛЧКОЙ ТИПА, ЛЮБЫЕ НОМЕРА СТРОК В КАЧЕСТВЕ ТИПА VBTAB ДОЛЖНЫ БЫТЬ УДАЛЕНЫ ПЕРЕД, И ДОБАВЛЕНИЕ НОМЕРА СТРОК В КАЧЕСТВЕ VBTAB TYPE  Длинная Dim strLine как строка с книгами (wbName) .VBProject.VBComponents (vbCompName) .CodeModule .CodePane.Window.Visible = FalseIf Scope = vbScopeAllProc Then For i = 1 To .CountOfLines strLine = 1 procName =.  ProcOfLine (i, vbext_pk_Proc) 'Тип аргумента ByRef несовместим ~~> Требуется библиотека VBIDE в качестве ссылки для проекта VBA.  countOfProcedure = .ProcCountLines (procName, vbext_pk_Proc) prelinesOfProcedure = bodyOfProcedure - startOfProcedure 'postlineOfProcedure = ???  не доступен напрямую, так как endOfProcedure не доступен напрямую.  lengthOfProcedure = countOfProcedure - prelinesOfProcedure 'включает postlinesOfProcedure!  'endOfProcedure = ???  не доступен напрямую, каждая строка процедуры должна быть протестирована, пока не будет достигнут оператор End.  См. ниже.  Если endOfProcedure  0 и startOfProcedure  endOfProcedure Then GoTo NextLine End If If i = bodyOfProcedure Then InProcBodyLines = True If bodyOfProcedure  bodyOfProcedure strLine = .Lines (j, 1) If LabelType = vbLabelColon Then If Mid (strEnd,  Len (CStr (endOfProcedure)) + 1 + 1 + 1, 1) = "" Затем .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  vbNullString Then If i = .ProcBodyLine (procName, vbext_pk_Proc) Then InProcBodyLines = True LenghtBefore = Len (1) If Not.  Строки (i - 1, 1) Как "* _" Тогда InProcBodyLines = False .ReplaceLine i, RemoveOneLineNumber (.Lines (i, 1), LabelType) Иначе Если IsInProcBodyLines Then 'ничего не делать Остальное .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 - LenghtAfter_previous  Sub * "или Trim (.Lines (i, 1)) Like" End Function "или Trim (.Lines (i, 1)) Like" En  d Свойство «Then LenOfRemovedLeadingCharacters = LenghtBefore - LenghtAfter procName = .ProcOfLine (i, vbext_pk_Proc) bodyOfProcedure = .ProcBodyLine (procName, vbext_pk_Proc) j = bodyOfProcedureLoot_StrLine_BodyOfProcedure_StrLine_BodyOfProcedure_StrLine =.  j + 1 strLineBodyOfProc = .Lines (j, 1) Цикл LastLineBodyOfProc = j strLastLineBodyOfProc = strLineBodyOfProc strLineEndOfProc = .Lines (i, 1) Для k = bodyOfProcedure To j .ReplaceLine k, Mid. Строки (k, 1), 1 + LenOfRemovedLeadingCharacters) Next ki = i + (j - bodyOfProcedure) GoTo NextLine End If Else 'GoTo NextLine End IfNextLine: Next i End WithEnd Подфункция RemoveOneLineNumber (ByValTringAStringOstring As String, ByVal_Val Label)  = aString If LabelType = vbLabelColon Then If aString Like "#: *" Или aString Like "##: *" Или aString Like "###: *" Тогда 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" # * "или aString Like" ## *  "Или aString Like" ### * "Тогда RemoveOneLineNumber = Mid (aString, 5) Если aString Like" # "Или aString Like" ## "или aString Like" ### ", то RemoveOneLineNumber =" "End IfEnd FunctionFunction HasLabel (  ByVal aString как String, ByVal LabelType как vbLineNumbers_LabelTypes) как Boolean Если LabelType = vbLabelColon Then HasLabel = InStr (1, aSt  ring & ":", ":")  "" aString = Mid (aString  , 2) Цикл RemoveLeadingSpaces = aStringEnd FunctionFunction WhatIsLineIndent (ByVal aString As String) As String i = 1 Do до Mid (aString, i, 1)  "" i = i + 1 Loop WhatIsLineIndent = iEnd FunctionFunction HowManyLeadingSpaces (ByVal aString As  ) As String HowManyLeadingSpaces = WhatIsLineIndent (aString) - 1End Function  

Вы можете выполнять следующие вызовы:

  Sub AddLineNumbers_vbLabelColon ()  AddLineNumbers wbName: = «EvaluateCall.xlsm», vbCompName: = «ModLineNumbers_testDest», LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = vbLineScope: = vbLineScope:  s wbName: = "EvaluateCall.xlsm", vbCompName: = "ModLineNumbers_testDest", LabelType: = vbLabelTab, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = True, ScopeNumbers: = vbEndOfProc: = True, ScopeScopeScope: = vbLineNumbers  vbCompName: = "ModLineNumbers_testDest", LabelType: = vbLabelColonEnd SubSub RemoveLineNumbers_vbLabelTab () RemoveLineNumbers wbName: = "EvaluateCall. xlsm ", vbCompName: =" ModLineNumbers_testDest ", LabelType: = vbLabelTabEnd Sub  

И как напоминание, вот некоторые правила компиляции о номерах строк:

  • не допускается перед оператором объявления Sub/Function
  • не допускается вне процедуры
  • не допускается в строке, следующей за символом продолжения строки «_» (подчеркивание)
  • не допускается иметь более одной метки/номера строки на строку кода ~~> Существующие метки, отличные от номеров строк, должны быть проверены, иначе произойдет ошибка компиляции при попытке принудительно номер строки.
  • не разрешено использовать символы, которые уже имеют специальное значение VBA ~~> Допустимые символы: [aZ], [0-9], é, è, ô, ù, € , £, § и даже «:» в одиночку!
  • компилятор обрежет любое пространство перед меткой ~~> Таким образом, если есть метка, первый символ строки является первым символом строки метка, это не может быть пробел.
  • добавление номера строки с двоеточием приведет к вставке пробела между «:» и th первый следующий символ, если его нет
  • при добавлении номера строки с табуляцией/пробелом должен быть хотя бы один пробел между последней цифрой и первым следующим символом, компилятор не будет добавлять это так же, как и для метки с разделителем двоеточия.
  • метод .ReplaceLine переопределит правила компиляции без отображения ошибок компиляции, как это происходит в режиме разработки при выборе новой строки или при ручном перезапуске компиляции
  • компилятор «быстрее, чем среда/система VBA»: например, сразу после номера строки с двоеточием и без пробела был вставлен с помощью .ReplaceLine, если свойство .Lines вызывается чтобы получить новую строку, пробел (между символом двоеточия и первым символом строки) уже добавлен в эту строку!
  • невозможно войти в режим отладки после того, как .ReplaceLine имеет был вызван (изнутри или вне модуля, который он редактирует), не до тех пор, пока код не будет запущен, и сброс выполнения.

Краткий ответ для excel 2016, еще не пробовал в 2013 году.

Сделайте Один раз:

  1. Вставьте большой код из final Module2 в этот ответ в свой рабочая книга.
  2. Вставьте код для final Module3 в этот ответ в своей книге.
  3. Вставьте код для final Module4 в этот ответ в свою книгу.
  4. Затем вставьте строку Global allow_for_line_addition As String это просто для того, чтобы вы могли автоматически добавлять льняные числа выше/в первую строку каждого модуля.
  5. Удалите все пустые строки в конце каждого модуля ( поэтому после последней end sub , end function или End Property модуля не происходит потерь).
  6. В редакторе VBA, когда код не запущен и не находится в режиме «break»: щелкните инструменты> ссылки> отметьте: `Microsoft Visual Basic for Applications Extensibility 5.3″

Выполняйте каждый раз, когда вы изменяли свой код:

  1. * Запускайте код для final Module3 , чтобы удалить номера строк для всех модулей в вашей книге.
  2. * Запустите код для final Module4 , чтобы добавить номера строк ко всем модулям в вашей книге.

(* потому что иногда вы получаете ошибку, если вырезаете строки или переместите их (например, поместите строка 2440: выше строка 2303: ). Удаляя и повторно добавляя их, нумерация строк снова автоматически корректируется)

Длинный ответ (включая шаги и попытки обучения) — для меня было непросто реализовать ответ hymced, поэтому я задокументировал шаги, необходимые для добавления строки числа в модуль в коде VBA e ditor (* и удалите их снова). Я выполнил следующие шаги, чтобы заставить его работать.

  1. Из этой ссылки я узнал, что vbcomponent может быть модулем.
  2. Я скопировал первый код передан в временный Module2 , а второй код передан в временный Module3 .
  3. Затем изменил первую строку 2-го кода в временном Module3 на :

      AddLineNumbers wbName: = "Book1.xlsm", vbCompName: = "Module1", LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfcopeProc: = True, ScopeProc: = True, S  vbScopeAllProc  
  4. У меня ошибка в строке:

      procName = .ProcOfLine (i  , vbext_pk_Proc) `Type d`argument ByRef несовместимо ~~> Требуется библиотека VBIDE в качестве ссылки для проекта VBA  
  5. Итак, я прочитал, что для включения библиотеки VBIDE.

  6. Итак, я остановил код, щелкнул инструменты> ссылки и не смог найти библиотеку VBIDE.

  7. На этом форуме я обнаружил, что VBIDE включается путем добавления ссылки на библиотеку расширяемости VBA:

Щелкните Инструменты-Ссылки в VBE, прокрутите вниз и отметьте запись Microsoft Visual Basic for Applications Extensibility 5.3.

Итак, после этого первая ошибка исчезла, и она не выделяла ни одной строки, но выдавала он выдал ошибку «Неверный вызов процедуры или аргумент».

  1. Поскольку я все еще не уверен насчет vbCompName, я подумал, что ему, возможно, потребуется знать подпрограмму вместо модуля, поэтому я попытался изменить второй код в временном Module3 для:

      AddLineNumbers wbName: = "Book1. xlsm ", vbCompName: =" learn ", LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = True, Scope: = vbScopeAllProc  
  2. Это выделило строку:

      С книгами (wbName) .VBProject.VBComponents (vbCompName) .CodeModule 

говорит: индекс вне допустимого диапазона . (Так что я также попробовал: Module1.learn и Module1: learn , что дает нижний индекс вне диапазона -error.

Как оказалось,

  AddLineNumbers  wbName: = "Book1.xlsm", vbCompName: = "Module1", LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = True, Scope: = vbScopeAllProc  

— это Module1 . Первая описанная ошибка возникает, но она добавляет номера строк в код (кроме первой строки, содержащей s ub ... и последняя строка, содержащая end sub . Протестировано в Module1 с именем sub learn () книги Excel 2016 с именем Book1.xlsm . Для полноты картины learn состоит из:

  Sub learn () ThisWorkbook.Worksheets ("Sheet1"). Активировать Range ("A1").  Активировать диапазон ("A1"). Выберите диапазон ("A1"). Значение = Range ("A1"). Value + 1End Sub  

Однако на обратном пути удаление номера строк, это привело к ошибке, потому что он запрашивает .lines (0,1) из procName в Sub AddLineNumbers ...

  1. Поэтому я изменил его, чтобы исключить .lines (0,1), поместив измененный код ниже в final Module2 :

      Публичное перечисление vbLineNumbers_LabelTypes vbLabelColon '0 vbLabelTab' 1End EnumPublic Enum vbLineNumbers_ScopeToAddLineNumbersTo vbScopeAllProc '1 vbScopeLineNumbers  String, _ ByVal LabelType как vbLineNumbers_LabelTypes, _ ByVal AddLineNumbersToEmptyLines как логическое, _ ByVal AddLineNumbersToEndOfProc как логическое, _ ByVal Scope как vbLineNumbers_ScopeToAddLine  NumbersTo, _ Необязательно ByVal thisProcName As String) «ПРАВИЛА ИСПОЛЬЗОВАНИЯ» НЕ СМЕШАЙТЕ ТИПЫ ЭТИКЕТК ДЛЯ НОМЕРОВ СТРОК!  ПРИ ДОБАВЛЕНИИ НОМЕРОВ СТРОК В КАЧЕСТВЕ ТОЛЧИНОЙ, ЛЮБЫЕ НОМЕРА СТРОК В КАЧЕСТВЕ ТИПА VBTAB ДОЛЖНЫ БЫТЬ УДАЛЕНЫ ПЕРЕД НАЧАЛОМ И ДОБАВЛЕНИЕ НОМЕРА ЛИНИЙ В КАЧЕСТВЕ VBTAB TYPE  Длинная Dim strLine как строка с книгами (wbName) .VBProject.VBComponents (vbCompName) .CodeModule .CodePane.Window.Visible = FalseIf Scope = vbScopeAllProc Then For i = 1 To .CountOfLines - 1 strLine, 1 procName (i = 1 strLine, 1) proc  знак равно. ProcOfLine (i, vbext_pk_Proc) 'Тип аргумента ByRef несовместим ~~> Требуется библиотека VBIDE в качестве справочника для проекта VBA Если procName  vbNullString Then startOfProcedure = .ProcStartLine (procName, vbext_pk_Procine, procName, vbext_pk_Procée) = (procName) bodyOfProced_  countOfProcedure = .ProcCountLines (procName, vbext_pk_Proc) prelinesOfProcedure = bodyOfProcedure - startOfProcedure 'postlineOfProcedure = ???  не доступен напрямую, так как endOfProcedure не доступен напрямую.  lengthOfProcedure = countOfProcedure - prelinesOfProcedure 'включает postlinesOfProcedure!  'endOfProcedure = ???  не доступен напрямую, каждая строка процедуры должна быть протестирована, пока не будет достигнут оператор End.  См. ниже.  Если endOfProcedure  0 и startOfProcedure  endOfProcedure Then GoTo NextLine End If If i = bodyOfProcedure Then inprocbodylines = True Если bodyOfProcedure  bodyOfProcedure strLine = .Lines (j, 1) Если LabelType = vbLabelColon Then If Mid (strEnd, Len (CStr (endOfProcedure))  + 1 + 1 + 1, 1) = "" Затем .ReplaceLine j, Space (Len (CStr (endOfProcedure)) + 1) & strLine Else .ReplaceLine j, Space (Len (CStr (endOfProcedure)) + 2) & strLine  Конец, если ElseIf LabelType = vbLabelTab Then If endOfProcedure  vbNullString Then If i> 1 Then 'MsgBox («Строка» & i & «является строкой тела» & .ProcBodyLine (procName, vbext_pk_Proc)) Если i = .ProcBodyLine (procName,  vbext_pk_Proc) Then inprocbodylines = True If .Lines (i - 1, 1)  "" Then 'MsgBox (.Lines (i - 1, 1)) End If Not .Lines (i - 1, 1) Like "*  _ "Затем 'MsgBox (inprocbodylines) inprocbodylines = False' MsgBox (" распознал строку, которую следует заменить: "& i) 'MsgBox (" собираюсь заменить "& .Lines (i, 1) & vbNewLine &" на: "  & RemoveOneLineNumber (.Lines (i, 1),  LabelType) & vbNewLine & "с типом метки:" & LabelType) .ReplaceLine i, RemoveOneLineNumber (.Lines (i, 1), LabelType) Else If IsInProcBodyLines Then 'ничего не делать' MsgBox (i) Else .ReplaceLine i, Mid (. Строки (i, 1), RemovedChars_previous_i + 1) End If End If End If Else 'GoTo NextLine End IfNextLine: Next i End WithEnd Подфункция RemoveOneLineNumber (ByVal aString как строка, ByVal LabelType как vbLineNumbers_LabelTypes, затем  Если aString Like "#: *" или aString Like "##: *" Или aString Like "###: *" или aString Like "####: *", то 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 "# *" или aString Like  "## *" Или aString Like "### *" или aString Like "#### *" Тогда RemoveOneLineNumber = Mid (aString, 5) Если aString Like "#" Или aString Like "##" Или aString Like "  ### "Или aString Like" #### "Then RemoveOneLineNumber =" "End IfEnd Function Function HasLabel (ByVal aString как String, ByVal LabelType как vbLineNumbers_LabelTypes) как Boolean If LabelType = vbLabelCo  lon Then HasLabel = InStr (1, aString & ":", ":")  "" aString = Mid (aString, 2) Loop RemoveLeadingSpaces = aStringEnd Function Function WhatIsLineIndent (ByVal aString как String) As String i = 1 Do до Mid (  aString, i, 1)  "" i = i + 1 Loop WhatIsLineIndent = iEnd Function Function HowManyLeadingSpaces (ByVal aString As String) As String HowManyLeadingSpaces = WhatIsLineIndent (aString) - 1End Function  

С вызовом замены в sub learn () с приведенным ниже кодом, вставленным в временный module3 :

  Sub AddLineNumbers_vbLabelColon () AddLineNumbers wbName: = "Book1.xlsm", vbCompName: = "Modul  e1 ", LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = True, Scope: = vbscopeallprocEnd SubSub AddLineNumbers_vbLabelTab () AddLineNumbers 1.BName: =":  = True, AddLineNumbersToEndOfProc: = True, Scope: = vbscopeallprocEnd SubSub RemoveLineNumbers_vbLabelColon () RemoveLineNumbers wbName: = "Book1.xlsm", vbCompName: = "Module1", LabelType_numbers: = vbLabelName1). xlsm ", vbCompName: =" Module1 ", LabelType: = vbLabelTabEnd Sub  

Теперь он работал (добавление и удаление номеров строк, все 4 метода вызова добавления/удаления номера строк, вставленные в временный module2 для единственной подпрограммы в модуле ( module1 в примере). Итак, я попытался разместить 2 подпрограммы друг за другом в одном модуле. В этом случае код не изменил номера строк добавления для второй подпрограммы.

  1. Итак Я добавил следующую строку над Module1 :

      Global allow_for_line_addition As String  

Создание вида Module1 так:

  Global allow_for_line_addition As String Sub learn () ThisWorkbook.Worksheets ("Sheet1")  .Активировать диапазон («A1»). Активировать диапазон («A1»). Выбрать диапазон («A1»). Значение = Диапазон («A1»). Значение + 1End SubSub learn2 () ThisWorkbook.Worksheets («Sheet1»).  Активировать диапазон («A1»). Активировать диапазон («A1»). Выбрать диапазон («A1»). Значение = Диапазон (  "A1"). Value + 1End Sub  

Теперь он добавил номера строк ко всему модулю, но не удалил номера строк из всего модуля, поэтому я отредактировал код удаления ответа hymced и уже поместил его в длинный код ** final ** Module2`.

Примечание: если у вас пустой белый строк после конца подгруппы или функции, он будет продолжать добавлять белые строки каждый раз, когда вы запускаете скрипт для добавления номеров строк (который после первого запуска просто обновляет номера строк). Эти пустые номера строк вызывают ошибку при выполнении кода, поэтому вам следует удалить их один раз. Если в конце подпрограммы нет пустых строк, этот код также не будет добавлять новые.

  1. Чтобы добавить номера строк ко всем вашим модулям в своей книге оставьте длинный код в final Module2 , как я его изменил, и замените код временного Module3 с final Module3 :

      Global allow_for_line_addition As String 'this  просто для того, чтобы вы могли автоматически добавлять номера белья. Sub remove_line_numbering_all_modules () источник: https://stackoverflow.com/questions/36791473/vba-getting-the-modules-in-workbook'Этот код нумерует все модули в вашем .xlsm  Dim vbcomp As VBComponent Dim modules As CollectionSet 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'  wbName: = ThisWorkbook.name, vbCompName: = vbcomp.nam  e, LabelType: = vbLabelColon 'V1:' Вызов RemoveLineNumbers (ThisWorkbook.name, vbcomp. name) End If Next vbcompEnd Sub  

    И добавьте следующий код в final Module4 :

      Global allow_for_line_addition As String 'это просто для того, чтобы вы могли автоматически добавлять номера строк' Эта подпрограмма добавляет номера строк ко всем модулям после того, как вы добавили следующую строку в каждый модуль 'добавить ссылки на инструменты  Microsoft Visual Basic для приложений (5.3), как проверено 'Источник  stackoverflow.com/questions/36791473/vba-getting-the-modules-in-workbook'Этот код нумерует все модули в вашем .xlsm Dim vbcomp As VBComponent Dim modules As Collection Set modules = New Collection For Each vbcomp In ThisWorkbook.VBProject  .VBComponents ', если нормальный или модуль класса If ((vbcomp.Type = vbext_ct_StdModule) Or (vbcomp.Type = vbext_ct_ClassModule)) Then' V0: Вызвать AddLineNumbers (ThisWo  rkbook.name, vbcomp.name, vbLabelColon, True, True, vbScopeAllProc) 'v1' Вызов AddLineNumbers (ThisWorkbook.name, vbcomp.name) End If Next vbcompEnd Sub  

, где вы можете заменить "Book1.xlsm" на имя вашей собственной книги или на thisworkbook (не заметьте «» ) или наоборот.


Краткий ответ для Excel 2016 , еще не пробовали его в 2013 году.

Сделайте один раз:

  1. Вставьте большой код из final Module2 в этом ответе в вашей книге.
  2. Вставьте код для final Module3 в этом ответе в своей книге.
  3. Вставьте код для final Module4 в этом ответе в своей книге.
  4. Затем вставьте строку Global allow_for_line_addition As Str ing это просто для того, чтобы вы могли автоматически добавлять номера строк вверху/в первую строку каждого модуля.
  5. Удалите все пустые строки в конце каждого модуля (чтобы после последний end sub , end function или End Property модуля).
  6. В редакторе VBA, когда код не запущен и не находится в режиме «break»: щелкните инструменты> ссылки> отметьте: `Microsoft Visual Basic for Applications Extensibility 5.3″

Выполняйте каждый раз, когда вы меняли свой код:

  1. * Запустите код для final Module3 , чтобы удалить номера строк для всех модулей в вашей книге.
  2. * Запустите код для final Module4 , чтобы добавить номера строк ко всем модулям в книге.

(* потому что иногда вы получаете сообщение об ошибке, если вырезаете линии или перемещаете их (например,. поместите строка 2440: над строкой 2303: ). Удалив и повторно добавив их, нумерация строк снова автоматически вернется)

Длинный ответ (включая шаги и попытки обучения) — для меня это было непросто чтобы реализовать ответ hymced, поэтому я задокументировал шаги, необходимые для добавления номеров строк в модуль в редакторе кода VBA (* и снова удалите их). Я выполнил следующие шаги, чтобы заставить его работать.

  1. Из этой ссылки я узнал, что vbcomponent может быть модулем.
  2. Я скопировал первый код передан в временный Module2 , а второй код передан в временный Module3 .
  3. Затем изменил первую строку 2-го кода в временном Module3 на :

      AddLineNumbers wbName: = "Book1.xlsm", vbCompName: = "Module1", LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfcopeProc: = True, ScopeProc: = True, S  vbScopeAllProc  
  4. У меня ошибка в строке:

      procName = .ProcOfLine (i  , vbext_pk_Proc) `Type d`argument ByRef несовместимо ~~> Требуется библиотека VBIDE в качестве ссылки для проекта VBA  
  5. Итак, я прочитал, что для включения библиотеки VBIDE.

  6. Итак, я остановил код, щелкнул инструменты> ссылки и не смог найти библиотеку VBIDE.

  7. На этом форуме я обнаружил, что VBIDE включается путем добавления ссылки на библиотеку расширяемости VBA:

Щелкните Инструменты-Ссылки в VBE, прокрутите вниз и отметьте запись Microsoft Visual Basic for Applications Extensibility 5.3.

Итак, после этого первая ошибка исчезла, и она не выделяла ни одной строки, но выдавала он выдал ошибку «Неверный вызов процедуры или аргумент».

  1. Поскольку я все еще не уверен насчет vbCompName, я подумал, что ему, возможно, потребуется знать подпрограмму вместо модуля, поэтому я попытался изменить второй код в временном Module3 для:

      AddLineNumbers wbName: = "Book1.xlsm", vbCompName:  = "learn", LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = True, Scope: = vbScopeAllProc  
  2. Это выделило строку :

      С книгами (wbName) .VBProject.VBComponents (vbCompName) .CodeModule 

говоря: индекс вне допустимого диапазона . (Итак, я также попробовал: Module1.learn и Module1: learn , получив индекс вне диапазона -error.

Как выяснилось,

  AddLineNumbers wbName: = "Book1. xlsm ", vbCompName: =" Module1 ", LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = True, Scope: = vbScopeAllProc  

— это правильный способ вызова sub, если подпрограмма, которую вы хотите предоставить с номерами строк, находится в модуле с именем Module1 . Первая описанная ошибка возникает, но она добавляет номера строк в код (за исключением первой строки, содержащей sub ... и последняя строка, содержащая end sub . Протестировано в Module1 с именем sub learn () книги Excel 2016 с именем Book1.xlsm . Для полноты картины learn состоит из:

  Sub learn () ThisWorkbook.Worksheets ("Sheet1"). Активировать диапазон ("A1"). Активировать диапазон ("A1"). Выбрать диапазон ("A1"). Значение = Range ("A1").  Value + 1End Sub  

Однако на обратном пути при удалении номеров строк возникла ошибка, так как он запрашивает .lines (0,1) из procName в Sub AddLin eNumbers ...

  1. Поэтому я изменил его, чтобы исключить .lines (0,1), поместив измененный код ниже в final Module2 :

      Публичное перечисление vbLineNumbers_LabelTypes vbLabelColon '0 vbLabelTab' 1End EnumPublic Enum vbLineNumbers_ScopeToAddLineNumbersTo vbScopeAll  2End Enum Sub AddLineNumbers (ByVal wbName As String, _ ByVal vbCompName As String, _ ByVal LabelType As vbLineNumbers_LabelTypes, _ ByVal AddLineNumbersToEmptyLines As Boolean, _ ByVal AddLineNumbersToEmptyLines As Boolean, _ ByVal AddLineNumbersToEndOfNumbers, _ ByVal AddLineNumbersToEndOfNumbers, _ByVal AddLineNumbersToEndOfNumbers, _ByVal_LineNumbersToEndOfNumbers, _ByVal_AddLineNumbersToEndOfPro  'НЕ СМЕШАЙТЕ ТИПЫ ЯРЛЫКОВ ДЛЯ НОМЕРОВ СТРОК!  ПРИ ДОБАВЛЕНИИ НОМЕРОВ СТРОК В КАЧЕСТВЕ ТОЛЧИНОЙ ТИП, ЛЮБЫЕ НОМЕРА СТРОК В КАЧЕСТВЕ ТИПА VBTAB ДОЛЖНЫ БЫТЬ УДАЛЕНЫ ПЕРЕД, И ДОБАВЛЕНИЕ НОМЕРА ЛИНИЙ В КАЧЕСТВЕ VBTAB TYPE Dim i As Long Dim j As Long Dim procName As String Dim startOfProcedure As end Dim length  Long Dim strLine As String With Workbooks (wbName) .VBProject.VBComponents (vbCompName) .CodeModule .CodePane.Window.Visible = FalseIf Scope = vbScopeAllProc Then For i = 1 To .CountOfLines - 1 strLine, 1 proc  = .ProcOfLine (i, vbext_pk_Proc) 'Тип аргумента ByRef несовместим ~~> Требуется библиотека VBIDE в качестве справочника для проекта VBA Если procName  vbNullString Then startOfProcedure = .ProcStartLine (procName, vbext_pk_Procedure,  vbext_pk_Proc) countOfProcedure = .ProcCountLines (procName, vbext_pk_Proc) prelinesOfProcedure = bodyOfProcedure - startOfProcedure 'postlineOfProcedure = ???  не доступен напрямую, так как endOfProcedure не доступен напрямую. lengthOfProcedure = countOfProcedure - prelinesOfProcedure 'включает postlinesOfProcedure!  'endOfProcedure = ???  не доступен напрямую, каждая строка процедуры должна быть протестирована, пока не будет достигнут оператор End.  См. ниже.  Если endOfProcedure  0 и startOfProcedure  endOfProcedure Then GoTo NextLine End If If i = bodyOfProcedure Then inprocbodylines = True Если bodyOfProcedure  bodyOfProcedure strLine = .Lines (j, 1) Если LabelType = vbLabelColon Then If Mid (strEnd, Len (CStr (endOfProcedure)) + 1 + 1 + 1  , 1) = "" Затем .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  vbNullString Then If i> 1 Then 'MsgBox («Строка» & i & «является строкой тела» & .ProcBodyLine (procName, vbext_pk_Proc)) Если i = .ProcBodyLine (procName,  vbext_pk_Proc) Then inprocbodylines = True If .Lines (i - 1, 1)  "" Then 'MsgBox (.Lines (i - 1, 1)) End If Not .Lines (i - 1, 1) Like "*  _ "Затем 'MsgBox (inprocbodylines) inprocbodylines = False' MsgBox (" распознал строку, которую следует заменить: "& i) 'MsgBox (" собираюсь заменить "& .Lines (i, 1) & vbNewLine &" на: "  & RemoveOneLineNumber (.Lines (i, 1),  LabelType) & vbNewLine & "с типом метки:" & LabelType) .ReplaceLine i, RemoveOneLineNumber (.Lines (i, 1), LabelType) Else If IsInProcBodyLines Then 'ничего не делать' MsgBox (i) Else .ReplaceLine i, Mid (. Строки (i, 1), RemovedChars_previous_i + 1) End If End If End If Else 'GoTo NextLine End IfNextLine: Next i End WithEnd Подфункция RemoveOneLineNumber (ByVal aString как строка, ByVal LabelType как vbLineNumbers_LabelTypes, затем  Если aString Like "#: *" или aString Like "##: *" Или aString Like "###: *" или aString Like "####: *", то 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 "# *" или aString Like  "## *" Или aString Like "### *" или aString Like "#### *" Тогда RemoveOneLineNumber = Mid (aString, 5) Если aString Like "#" Или aString Like "##" Или aString Like "  ### "Или aString Like" #### "Then RemoveOneLineNumber =" "End IfEnd Function Function HasLabel (ByVal aString как String, ByVal LabelType как vbLineNumbers_LabelTypes) как Boolean If LabelType = vbLabelCo  lon Then HasLabel = InStr (1, aString & ":", ":")  "" aString = Mid (aString, 2) Loop RemoveLeadingSpaces = aStringEnd Function Function WhatIsLineIndent (ByVal aString как String) As String i = 1 Do до Mid (  aString, i, 1)  "" i = i + 1 Loop WhatIsLineIndent = iEnd Function Function HowManyLeadingSpaces (ByVal aString As String) As String HowManyLeadingSpaces = WhatIsLineIndent (aString) - 1End Function  

С вызовом замены в sub learn () с приведенным ниже кодом, вставленным в временный module3 :

  Sub AddLineNumbers_vbLabelColon () AddLineNumbers wbName: = "Book1.xlsm", vbCompName: = "Modul  e1 ", LabelType: = vbLabelColon, AddLineNumbersToEmptyLines: = True, AddLineNumbersToEndOfProc: = True, Scope: = vbscopeallprocEnd SubSub AddLineNumbers_vbLabelTab () AddLineNumbers 1.BName: =":  = True, AddLineNumbersToEndOfProc: = True, Scope: = vbscopeallprocEnd SubSub RemoveLineNumbers_vbLabelColon () RemoveLineNumbers wbName: = "Book1.xlsm", vbCompName: = "Module1", LabelType_numbers: = vbLabelName1). xlsm ", vbCompName: =" Module1 ", LabelType: = vbLabelTabEnd Sub  

Теперь он работал (добавление и удаление номеров строк, все 4 метода вызова добавления/удаления номера строк, вставленные в временный module2 для единственной подпрограммы в модуле ( module1 в примере). Итак, я попытался разместить 2 подпрограммы друг за другом в одном модуле. В этом случае код не изменил номера строк добавления для второй подпрограммы.

  1. Итак Я добавил следующую строку над Module1 :

      Global allow_for_line_addition As String  

Создание вида Module1 так:

  Global allow_for_line_addition As String Sub learn () ThisWorkbook.Worksheets ("Sheet1")  .Активировать диапазон («A1»). Активировать диапазон («A1»). Выбрать диапазон («A1»). Значение = Диапазон («A1»). Значение + 1End SubSub learn2 () ThisWorkbook.Worksheets («Sheet1»).  Активировать диапазон («A1»). Активировать диапазон («A1»). Выбрать диапазон («A1»). Значение = Диапазон (  "A1"). Value + 1End Sub  

Теперь он добавил номера строк ко всему модулю, но не удалил номера строк из всего модуля, поэтому я отредактировал код удаления ответа hymced и уже поместил его в длинный код ** final ** Module2`.

Примечание: если у вас пустой белый строк после конца подгруппы или функции, он будет продолжать добавлять белые строки каждый раз, когда вы запускаете скрипт для добавления номеров строк (который после первого запуска просто обновляет номера строк). Эти пустые номера строк вызывают ошибку при выполнении кода, поэтому вам следует удалить их один раз. Если в конце подпрограммы нет пустых строк, этот код также не будет добавлять новые.

  1. Чтобы добавить номера строк ко всем вашим модулям в своей книге оставьте длинный код в final Module2 , как я его изменил, и замените код временного Module3 с final Module3 :

      Global allow_for_line_addition As String 'this  просто для того, чтобы вы могли автоматически добавлять номера белья. Sub remove_line_numbering_all_modules () источник: https://stackoverflow.com/questions/36791473/vba-getting-the-modules-in-workbook'Этот код нумерует все модули в вашем .xlsm  Dim vbcomp As VBComponent Dim modules As CollectionSet 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'  wbName: = ThisWorkbook.name, vbCompName: = vbcomp.nam  e, LabelType: = vbLabelColon 'V1:' Вызов RemoveLineNumbers (ThisWorkbook.name, vbcomp. name) End If Next vbcompEnd Sub  

    И добавьте следующий код в final Module4 :

      Global allow_for_line_addition As String 'это просто для того, чтобы вы могли автоматически добавлять номера строк' Эта подпрограмма добавляет номера строк ко всем модулям после того, как вы добавили следующую строку в каждый модуль 'добавить ссылки на инструменты  Microsoft Visual Basic для приложений (5.3), как проверено 'Источник  stackoverflow.com/questions/36791473/vba-getting-the-modules-in-workbook'Этот код нумерует все модули в вашем .xlsm Dim vbcomp As VBComponent Dim modules As Collection Set modules = New Collection For Each vbcomp In ThisWorkbook.VBProject  .VBComponents ', если нормальный или модуль класса If ((vbcomp.Type = vbext_ct_StdModule) Or (vbcomp.Type = vbext_ct_ClassModule)) Then' V0: Вызвать AddLineNumbers (ThisWo  rkbook.name, vbcomp.name, vbLabelColon, True, True, vbScopeAllProc) 'v1' Вызов AddLineNumbers (ThisWorkbook.name, vbcomp.name) End If Next vbcompEnd Sub  

, где вы можете заменить "Book1.xlsm" на имя вашей собственной книги или на thisworkbook (не заметьте «» ) или наоборот.

Оцените статью
techsly.ru
Добавить комментарий