如何将 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,70}|.{71,140}|.{141,210}|.{211,280}- 交替匹配除换行符以外的任何字符 x 次。如果字符串值更长,您可以添加更多。
      • )- 关闭嵌套的第二个非捕获组。
    • |- 交替/或。
    • \G(?!^)- 使用负向前瞻来断言前一次匹配结束时的位置,以防止字符串位置的开始。
    • )- 关闭第一个非占领组。
  • \S+- 匹配至少 1 个非空白字符。
  • \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=

相关内容