您好我有一系列子程序如下:
DataCollection():从电子表格中收集数据并将其写入自定义类型变量。
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
任何想法都会受到欢迎!谢谢!
答案 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”移到例程之外。