Как отформатировать код VBA до 80 столбцов?

Как отформатировать код VBA до 80 столбцов?

У меня есть код VBA с длинными строками, и я хочу отправить его куда-нибудь, где есть (не 100% строгое) ограничение в 80 символов на строку.

VBA позволяет создавать разрывы строк кода, помещая " _" перед " enter". (Очевидно, что это не работает внутри строк, которые должны быть разделены на подстроки и соединены с помощью " &". Как вы можете видеть ниже.)

Есть ли какой-нибудь инструмент для автоматического добавления "переносов строк" в код?
Или, может быть, регулярные выражения?

Я пробовал искать, но результатов не было.

Исходный код:

'Some looooooong comment Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut a volutpat dolor. In risus odio, pharetra a arcu in, efficitur ornare lectus. Maecenas non aliquet leo. Praesent luctus blandit magna, et sagittis ex porta et.
MsgBox("Some text in MsgBox. Donec vulputate eros ac nulla hendrerit auctor. In hac habitasse platea dictumst. Proin fermentum augue elit, eget consequat massa mattis et. Integer semper imperdiet diam sit amet malesuada.", 64, "Title of MsgBox")
'Another comment now with link to doc. https://example.com/?bs64=SWYgeW91IGFyZSBzbWFydCBlbm91Z2ggdG8gZGVjb2RlLCB5b3UgbXVzdCBkZWZpbml0ZWx5IHdhdGNoIHRoaXM6IGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9b0hnNVNKWVJIQTA=

Требуемый код:

'Some looooooong comment Lorem ipsum dolor sit amet, consectetur adipiscing
'elit. Ut a volutpat dolor. In risus odio, pharetra a arcu in, efficitur
'ornare lectus. Maecenas non aliquet leo. Praesent luctus blandit magna, et
'sagittis ex porta et.
MsgBox("Some text in MsgBox. Donec vulputate eros ac nulla hendrerit auctor." _
 & "In hac habitasse platea dictumst. Proin fermentum augue elit, eget " _ 
 & "consequat massa mattis et. Integer semper imperdiet diam sit amet" _
 & " malesuada.", 64, "Title of MsgBox")
'Another comment now with link to doc.
'https://example.com/?bs64=SWYgeW91IGFyZSBzbWFydCBlbm91Z2ggdG8gZGVjb2RlLCB5b3UgbXVzdCBkZWZpbml0ZWx5IHdhdGNoIHRoaXM6IGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9b0hnNVNKWVJIQTA=

Спасибо.

PS: Я использую Notepad++

решение1

Может быть, вы могли бы использовать две функции поиска и замены регулярных выражений? Одна будет обрабатывать только строки с комментариями, а другая будет обрабатывать строки с MsgBox. Это оставит обычный VBA в покое. Первый шаблон может быть таким:

^[^'].*(*SKIP)(*F)|(?:(?:.{1,70}|.{71,140}|.{141,210}|.{211,280})|\G(?!^))\S+\K\h(?=.{25,}$)

Заменить на \n', см. онлайндемо


Второй:

^(?!MsgBox\().*(*SKIP)(*F)|(?:(?:.{1,70}|.{71,140}|.{141,210}|.{211,280})|\G(?!^))\S+\K\h(?=.{25,}$)

Заменить на " _\n & ", см. онлайндемо


Разбивка принципов шаблона:

  • ^- Якорь стартовой линии.
  • [^']- Соответствует любому символу, кроме одинарной кавычки.
  • .*- Соответствует любому символу, кроме символа новой строки, ноль или более раз.
  • (*SKIP)(*F)- Комбинация «Пропустить/Не сдать» для использования сопоставленного шаблона, но его отмены позже.
  • |- Чередование/ИЛИ.
  • (?:- Открыта 1-я группа без захвата.
    • (?:- Открыта 2-я группа без захвата.
      • .{1,70}|.{71,140}|.{141,210}|.{211,280}- Чередование для соответствия любому символу, отличному от новой строки, x раз. Вы можете добавить больше, если ваши строковые значения еще длиннее.
      • )- Закрыть вложенную 2-ю группу без захвата.
    • |- Чередование/ИЛИ.
    • \G(?!^)- Утверждает позицию в конце предыдущего совпадения с отрицательным просмотром вперед, чтобы предотвратить начало позиции строки.
    • )- Закройте 1-ю не захватывающую группу.
  • \S+- Найдите хотя бы один непробельный символ.
  • \K- Сбросить начальную точку предыдущего зарегистрированного совпадения.
  • \h- Соответствует горизонтальному пробелу.
  • (?=.{25,}$)- Положительный просмотр вперед, чтобы убедиться, что до конечного символа строки осталось не менее 25 символов (для предотвращения коротких конечных элементов).

В то время как шаблон выше будет работать для строк, которые подразумеваются как комментарий. Единственное отличие от второго шаблона в том, что он использует отрицательный просмотр вперед, чтобы убедиться, что строка не начинается с литерала 'MsgBox('.


введите описание изображения здесь

Мой конечный результат:

'Some looooooong comment Lorem ipsum dolor sit amet, consectetur adipiscing 
'elit. Ut a volutpat dolor. In risus odio, pharetra a arcu in, efficitur 
'ornare lectus. Maecenas non aliquet leo. Praesent luctus blandit 
'magna, et sagittis ex porta et.
MsgBox("Some text in MsgBox. Donec vulputate eros ac nulla hendrerit auctor. " _
 & "In hac habitasse platea dictumst. Proin fermentum augue elit, eget consequat " _
 & "massa mattis et. Integer semper imperdiet diam sit amet " _
 & "malesuada.", 64, "Title of MsgBox")
'Another comment now with link to doc. 
'https://example.com/?bs64=SWYgeW91IGFyZSBzbWFydCBlbm91Z2ggdG8gZGVjb2RlLCB5b3UgbXVzdCBkZWZpbml0ZWx5IHdhdGNoIHRoaXM6IGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9b0hnNVNKWVJIQTA=

Связанный контент