Транспонировать многомерный массив - PullRequest
0 голосов
/ 17 декабря 2018

Я написал некоторый код, который должен заполнять многомерный массив значениями.Исходный массив имеет размер 1000x1000, но в конце он должен быть преобразован в необходимый (фактически используемый) размер. Для этого я использую код:

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

Что происходит, когда размер массиваизменяется от 1000x1000 до 1000x120 (правильное значение) и до 1000x18.Так что первая транспонирование ничего не делает, если я вижу это правильно, поскольку размеры массива не переключаются.Но код выглядит правильно, не так ли?

Большое спасибо

1 Ответ

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

Я полагаю, что, возможно, предоставил ошибочную информацию в комментарии к предыдущему вопросу.Application.Transpose возвращает транспонированный массив, как и любая функция.Он не обрабатывает его «на месте», как параметр ByRef.

'NOT this was
Application.WorksheetFunction.Transpose (MultiArrPaerchen)
'Do it THIS WAY
MultiArrPaerchen = Application.WorksheetFunction.Transpose(MultiArrPaerchen)

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

Первый ReDim регулирует второй ранг;второй ранг - единственный, который можно изменить, если спеть аргумент Preserve с ReDim.

Первый транспонирование переворачивает первый и второй ранг.Теперь вы можете ReDim оригинального первого ранга, который не является последним рангом.

Второй ReDim корректирует последний ранг (который изначально был первым).

Второй Transpose берет перевернутый массив ивозвращает его в исходное положение с новыми размерами в обоих разрядах.

Sub test()

    Dim MultiArrPaerchen As Variant, m As Long, n As Long

    m = 1000
    n = 1000

    ReDim MultiArrPaerchen(1 To m, 1 To n)
    Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
    'results: 1 to 1000, 1 to 1000

    'UBounbds for 1 to 18, 1 to 120
    m = 18
    n = 120

    ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), _
                                    LBound(MultiArrPaerchen, 2) To n)
    Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
    'results: 1 to 1000, 1 to 120

    MultiArrPaerchen = Application.Transpose(MultiArrPaerchen)
    Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
    'results: 120, 1 to 1000

    ReDim Preserve MultiArrPaerchen(LBound(MultiArrPaerchen, 1) To UBound(MultiArrPaerchen, 1), LBound(MultiArrPaerchen, 2) To m)
    Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
    'results: 1 to 120, 1 to 18

    MultiArrPaerchen = Application.Transpose(MultiArrPaerchen)
    Debug.Print LBound(MultiArrPaerchen, 1) & " to " & UBound(MultiArrPaerchen, 1) & ", " & _
                LBound(MultiArrPaerchen, 2) & " to " & UBound(MultiArrPaerchen, 2)
    'results: 1 to 18, 1 to 120
End Sub
...