我在 Excel VBA 中有一行代码很长,我想使用行延续将其分成两行。但是,当我将光标从该行代码移开后,编辑器会更改我首选的自动换行。我怎样才能让它停止这样做?
If IsEmpty([Task].Cells(rowNo, [Task[SchedDateTime]].Column)) And _
IsEmpty([Task].Cells(rowNo, [Task[DaysAlloc]].Column)) Then
被编辑更改为:
If IsEmpty([Task].Cells(rowNo, [Task[SchedDateTime]].Column)) And IsEmpty( _
[Task].Cells(rowNo, [Task[DaysAlloc]].Column)) Then
我认为这更难阅读。
最佳答案
停止使用括号标识符。这个技巧对于一次性代码和直接 Pane 中的快速调试器内容很有用,但不适用于实际的生产代码。
当您执行[Task]
时,您将走出 VBA 领域并遵循主机应用程序 - Excel - 它将执行 Application.Evaluate("Task")
code> 并且大概会获取一个 Range
对象。
从代码的外观来看,听起来Task
是某个表的名称。为什么不明确说明该表的来源,而不是让 Excel 计算出来?
Dim taskTable As ListObject
Set taskTable = Sheet1.ListObjects("Task")
不确定您到底想做什么,但您可以利用强大的 ListObject
API,而不是使用一半由 Excel 解析、一半由 VBA 解析的后期绑定(bind)隐式代码。
Dim scheduleTimestampColumn As Long
scheduleTimestampColumn = taskTable.ListColumns("SchedDateTime").Index
Dim daysAllocColumn As Long
daysAllocColumn = taskTable.ListColumns("DaysAlloc").Index
Dim currentRow As ListRow
For Each currentRow In taskTable.ListRows
If IsEmpty(currentRow.Range.Cells(ColumnIndex:=scheduleTimestampColumn).Value) And _
IsEmpty(currentRow.Range.Cells(ColumnIndex:=daysAllocColumn).Value) _
Then
'...do stuff...
End If
Next
VBA 支持括号表达式作为 Application.Evaluate
(或 Worksheet.Evaluate
,具体取决于上下文)的速记代理...所以,它实际上比我更隐式写在这个答案的顶部附近)。在某些上下文中,它还支持括号内的标识符,用于其中可能包含空格的名称,否则会产生非法的 VBA 标识符。
但是[TableName[ColumnName]]
完全是Excel-land(表格公式表示法)-VBA不知道这意味着什么,并且方括号内部括号表情都彻底困惑了。如果没有嵌套括号,VBE 就不会混淆,也不会破坏您的缩进。但是如果没有括号表达式,您将获得一个不混淆的 VBE 和 显式代码,它说明了它的作用,并且执行了它所说的 - 加上对所有内容进行编译时验证!
关于excel - 为什么 Excel VBA 编辑器会更改续行自动换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58207067/