Многомерный Массив редим - PullRequest
       7

Многомерный Массив редим

0 голосов
/ 12 декабря 2018

еще раз мне нужна помощь:)

У меня есть список значений И для каждой строки следует проверить, есть ли другая строка, в которой значения столбца D и E идентичны текущей строке.Таким образом, все значения, в которых столбцы D и E идентичны, необходимо сгруппировать.

его часть, кажется, работает нормально, но я хотел сохранить пары / группы в многомерном массиве, и там все становится сложно.

MultiArrPaerchen(m, n) = VarBasisZeile 
m = m + 1 
ReDim Preserve MultiArrPaerchen(0 To m, 0 To n)

Это должно быть важной частью кода.Новое значение должно быть добавлено, а затем массив увеличен и переделан.Сама ошибка возникает в последней строке.Есть идеи?Это первый раз, когда я использую многомерные массивы, поэтому вполне возможно, что я допустил здесь ошибку.

Заранее большое спасибо.


Просто чтобы убедиться, что я правильно понял, что @ user10779473сказал:

ReDim MultiArrPaerchen(0 To 1000, 0 To 1000)

'The arrays gets filled and with every new value m or n increases when necessary

ReDim Preserve MultiArrPaerchen(0 To m, 0 To n)
Application.Transpose (MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(0 To n, 0 To m)
Application.Transpose (MultiArrPaerchen)

End Sub

В конце концов мой массив имеет именно тот размер, который мне нужен.Единственная проблема, моя массива не может получить выше 1000?


после попытки вышеуказанной версии я все еще получаю ту же ошибку (9) на первом

ReDim Preserve MultiArrPaerchen (0 To m, 0 To n)

линия.На данный момент m равно 120, а n равно 18, поэтому я бы предположил, что такие подходящие числа.

Большое спасибо, это большое новое знание для меня:)


Это работает:D или хотя бы половина его ^^ Возможно ошибка с транспонером?

Это текущий код:

ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), LBound(MultiArrPaerchen, 2) To n)
Application.Transpose (MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), LBound(MultiArrPaerchen, 2) To m)
Application.Transpose (MultiArrPaerchen)

И в окне VBA Local отображается Variant (от 0 до 1000 и 0до 120).120 - подходящее значение, другое должно быть 18, но, по-видимому, значение m не становится кратким.

Что-то я заметил, что F8, используя код, является первым вариантом (от 0 до 1000 и от 0 до 18) и затем (от 0 до 1000 и от 0 до 120).Таким образом, проблема действительно заключается в транспонировании между ними.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

В VBA вы можете изменить только размер последнего измерения в массиве.

Поскольку ваш MultiArrPaerchen(m, n) является двумерным массивом, размер m изменить нельзя.

Используйте функцию transpose для перемещения первого измерения во второе, затем redim для изменения размера.

dim MultiArrPaerchen as variant

MultiArrPaerchen = Application.Transpose(VarBasisZeile) 
ReDim Preserve MultiArrPaerchen(lbound(MultiArrPaerchen, 1) to ubound(MultiArrPaerchen, 1), lbound(MultiArrPaerchen,2) to ubound(MultiArrPaerchen, 2) + 1)
0 голосов
/ 12 декабря 2018

Вы можете получить размеры вашего массива аванс .

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

Поскольку неясно, как вы используете многомерный массив, вот как вы можете установить размеры в одномерном массиве, прежде чем когда-либо присвоить ему значение (следовательно, не нужно использовать Preserveвообще) используя функцию рабочего листа: COUNTIF():

Dim dupeCount As Long
dupeCount = WorksheetFunction.CountIf([D:D], [E1])
ReDim MultiArrPaerchen(dupeCount - 1)

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

0 голосов
/ 12 декабря 2018

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

Однако вы можете Транспонировать массив, чтобы перевернуть ряды двумерного массива, изменить новый последний ранг, а затем Транспонировать, чтобы вернуть двумерный массив в его первоначальную форму.Это приведет к расширению или усечению «строк» ​​(первого ранга) двумерного массива.

MultiArrPaerchen(m, n) = VarBasisZeile 
m = m + 1 
application.transpose(MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(0 To n, 0 To m)
application.transpose(MultiArrPaerchen)

Это требует времени и вычислений, особенно если они выполняются многократно в большом цикле.Как упоминалось в комментариях (спасибо K.Dᴀᴠɪs ), значительно лучше сначала спрогнозировать ваши верхние границы (UBound) каждого ранга или сделать начальные пределы достаточно большими, чтобы справиться с любыми обстоятельствами и уменьшить массив с помощьюодиночная транспонирование / редим / транспонирование после завершения цикла.

Добавление

Это исправит ваше недавнее добавление к вашему вопросу.

dim m as long, n as long
ReDim MultiArrPaerchen(0 To 1000, 0 To 1000)
m = 0
n = 0

for each something in something else
    if some condition then 
        MultiArrPaerchen(m, n) = something
        m = m + 1
        n = n + 1
    end if
next something

'm is now 199, n is now 255

ReDim Preserve MultiArrPaerchen(lbound(MultiArrPaerchen, 1) To ubound(MultiArrPaerchen, 1), lbound(MultiArrPaerchen, 2) To n)
Application.Transpose (MultiArrPaerchen)
ReDim Preserve MultiArrPaerchen(lbound(MultiArrPaerchen, 1) To ubound(MultiArrPaerchen, 1), lbound(MultiArrPaerchen, 2) To m)
Application.Transpose (MultiArrPaerchen)

debug.print lbound(MultiArrPaerchen, 1) & ":" & ubound(MultiArrPaerchen, 1)
debug.print lbound(MultiArrPaerchen, 2)& ":" & ubound(MultiArrPaerchen, 2)

'result in Immediate window
0:199
0:255

¹ Транспонирование имеет верхний предел короткого целого числа со знаком;1.e.32767.Если вам требуются большие транспозиции, вам придется написать свой собственный или получить один из нескольких примеров на этом сайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...