Управление определенными пользователем типы по различным модулям
-
09-10-2019 - |
Вопрос
Какой лучший способ управлять общими типами, определенными пользователем в модулях VBA?
Я использую те же пользовательские типы в разных модулях. Например, мне часто нужно представлять (x, y) очки, поэтому я в конечном итоге Type
В разных модулях:
Type XYpointType
x As Double
y As Double
End Type
Я передаю аргументы типа XYpointType
и из судов и функций в разных модулях.
Однако я подозреваю, что это плохое способ управлять пользовательскими типами. Точное то же самое Type
Код определения заканчивается во многих различных модулях.
В качестве альтернативы, я мог бы иметь это Type
Декларация в одном, центральном модуле «типов» и всех других модулей, требующих этого конкретного типа, должно относиться к модулю типов. Недостатком является то, что каждый модуль теряет свою «модульность» в том, что он должен сопровождаться модулем «Типы», где бы он ни идет.
Какие-либо предложения?
Решение
Это интересно, потому что я никогда не знал, что у вас могут быть два модуля оба объявления общего типа с тем же именем. Теперь, когда я знаю, я в ужасе.
Итак, во-первых, Эрические башни верны, что вы хотите поставить свой тип декларации только в один модуль. Другие модули, которые используют этот тип, будут зависеть от того, что доступный модуль, но это просто то, что поставляется с модуляцией. Необходимость управления зависимостями между модулями распространена для всех разработок программного обеспечения. К сожалению, в рамках одного проекта VBA (например, такого рода вы найдете в одной рабочей книге Excel), единственным вариантом для управления модульными зависимостями является ручной. (В VBA «Модули» действительно «файлы кода исходных кодов». Другие языки / среды имеют различные системы упаковки более высокого уровня.)
Теперь для ужасающей части. Если вы делаете объявление типов с тем же именем в разных модулях, вы устанавливаете себя на проблемы. Рассмотрим два модуля VBA:
'Module1
Public Type typ
x As String
End Type
Public Sub useTyp()
Dim t As typ
t.x = 42
Debug.Print t.x + t.x
End Sub
и
'Module2
Public Type typ
x As Long
End Type
Public Sub useTyp()
Dim t As typ
t.x = 42
Debug.Print t.x + t.x
End Sub
В том же проекте ваш код будет «компилировать» (по крайней мере, в Excel VBA). Но два подсветках «Usetyp» дают разные выходные данные. Хуже, если вы удалите один из типовых деклараций от одного из модулей, вы вдруг изменили поведение процедуры «USETYP» в том же модуле! Такая двусмысленность никогда не желательна.
Что происходит, в том, что VBA действительно создает два разных типа, «Module1.Typ» и «Module2.Typ». Когда вы находитесь в том же модуле и не имеете право типа типа, VBA молча находит «правильный» тип и использует его.
Я немного удивлен, услышав, что вы проходите вокруг экземпляров одного «xypointtype» к модулям, которые имеют другое «Xypointtype» объявление. Это не так важно, но вы могли бы опубликовать код? Я заинтересован в злобных вещах, таких как это ...
Другие советы
Используйте свой второй метод. Дело в том, чтобы сделать многоразовые типы BLOB. Быть многоразовым, оно должно быть разделено. Затем, да, каждый модуль, который использует эти типы, должен ссылаться на то, что BLOB. Но одно и то же самое можно сказать о модулях, вызывающих друг друга, формы, требующие модулей, которые они вызывают, et c.
Вы также можете создать класс для ваших XyPoints. Это позволит вам иметь пользовательские функции, и методы должны вам понадобиться по этой дороге. Типы очень ограничены по сравнению с классами.
Вот хороший ресурс, чтобы начать: http://www.cpearson.com/excel/Classes.aspx.