VBA: 在不同的subs中使用相同的变量名

VBA: Using the same variable name in different subs

我对命名约定和在不同的子程序中使用相同的变量名有疑问。自从我开始使用 VBA.

以来,它一直困扰着我
  1. 在不同的模块中使用相同的变量名是一种好习惯吗?潜艇彼此不互动。例如,我在两个不同的模块中循环浏览工作簿中的工作表,到目前为止,计数器变量使用了相同的名称 (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_module1count_ws_module2

  1. 将变量传递给另一个子:同样的问题,是否建议保留相同的名称?我觉得如果我在第一个子中调用变量一个名称,然后在另一个子中调用其他名称,可能会造成混淆。

    子测试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 变量命名为 wsDatadataWs,您使用驼峰命名法、PascalCase 还是 snake_case,是否使用 Hungarion Notation... 因此,当变量服务于相同或相似的目的时,您可能会在不同的例程中以相同的方式命名变量——为什么不呢。同样,如果您已经使用了相同的名称,则不必查看您的代码。例外情况是,如果您在同一个例程中处理,不要将同一个变量用于不同的目的,并且在嵌套循环中命名迭代变量时要小心。

(3) 函数参数名作为文档。参数是两个例程之间的接口,如果您给它们起好名字,就更容易弄清楚它的用途是什么。如果你想调用一个例程Copy接收两个参数p1p2,你首先要弄清楚什么是源和目标,而pFrompTo 使其显而易见。也就是说,如果您对自己的命名感到满意,就没有理由不将调用例程的变量命名为子例程的参数名称。