Привет, у меня есть ряд подпрограмм следующим образом:
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
Любые идеи будут приветствоваться! Спасибо!
Ответ 1 · рейтинг 5 · Dick Kusleika
Держите свои переменные в как можно более ограниченной области.
Если вы вызываете NewSub из DataCollection, то сделайте Trucks() локальным для DataCollection и передайте его в качестве аргумента NewSub.
Если вы не вызываете один из другого, но они находятся в одном модуле, объявите Trucks() как переменную уровня модуля. Для этого используйте ключевое слово Private и сделайте объявление в верхней части модуля вне каких-либо процедур.
Наконец, если NewSub находится в другом модуле, вам необходимо объявить глобальную переменную. Используйте ключевое слово Public и объявите его в собственном модуле под названием MGlobals. Почему это собственный модуль? Хорошей практикой является ограничение использования глобальных переменных и объявление их всех в одном месте, чтобы вы могли более эффективно управлять ими. (Это означает, что ваш общедоступный тип также должен быть перемещен в MGlobals.)
Хорошо, сказав все это, прекратите использовать Types сейчас. В какой-то момент вашего проекта вам понадобится какая-то функция, выходящая за рамки того, что Type может сделать для вас. Я знаю, ты так не думаешь, но это произойдет. Итак, вы создадите функцию, которая это сделает, и она превратится в неуправляемый беспорядок. Итак, создайте класс Truck и класс Trucks. Класс Truck будет содержать два свойства. Класс Trucks будет содержать частный объект коллекции, содержащий все экземпляры Truck. Единственная глобальная переменная, которая вам понадобится, это gclsTrucks. Пока это входит в область действия, все ваши экземпляры Truck. Вся ваша тяжелая работа должна быть в классе Truck. Небольшая дополнительная работа прямо сейчас сэкономит вам много денег.
Ответ 2 · рейтинг 2 · fabiopagoti
Вы можете использовать глобальные переменные следующим образом.
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" за пределы программы.