【问题标题】:Why does Excel VBA editor change line continuation word wrapping?为什么 Excel VBA 编辑器会更改换行符换行?
【发布时间】:2019-10-03 15:25:21
【问题描述】:

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

我认为它更难阅读。

【问题讨论】:

  • 你为什么使用括号标识符? Task 是什么?
  • 下划线后是否同时使用了空格和换行符?
  • @Phanti 行继续标记定义为空格+下划线+换行符。问题是由括号中的标识符引起的,而不是行继续。

标签: excel vba


【解决方案1】:

停止使用方括号标识符。此技巧适用于直接窗格中的一次性代码和快速调试器内容,不适用于实际生产代码。

当您执行 [Task] 时,您将退出 VBA 领域并遵从主机应用程序 - Excel - 它将执行 Application.Evaluate("Task") 并且可能会返回一个 Range 对象。

从您的代码看起来,听起来Task 是某个表的名称。为什么不明确说明该表的来源,而不是让 Excel 解决?

Dim taskTable As ListObject
Set taskTable = Sheet1.ListObjects("Task")

不确定您到底要做什么,但您可以利用强大的ListObject API,而不是使用一半由 Excel 解析、一半由 VBA 解析的后期绑定隐式代码。

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 领域(表格公式表示法) - VBA 不知道这意味着什么,方括号 括号内的表达式完全混淆了它。没有嵌套的括号,VBE 不会混淆,也不会破坏你的缩进。但是如果没有括号表达式,您会得到一个不混淆的 VBE 明确的代码,它说明了它的作用,并做了它所说的 - plus 对所有内容进行编译时验证!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多