从另一个子调用类型变量

mar*_*ion 3 excel vba global-variables excel-vba subroutine

嗨,我有一系列子程序如下:

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

Dic*_*ika 5

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

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

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

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

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