Как назначить массивы с несколькими типами данных в VBA, а затем использовать данные в функциях, требующих определенных типов данных? - PullRequest
0 голосов
/ 02 октября 2019

Я работаю над программой, которая выполняет вычисления для нескольких физических элементов. Существует около 5 типов элементов, каждый из которых требует различных входных данных (с различными типами данных) для расчетов. Нет ограничений на количество элементов или порядок, в котором они могут быть рассчитаны.

Например: первый набор данных может содержать элемент типа A, элемент типа B и второй элементтип A.

Второй набор данных может иметь элемент типа C, элемент типа B и пять элементов типа A.

Элемент типа A может иметь тип (строка) вход и давление (двойной) вход. Элемент типа B может иметь тип (строковый) ввод, длину (двойное), количество ребер (целое). Элемент типа C может иметь ввод длины (двойной), ввод диаметра (двойной) и ввод количества (целое число)

Поскольку я не знаю количество или тип элементов заранее, я использовалвариантный массив, который имеет количество строк, которые могут быть назначены после того, как элементы выбраны пользователем, и число столбцов, равное максимальному количеству точек данных, необходимых для любого элемента.

Проблема заключается в том, что когда Iзатем попробуйте использовать эти данные в других функциях (вызывая Array (1,2)), я получаю ошибку «несоответствие типов аргументов byref».

Из того, что я могу сказать, это означает, что моя программа не ЗНАЕТ, что значение, содержащееся в слоте моего массива, может / должно быть правильным типом данных. он просто видит «вариант» в противоположность «двойному» или «строке» и выдает ошибку.

Я нашел несколько способов обойти это. 1) Я могу поместить данные в круглые скобки при вызове функции. Очевидно, это вынуждает данные соответствовать ожидаемому типу данных. функция (input1, (Array (1,2)), input3)

2) Я могу перейти ко всем своим функциям и изменить ожидаемые типы данных на вариант.

Проблема в том, что я выполняю инженерные расчеты, и я забочусь о поддержании определенного уровня точности в моих числах. Я также не хочу, чтобы мои функции могли работать, если ввод не имеет смысла. Мне кажется, что вариант 1 несет в себе высокий риск потери важных данных во время принудительного преобразования. Я не уверен, что вариант 2 лучше, так как vba, похоже, не назначает / не отслеживает эти типы данных, как я себе это представлял.

Есть ли лучший способ для меня назначать и передавать данныеразнообразие типов?

1 Ответ

0 голосов
/ 02 октября 2019

Похоже, вам, вероятно, следует создать несколько пользовательских типов или классов (где у каждого класса есть члены с определенными типами данных) для разных типов элементов, а затем вы можете добавить их в коллекцию / массив и передать для обработки.

Например, используя классы:

Пара базовых классов (только публичные переменные, без методов):

'class module clsA
Public MyType As String
Public Pressure As Double

'class module clsB
Public MyType As String
Public Length As Double
Public FinCount As Integer

В модуле обычного кода:

Sub tester()
    Dim colThings As New Collection, e

    colThings.Add MakeTypeAThing("TypeA", 67.92)
    colThings.Add MakeTypeBThing("TypeB", 19.56, 4)
    colThings.Add MakeTypeAThing("TypeA", 0.38)

    For Each e In colThings
        Debug.Print TypeName(e)
    Next e

End Sub


'Couple of "factory" functions to create instances of your classes
'  and set the member fields

Function MakeTypeAThing(typ As String, Pressure As Double) As clsA
    Dim rv As New clsA
    rv.MyType = typ
    rv.Pressure = Pressure
    Set MakeTypeAThing = rv
End Function

Function MakeTypeBThing(typ As String, l As Double, Fins As Integer) As clsB
    Dim rv As New clsB
    rv.MyType = typ
    rv.Length = l
    rv.FinCount = Fins
    Set MakeTypeBThing = rv
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...