如何排序声明变量的顺序
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
然后扩展声明就可以粘贴到代码中了。
我正在 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
然后扩展声明就可以粘贴到代码中了。