首页 > 解决方案 > VBA:在不同的潜艇中使用相同的变量名

问题描述

我对命名约定和在不同的 subs 中使用相同的变量名有疑问。自从我开始使用 VBA 以来,它一直困扰着我。

  1. 在不同的模块中使用相同的变量名是一种好习惯吗?潜艇不相互交互。例如,我在两个不同的模块中循环浏览工作簿中的工作表,到目前为止,计数器变量 ( count_ws) 使用了相同的名称:

模块一:

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. 将变量传递给另一个子:同样的问题,是否建议保持相同的名称?如果我在第一个 sub 中调用变量一个名称,然后在另一个 sub 中调用其他名称,我觉得这可能会令人困惑。

    Sub Test3() 将 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,但这真的有帮助吗?

我只是想确保我做对了并养成了良好的习惯。

标签: excelvbanaming

解决方案


这是一个可以引发无休止讨论的问题,你对命名约定的整个主题思考得越多,它就会越深入。由于这是强烈的意见基础,这类问题通常在 Stack Overflow 上关闭。

我将快速列出 3 个方面:

(1) 子程序(或函数)可以看作是一个封闭的对象,通常被看作是一个黑盒子。它应该完成一项已定义的任务,但是,如何完成并不重要。它可以存储在不同的模块中,并且可以由不同的人编写。您不必问某人“您是否已经使用过变量名count_ws- 如果没有,我想为我保留它。每个例程都应该使用它喜欢的任何名称。

(2) 作为程序员,你应该有一些命名约定。它们不需要写下来,但你应该有一个特定的一致性。你是命名一个工作表变量wsData还是dataWs使用camelCase、PascalCase 或snake_case,是否使用Hungarion Notation ... 因此,当它们用于相同或相似的目的时,你可能会在不同的例程中以相同的方式命名变量——为什么不呢? . 同样,如果您已经使用了相同的名称,则不必查看代码。例外情况是,如果您在同一个例程中处理,不要将同一个变量用于不同的目的,并且在嵌套循环中命名迭代变量时要小心。

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


推荐阅读