如何排序声明变量的顺序

How to sort the order in which to declare variables

我正在 vba 中编写一个中等大小的脚本,其中包含 ~40 个 subs,我的一个 subs 现在包含 >60 个变量,这使得跟踪所有声明的变量有点困难。 (我已经有这个或那个的变量了吗?我是否应该为多用途回收变量,我是否声明了不再使用的变量等)

现在,声明按历史排序,这意味着当我声明一个新变量时,我将这一行放在所有其他声明的下面,但这似乎不是好的编码习惯。

我想到的因素是数据类型(使用的类型是 Boolean、Long、Single、Double、String、Range、Object 和 Variant,包括不同数据类型的数组。我可以再次按大小、字母顺序对这些进行排序,目的等),按字母顺序,历史(我不再喜欢),按第一次出现在子(这需要大部分维护工作),按目的(即将变量 i,j 和 k 组合在一起)和按将在 sub 的哪些部分使用它们进行分组。 (下半部、中部、底部等)

因此,作为我的代码的 reader,我想知道您最喜欢哪种顺序,以及我应该考虑根据变量在子程序中的出现对变量进行分组的程度。 变量声明的顺序是否有任何标准化的良好做法? 也许有一些例子可以研究?

你好,andy01q

PS:请注意,在其他语言中,我通常会像 "Dim a, b, c as Long" 那样,但是由于 vba 结果声明 a 和 b 为该行代码的变体,我决定为每个变量提供自己的行(以避免我不小心将变量声明为具有相同类型的其他变量之间的 Variant 的错误。)这避免了错误但导致了给定的混乱。

在某些方面,你做什么并不重要,只要它是合理的并且你始终如一地做。这是我从 Steve McConnell 的书 "Code Complete" 中收集到的内容之一。这本书包含关于变量命名、代码布局、注释风格等方面的极好的建议。我的 VBA 在读完那本书后变得更加精致(它主要使用 C 和 Pascal 作为示例,但很容易应用于几乎任何语言)。

我写了一个 sub 来扩展 Dim 行:

Sub expand(dimLine As String)
    Dim fragments As Variant
    Dim i As Long, n As Long, myType As String
    Dim last As Variant
    Dim expanded As String

    fragments = Split(dimLine, ",")
    n = UBound(fragments)
    last = Split(Trim(fragments(n)))
    myType = last(UBound(last))
    For i = 0 To n - 1 'excludes last fragment
        expanded = expanded & IIf(i = 0, "", ",") & fragments(i) & " As " & myType
    Next i
    expanded = expanded & IIf(n > 0, ",", "") & fragments(n)
    Debug.Print expanded
End Sub

如果您在即时 Window 中键入 expand "Dim a, b, c as Long",它会扩展为

Dim a As Long, b As Long, c as Long

可以直接粘贴到您的代码中。写完这篇文章后,我从未发现它特别有用——但话又说回来,我从来没有使用过超过 60 个变量的子程序。或许对你有帮助。

在编辑时:expand 可以修改为复制到剪贴板,而不是(或除此之外)直接打印到 window。为此:

1) 将对 Microsoft Forms 2.0 Object Library 的引用添加到您的项目

2) 包含声明 Dim clip As New DataObject

3) 用两行

替换(或补充)行Debug.Print expanded
clip.SetText expanded
clip.PutInClipboard

然后扩展声明就可以粘贴到代码中了。