编程更新CodeModule代码时下划线_拆分语句出现多余空行报错问题
根本原因
VBA编辑器(VBE)内置了自动格式化机制,当你通过InsertLines方法逐行插入代码时,如果插入的行末尾带续行符_,VBE会自动在该行后追加一个空行。你的原复制逻辑是每次在CountOfLines + 1的位置插入新行,遇到带_的行时,VBE自动插入的空行会让CountOfLines比预期多1,下一行代码就会被插入到空行之后,最终表现为续行语句中间多出空行。
临时方案生效逻辑
你的临时方案中insert_before变量的作用是抵消VBE自动插入的空行占位:
- 插入普通行时,VBE不会补空行,
insert_before = 0,插入位置为CountOfLines +1,和原逻辑一致 - 插入带
_的行后,VBE补了1个空行,insert_before = 1,下一次的插入位置变为CountOfLines +1 -1 = CountOfLines,正好覆盖掉自动生成的空行位置,因此不会出现多余空行。
你提到的“前20行取值为0,遇到第一个下划线后恒为1”是因为你的临时代码存在隐性逻辑:你大概率是隐式判断了行尾是否存在_来设置insert_before的初始值,仅在遇到续行符后开启位置偏移,所以前20行无续行符的代码插入逻辑不受影响。
更优解决方案
不需要逐行插入也不需要处理偏移,直接调用CodeModule的AddFromString方法一次性写入全量代码,即可完全规避逐行插入触发的自动格式化问题,代码更简洁高效:
Dim codeModDestination As CodeModule Dim codeModOriginal As CodeModule '..... 赋值CodeModules对象的逻辑不变 ' 清空目标模块原有代码 If codeModDestination.CountOfLines > 0 Then codeModDestination.DeleteLines 1, codeModDestination.CountOfLines End If ' 一次性写入原模块全量代码,无需循环 codeModDestination.AddFromString codeModOriginal.Lines(1, codeModOriginal.CountOfLines)
如果必须使用逐行插入的方案,可以在操作前临时关闭VBE的自动语法检查,操作完成后再恢复:
' 临时关闭自动语法检查 Dim originAutoCheck As Boolean originAutoCheck = Application.VBE.AutoSyntaxCheck Application.VBE.AutoSyntaxCheck = False ' 原逐行插入逻辑不变 Dim fila As Long For fila = 1 To codeModOriginal.CountOfLines codeModDestination.InsertLines codeModDestination.CountOfLines + 1, _ codeModOriginal.Lines(fila, 1) Next fila ' 恢复原有设置 Application.VBE.AutoSyntaxCheck = originAutoCheck
内容的提问来源于stack exchange,提问作者Jose S
相关产品推荐
相关产品推荐

