Вызов переменных типа из другого суб

Привет, у меня есть ряд подпрограмм следующим образом:

  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

Любые идеи будут приветствоваться! Спасибо!


person marillion    schedule 13.09.2012    source источник


Ответы (2)


Держите свои переменные в как можно более ограниченной области.

Если вы вызываете NewSub из DataCollection, то сделайте Trucks() локальным для DataCollection и передайте его в качестве аргумента NewSub.

Если вы не вызываете один из другого, но они находятся в одном модуле, объявите Trucks() как переменную уровня модуля. Для этого используйте ключевое слово Private и сделайте объявление в верхней части модуля вне каких-либо процедур.

Наконец, если NewSub находится в другом модуле, вам необходимо объявить глобальную переменную. Используйте ключевое слово Public и объявите его в собственном модуле под названием MGlobals. Почему это собственный модуль? Хорошей практикой является ограничение использования глобальных переменных и объявление их всех в одном месте, чтобы вы могли более эффективно управлять ими. (Это означает, что ваш общедоступный тип также должен быть перемещен в MGlobals.)

Хорошо, сказав все это, прекратите использовать Types сейчас. В какой-то момент вашего проекта вам понадобится какая-то функция, выходящая за рамки того, что Type может сделать для вас. Я знаю, ты так не думаешь, но это произойдет. Итак, вы создадите функцию, которая это сделает, и она превратится в неуправляемый беспорядок. Итак, создайте класс Truck и класс Trucks. Класс Truck будет содержать два свойства. Класс Trucks будет содержать частный объект коллекции, содержащий все экземпляры Truck. Единственная глобальная переменная, которая вам понадобится, это gclsTrucks. Пока это входит в область действия, все ваши экземпляры Truck. Вся ваша тяжелая работа должна быть в классе Truck. Небольшая дополнительная работа прямо сейчас сэкономит вам много денег.

person Dick Kusleika    schedule 14.09.2012
comment
Вот своего рода отправная точка для создания класса dailydoseofexcel .com/archives/2010/07/09/ - person Dick Kusleika; 14.09.2012

Вы можете использовать глобальные переменные следующим образом.

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» за пределы программы.

person fabiopagoti    schedule 14.09.2012