【问题标题】:Calling type variables from another sub从另一个子调用类型变量
【发布时间】:2012-09-13 22:48:55
【问题描述】:

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

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

  2. NewSub() :执行其他操作,但与问题无关。

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

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

欢迎任何想法!谢谢!

【问题讨论】:

    标签: vba excel global-variables subroutine


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    【解决方案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”移到例程之外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 2014-12-29
      • 2016-02-04
      相关资源
      最近更新 更多