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

Excel VBA:在不同的SUB中使用相同的变量名,excel,vba,naming,Excel,Vba,Naming,我有一个关于命名约定和在不同sub中使用相同变量名的问题。自从我开始使用VBA以来,它一直困扰着我 在不同的模块中使用相同的变量名是否是一种良好的做法?潜艇之间没有相互作用。例如,我在两个不同的模块中循环使用工作簿中的工作表,到目前为止,计数器变量使用了相同的名称(count\ws): 模块1: Sub Test() Dim count_ws As Long For count_ws = 2 To ThisWorkbook.Worksheets.Count

我有一个关于命名约定和在不同sub中使用相同变量名的问题。自从我开始使用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
    
    Sub Test2()
        Dim count_ws As Long
        
        For count_ws = 2 To ThisWorkbook.Worksheets.Count
            Debug.Print "Module2"
        Next count_ws
    End Sub
    
    模块2:

    Sub Test()
        Dim count_ws As Long
        
        For count_ws = 2 To ThisWorkbook.Worksheets.Count
            Debug.Print "Module1"
        Next count_ws
    End Sub
    
    Sub Test2()
        Dim count_ws As Long
        
        For count_ws = 2 To ThisWorkbook.Worksheets.Count
            Debug.Print "Module2"
        Next count_ws
    End Sub
    
    如果这样不行,那么最好的选择是什么?我重复这个名称的原因是我不想让变量名太长,比如
    count\u ws\u module1
    count\u ws\u module2

  • 将一个变量传递给另一个子变量:同样的问题,是否建议保持相同的名称?我觉得如果我在第一个子段中调用变量一个名称,然后在另一个子段中调用其他名称,可能会让人困惑

    子测试3() 将贷款作为工作表 将WSB设置为工作表

         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
    
  • 因此,对我来说,这种方法似乎最具可读性,避免了混淆,但我很高兴听到其他意见。在
    子测试4
    中,我可以简单地命名工作表
    ws
    。或者
    wsLoans\u Test4
    ,但这真的有帮助吗


    我只是想确保我做到了这一点,并养成良好的习惯。

    这是一个可能导致没完没了的讨论的问题,你对命名约定的整个主题思考得越多,它就越深入。由于这是强有力的意见基础,这类问题通常在堆栈溢出时被关闭

    我将快速列出3个方面:

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

    (二)作为一名程序员,你应该有一些命名约定。它们不需要写下来,但你应该有一个特定的一致性。你是命名一个表变量
    wsData
    还是
    dataWs
    ,你是使用camelCase、PascalCase还是snake\u case,使用与否……因此,你可能会在不同的格式中对变量进行相同的命名当例程服务于相同或相似的目的时-以及为什么不。同样,如果您已经使用了相同的名称,则不必查看代码。例外情况是,如果您在同一例程中处理,不要将相同的变量用于不同的目的,并且在嵌套循环中命名迭代变量时要小心


    (三)函数参数名称作为一个文档。参数是两个例程之间的接口,如果给它们起个好名字,就更容易弄清楚它的用途。如果要调用一个例程
    Copy
    ,该例程接收两个名为
    p1
    p2
    的参数,首先必须图o但是什么是源,什么是目的,而
    pFrom
    pTo
    则是显而易见的。也就是说,如果您对自己的命名感到满意,就没有理由不将调用例程的变量命名为子例程的参数名。

    在不同的子例程中重复使用变量名是完全正确的。只是不要重复使用他在更高的范围内命名变量。在我看来,最好将
    count\u ws
    命名为
    worksheets\u count
    ,或者只命名为
    count
    。我觉得变量的名称应该易于阅读且清晰。这与变量的范围有关。在不交互的多个宏函数中使用相同的名称是最好的很好,获得良好的名称约定可以帮助您在6个多月后重新阅读代码时破译代码。它还可以帮助代码的可重用性,因为您可以在模块之间复制和粘贴,并且需要较少的编辑(假设您可以以这种方式重用变量)@神秘性是的,
    工作表计数
    让它更清晰。我有时会在命名上挣扎,不确定自己是否选择了最佳选择。如果更长的变量名能让代码更具可读性,我就不应该回避,对吧?我查过命名约定和不同的方法,但在编写代码时,它们在很多情况下,我总是以一个不可靠的名字结束。