从另一个子调用类型变量

时间:2012-09-13 22:48:56

标签: vba excel-vba global-variables subroutine excel

您好我有一系列子程序如下:

  1. DataCollection():从电子表格中收集数据并将其写入自定义类型变量。

  2. NewSub():做其他事情,但与问题无关。

  3. 我想保留先前声明的相同变量,并在第二个子中分配值。我想我必须以某种方式使它们成为全局变量,但到目前为止无法解决,无论我做什么,我都得到变量未定义的错误。我的代码如下:

    Option Explicit
    
    Public Type Trucks
        NumberOfAxles As Integer
        AxleWeights(15) As Double
    End Type
    
    Public Sub DataCollection()
    
    Dim NumberOfTrucks As Integer
    Truck(10) As Trucks
    Dim i, j, k As Integer
    
    'Determine Number of Trucks
    NumberOfTrucks = Cells(6, 8)
    
    'Populate Truck Arrays (Trucks 1 to 5)
    
    k = 0
    For i = 1 To 5
        Truck(i).NumberOfAxles = Cells(9, 4 + 4 * k)
        k = k + 1
    Next i
    
    k = 0
    For i = 1 To 5
        For j = 1 To Truck(i).NumberOfAxles
            Truck(i).AxleWeights(j) = Cells(31 + j, 3 + 4 * k)
        Next j
        k = k + 1
    Next i
    
    End Sub
    
    Public Sub NewSub()
    
    For i = 1 To Truck(10).NumberOfAxles
        Cells(27 + i, 22) = Truck(10).AxleWeights(i)
    Next i
    
    End Sub
    

    任何想法都会受到欢迎!谢谢!

2 个答案:

答案 0 :(得分:5)

将变量保持在尽可能有限的范围内。

如果从DataCollection调用NewSub,则将Trucks()置于DataCollection的本地,并将其作为参数传递给NewSub。

如果你没有从另一个中调用一个,但它们在同一个模块中,则将Trucks()声明为模块级变量。为此,请使用Private关键字,并在任何过程之外的模块顶部进行声明。

最后,如果NewSub位于不同的模块中,则需要声明一个全局变量。使用Public关键字并在其自己的名为MGlobals的模块中声明它。为什么它是自己的模块?限制使用全局变量并将它们全部声明在同一位置是一种很好的做法,这样您就可以更有效地管理它们。 (这意味着你的公共类型也会移动到MGlobals。)

好的,说了这么多,现在就停止使用Types。在项目的某个阶段,您将需要一些超出Type可以为您做的功能。我知道你不这么认为,但它会发生。因此,您将创建一个功能,它将成为一个无法管理的混乱。所以做一个卡车类和一个卡车类。 Truck类将包含两个属性。 Trucks类将包含一个包含所有Truck实例的私有集合对象。您需要的唯一全局变量是gclsTrucks。只要它在范围内,您的所有Truck实例。所有重物都应该在卡车类中进行。现在做一点额外的工作会为你节省很多。

答案 1 :(得分:2)

您可以使用如下全局变量。

Dim global_var As Integer
'

Sub doA()
global_var = global_var + 1
Debug.Print global_var

End Sub

Sub doB()
global_var = global_var + 10
Debug.Print global_var
End Sub

Sub main()
doA
doB
doA
End Sub

您在

中声明您的变量
Truck(10) As Trucks

而不是

Public Type Trucks
    NumberOfAxles As Integer
    AxleWeights(15) As Double
End Type

换句话说,只需将“Dim”移到例程之外。