3

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

  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

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

4

2 回答 2

5

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

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

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

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

好的,说了这么多,现在停止使用类型。在您的项目中的某个时刻,您将需要一些 Type 无法为您提供的功能。我知道你不这么认为,但它会发生。因此,您将创建一个执行此操作的函数,它将变得一团糟。所以创建一个卡车类和一个卡车类。Truck 类将包含这两个属性。Trucks 类将包含一个私有集合对象,该对象包含所有 Truck 实例。您需要的唯一全局变量是 gclsTrucks。只要在范围内,您的所有 Truck 实例。您所有的繁重工作都应该在卡车类中进行。现在做一点额外的工作将为您节省很多。

于 2012-09-14T02:14:30.867 回答
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”移到例程之外。

于 2012-09-14T00:08:34.937 回答