excel - 为什么 Excel VBA 编辑器会更改续行自动换行?

标签 excel vba

我在 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/

相关文章:

excel - 在公式栏中隐藏公式

c# - 如何在 Excel 中获取选定的工作表名称

java - 使用 Apache POI 将文件嵌入到 Excel 中

excel - 如何在 Excel 中将 12 小时格式的时间转换为 24 小时格式

excel - 如何使用VBA设置一定范围内的背景颜色?

vba - 如何从宏中选择基于单元格

regex - 使用 RegExp 在单个正斜杠上分割字符串

python - 从 IronPython 将 Excel 工作表另存为文本文件

Excel VBA 集合合并排序

excel - 迭代某个范围内的单元格