Недавно я написал question с просьбой о помощи в подсчете количества случаев появления каждой уникальной пары аллергий в популяции. Решения, которые я получил, были замечательными, однако теперь мне нужно посмотреть на комбинации 3+ аллергии, и все это с помощью таблиц Excel займет много времени.Большой массив с заданным пользователем количеством измерений
Я решил написать скрипт VBA для этого, который отлично подходит для пар. Это также намного быстрее, так как я вернулся и изменил формат исходных данных, чтобы каждый связанный с AllExceptionID атрибут ExceptionID хранился в одной строке с разделителями-запятыми.
Теперь я смотрю на перемещение вверх к массиву 3D или выше, и поскольку мы не знаем, сколько измерений нам нужно будет поднимать (возможно, 10 или 15), я бы предпочел избежать использования ряда Case
или вложенные If/Then
заявления.
Моих исследований оказалось this article, в котором я понял, что я спрашиваю, практически невозможно, но я хотел бы спросить о заявлении, что ФП, что
Я думал, что можно было бы сделать, если бы я может построить оператор Redim во время выполнения в виде строки и выполнить строку, но это не представляется возможным.
У меня в основном была та же идея. В приведенном ниже коде генерируется ошибка несоответствия типа, но нет ли изменений в этом, которые могут работать? Можем ли мы не передавать другие функции (например, join
) внутри ReDim
?
Sub testroutine()
Dim x As Integer, y As Integer 'just a counter
Dim PairCount() As String
Dim AllergenRef As Object 'Object to store a reference to each AllergenID using AllergenKey as key
Set AllergenRef = CreateObject("Scripting.Dictionary")
For x = 1 To 20
AllergenRef.Add x, (x * 10) + (2^x) 'dummy data for my dictionary
Next x
Dim N_tuple As Integer
N_tuple = 5 'this value would be provided by a user form at runtime
Dim ArrayDim() As String
ReDim ArrayDim(1 To N_tuple)
For x = 1 To N_tuple
ArrayDim(x) = "1 to " & AllergenRef.Count
Next x
ReDim PairCount(Join(ArrayDim, ",")) 'This is the line that throws an error
End Sub
This article делает это звучит как то, что я делаю, это возможно в Java, но я не говорю по-яванского, так что я не могу сказать, как это похоже на то, что я пытаюсь достичь, или если есть способ применить этот метод к VBA ...
ОБНОВЛЕНИЕ ============
Вот образец данных I ' m с использованием (в отдельных колонках я добавил черточки для ясности)
ExceptionID - ExcAllergens
035 - 100380
076 - 100107,100392,100345,100596,100141,100151,100344
200 - 100123,100200
325 - 100381
354 - 100381,10 355 - 100381,10 360 - 100586
390 - 100151,100344,100345,100349
441 - 100380,100368
448 - 100021,100181,100345,100200,100344,100295
491 - 100381
499 - 100333
503 - 100333
507 - 100331,100346,100596,100345,100344,100269,100283
А вот отрывок из таблицы определений аллергена (аллерген ключ что-то я просто добавил так, чтобы иметь меньшие числа для работы, 6-значные числа - это то, что используется в нашей БД.)
AllergenKey - AllergenID - AllergenTag
01 - 100011 - ягоды асаи
02 - 100012 - уксусная кислота
03 - 100013 - Агар Агар
04 - 100014 - Агава
05 - 100015 - Алкоголь
06 - 100016 - Душистый
07 - 100017 - Аммоний Бикарбонат
08 - 100018 - Амилаза
09 - 100019 - Аннатто
10 - 100020 - Apple
11 - 100021 - Apple, Сырье
12 - 100022 - абрикос
13 - 100023 - Маранта
14 - 100025 - Аскорбиновая кислота
15 - 100027 - спаржа
16 - 100028 - Авокадо
17 - 100029 - бактериальная культура
18 - 100030 - Разрыхлитель
Обратите внимание, что есть 6810 профили исключения, начиная сюда от 1 до 51 раздельных аллергий (в среднем около 4 или 5) и 451 различных аллергенов. Вот результат моего анализа пар аллергена (кстати, когда я говорю «Аллерген» также включает в себя диетические предпочтения, как вегетарианец):
Топ 10 пара - пара графа - Аллерген 1 - аллерген 2
1 - 245 - Молочная - Клейковина
2 - 232 - Яйца - Гайки
3 - 190 - Молочная - Яйца
4 - 173 - Клейковина - Овес
5 - 146 - Соевый (может содержать) - Соевый
6 - 141 - Молочные продукты - Орехи
7 - 136 - Говядина - свинина
8 - 120 - Молочная - Соевый
9 - 114 - Сезам (могут содержать) - Гайки
10 - 111 - Вегетарианская 1 - Свинина
Вы не можете добавлять измерения к массиву, который уже clared. Таким образом, массив (10,10) не может быть переделан (ed) в массив (10,10,10) – Sorceri
Ну, мои массивы объявлены с пустыми круглыми скобками, и как только количество измерений задано пользователем, оно не изменяется, так что здесь не проблема – MikeG
То, что вы специально просите, не работает в VBA. Не зная структуру данных, которые вы пытаетесь проанализировать, трудно рекомендовать альтернативные методы, которые могут сработать для вас. 15-мерный массив был бы очень громоздким для работы и в большинстве случаев не нужен. Как правило, 3-мерный массив - это самое необходимое. Например, 1-мерный массив представляет собой просто список значений, 2-мерный массив представляет собой таблицу значений, а трехмерный массив представляет собой несколько таблиц значений. Есть ли какая-то конкретная причина, по которой вам нужно больше трехмерного массива? – tigeravatar