Управление определенными пользователем типы по различным модулям

StackOverflow https://stackoverflow.com/questions/3977994

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top