3

こんにちは、次のような一連のサブルーチンがあります。

  1. DataCollection() : スプレッドシートからデータを収集し、カスタム型変数に書き込みます。

  2. NewSub() : 何か他のことを行いますが、質問には関係ありません。

以前に宣言された同じ変数を保持し、2 番目のサブに値を割り当てたいと思います。どうにかしてそれらをグローバル変数にする必要があると思いますが、これまでのところ解決できませんでした。何をしても、変数が定義されていないというエラーが発生します。私のコードは次のとおりです。

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 に移動します。)

OK、そうは言っても、タイプの使用は今すぐやめましょう。プロジェクトのある時点で、Type でできることを超えた機能が必要になることがあります。あなたがそうは思わないことはわかっていますが、それは起こります。したがって、それを行う関数を作成すると、管理不能な混乱になります。それで、Truck クラスと Trucks クラスを作成します。Truck クラスには 2 つのプロパティが含まれます。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 に答える