Excel VBA编辑器为何更改行连续换行?

Lar*_*son 2 excel vba

我在Excel VBA中有一段很长的代码行,并且我想使用行继续符将其分成两行。但是,在将光标从该行代码移开之后,编辑器更改了我的首选自动换行。我如何使其停止这样做?

If IsEmpty([Task].Cells(rowNo, [Task[SchedDateTime]].Column)) And _
   IsEmpty([Task].Cells(rowNo, [Task[DaysAlloc]].Column)) Then
Run Code Online (Sandbox Code Playgroud)

由编辑器更改为:

If IsEmpty([Task].Cells(rowNo, [Task[SchedDateTime]].Column)) And IsEmpty( _
   [Task].Cells(rowNo, [Task[DaysAlloc]].Column)) Then
Run Code Online (Sandbox Code Playgroud)

我认为这很难阅读。

Mat*_*don 5

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

执行此操作时[Task],您将退出VBA领域,并转至宿主应用程序-Excel-该宿主应用程序将这样做,Application.Evaluate("Task")并且大概可以找回Range对象。

从代码的外观来看,听起来像是Task某个表的名称。为什么不明确说明该表的来源,而不是让Excel计算出来?

Dim taskTable As ListObject
Set taskTable = Sheet1.ListObjects("Task")
Run Code Online (Sandbox Code Playgroud)

不确定要执行的操作是什么,但是您可以利用功能强大的ListObjectAPI来代替使用后期绑定的隐式代码,其中一半由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
Run Code Online (Sandbox Code Playgroud)

VBA支持用括号括起来的表达式作为Application.Evaluate(或Worksheet.Evaluate取决于上下文的速记)的代名词,因此,它实际上比我在该答案顶部附近所写的内容都更隐含)。在某些情况下,它还支持带括号的标识符,用于其中可能包含空格或以其他方式构成非法VBA标识符的名称。

但是[TableName[ColumnName]]完全是Excel-land(表公式表示法)-VBA不知道这意味着什么,并且括号表达式的方括号使之完全混乱。没有嵌套的括号,VBE不会混淆,也不会破坏您的缩进。但是,如果没有括号的表情,你会得到一个不糊涂VBE 明确的代码,表示它做什么,以及做什么它说- 加上编译时间验证一切!