VBA: 在不同的subs中使用相同的变量名
VBA: Using the same variable name in different subs
我对命名约定和在不同的子程序中使用相同的变量名有疑问。自从我开始使用 VBA.
以来,它一直困扰着我
- 在不同的模块中使用相同的变量名是一种好习惯吗?潜艇彼此不互动。例如,我在两个不同的模块中循环浏览工作簿中的工作表,到目前为止,计数器变量使用了相同的名称 (
count_ws
):
模块 1:
Sub Test()
Dim count_ws As Long
For count_ws = 2 To ThisWorkbook.Worksheets.Count
Debug.Print "Module1"
Next count_ws
End Sub
模块 2:
Sub Test2()
Dim count_ws As Long
For count_ws = 2 To ThisWorkbook.Worksheets.Count
Debug.Print "Module2"
Next count_ws
End Sub
如果这不行,最好的选择是什么?我重复这个名字的原因是我不想让变量名太长,比如 count_ws_module1
和 count_ws_module2
将变量传递给另一个子:同样的问题,是否建议保留相同的名称?我觉得如果我在第一个子中调用变量一个名称,然后在另一个子中调用其他名称,可能会造成混淆。
子测试3()
将 wsLoans 调暗为工作表
将 wsBS 调暗为工作表
Set wsLoans = ThisWorkbook.Sheets(2)
Set wsBS = ThisWorkbook.Sheets(3)
Call Test4(wsLoans)
End Sub
Sub Test4(ByVal wsLoans As Worksheet)
wsLoans.Range("A1").Value = "Module 4"
End Sub
所以,对我来说,这种方法似乎最易读并且避免了混淆,但我很高兴听到其他意见。在 Sub Test4
中,我可以简单地将 Sheet 命名为 ws
。或者 wsLoans_Test4
,但这真的有用吗?
我只想确保自己做对并养成良好的习惯。
这是一个可以引起无休止讨论的问题,您对整个命名约定主题的思考越多,它就越深入。由于这是强烈的意见基础,这类问题通常在 Stack Overflow 上被关闭。
我将快速列出 3 个方面:
(1) 子程序(或函数)可以看作是一个封闭的对象,通常被看作是一个黑盒子。它应该完成一个定义的任务,但是,如何完成并不重要。它可以存储在不同的模块中,也可以由不同的人编写。你不应该问别人“你是否已经使用过变量名 count_ws
- 如果没有,我想为我保留它。每个例程都应该使用它喜欢的任何名称。
(2) 作为程序员的你应该有一些命名约定。它们不需要写下来,但你应该有一个特定的一致性。您将 sheet 变量命名为 wsData
或 dataWs
,您使用驼峰命名法、PascalCase 还是 snake_case,是否使用 Hungarion Notation... 因此,当变量服务于相同或相似的目的时,您可能会在不同的例程中以相同的方式命名变量——为什么不呢。同样,如果您已经使用了相同的名称,则不必查看您的代码。例外情况是,如果您在同一个例程中处理,不要将同一个变量用于不同的目的,并且在嵌套循环中命名迭代变量时要小心。
(3) 函数参数名作为文档。参数是两个例程之间的接口,如果您给它们起好名字,就更容易弄清楚它的用途是什么。如果你想调用一个例程Copy
接收两个参数p1
和p2
,你首先要弄清楚什么是源和目标,而pFrom
和 pTo
使其显而易见。也就是说,如果您对自己的命名感到满意,就没有理由不将调用例程的变量命名为子例程的参数名称。
我对命名约定和在不同的子程序中使用相同的变量名有疑问。自从我开始使用 VBA.
以来,它一直困扰着我- 在不同的模块中使用相同的变量名是一种好习惯吗?潜艇彼此不互动。例如,我在两个不同的模块中循环浏览工作簿中的工作表,到目前为止,计数器变量使用了相同的名称 (
count_ws
):
模块 1:
Sub Test()
Dim count_ws As Long
For count_ws = 2 To ThisWorkbook.Worksheets.Count
Debug.Print "Module1"
Next count_ws
End Sub
模块 2:
Sub Test2()
Dim count_ws As Long
For count_ws = 2 To ThisWorkbook.Worksheets.Count
Debug.Print "Module2"
Next count_ws
End Sub
如果这不行,最好的选择是什么?我重复这个名字的原因是我不想让变量名太长,比如 count_ws_module1
和 count_ws_module2
将变量传递给另一个子:同样的问题,是否建议保留相同的名称?我觉得如果我在第一个子中调用变量一个名称,然后在另一个子中调用其他名称,可能会造成混淆。
子测试3() 将 wsLoans 调暗为工作表 将 wsBS 调暗为工作表
Set wsLoans = ThisWorkbook.Sheets(2) Set wsBS = ThisWorkbook.Sheets(3) Call Test4(wsLoans) End Sub Sub Test4(ByVal wsLoans As Worksheet) wsLoans.Range("A1").Value = "Module 4" End Sub
所以,对我来说,这种方法似乎最易读并且避免了混淆,但我很高兴听到其他意见。在 Sub Test4
中,我可以简单地将 Sheet 命名为 ws
。或者 wsLoans_Test4
,但这真的有用吗?
我只想确保自己做对并养成良好的习惯。
这是一个可以引起无休止讨论的问题,您对整个命名约定主题的思考越多,它就越深入。由于这是强烈的意见基础,这类问题通常在 Stack Overflow 上被关闭。
我将快速列出 3 个方面:
(1) 子程序(或函数)可以看作是一个封闭的对象,通常被看作是一个黑盒子。它应该完成一个定义的任务,但是,如何完成并不重要。它可以存储在不同的模块中,也可以由不同的人编写。你不应该问别人“你是否已经使用过变量名 count_ws
- 如果没有,我想为我保留它。每个例程都应该使用它喜欢的任何名称。
(2) 作为程序员的你应该有一些命名约定。它们不需要写下来,但你应该有一个特定的一致性。您将 sheet 变量命名为 wsData
或 dataWs
,您使用驼峰命名法、PascalCase 还是 snake_case,是否使用 Hungarion Notation... 因此,当变量服务于相同或相似的目的时,您可能会在不同的例程中以相同的方式命名变量——为什么不呢。同样,如果您已经使用了相同的名称,则不必查看您的代码。例外情况是,如果您在同一个例程中处理,不要将同一个变量用于不同的目的,并且在嵌套循环中命名迭代变量时要小心。
(3) 函数参数名作为文档。参数是两个例程之间的接口,如果您给它们起好名字,就更容易弄清楚它的用途是什么。如果你想调用一个例程Copy
接收两个参数p1
和p2
,你首先要弄清楚什么是源和目标,而pFrom
和 pTo
使其显而易见。也就是说,如果您对自己的命名感到满意,就没有理由不将调用例程的变量命名为子例程的参数名称。