Как известно, встроенная в Excel функция листа Transpose имеет ограничения, вследствии чего её не удаётся применять для транспонирования произвольных массивов.
Вот список ограничений встроенной функции Transpose:
- Массив не может содержать элементов, длина которых превышает 255 знаков.
- Массив не может содержать пустые (Null) значения.
- Количество элементов не может превышать 5461.
Чтобы избежать этих ограничений, рекомендую использовать пользовательскую функцию TransposeArray:
Sub ПримерИспользования() ИсходныйМассив = ActiveSheet.UsedRange.Offset(1).Value ТранспонированныйМассив = TransposeArray(ИсходныйМассив) End Sub
Код самой функции:
Function TransposeArray(ByVal arr As Variant) As Variant ' Пользовательская функция для транспонирования массива Dim tempArray As Variant ReDim tempArray(LBound(arr, 2) To UBound(arr, 2), LBound(arr, 1) To UBound(arr, 1)) For X = LBound(arr, 2) To UBound(arr, 2) For Y = LBound(arr, 1) To UBound(arr, 1) tempArray(X, Y) = arr(Y, X) Next Y Next X TransposeArray = tempArray End Function
Комментарии
Я циклом пользуюсь для создания вертикального массива (двумерного) из горизонтального (в VBA нет средств для транспонирования массива)
Да и куда шустрее то, - создание вертикального массива выполняется моментально (в десятки раз быстрее, чем вывод массива на лист)
Доброго времени суток!
Подскажите пожалуйста, а как лучше вставлять на лист (столбцом) ОДНОМЕРНЫЙ массив, не используя штатную WorksheetFunction.Transpose? На ум приходят только циклы - может есть вариант пошустрее?
В документации указано, вроде бы
Игорь, добрый день.
"Количество элементов не может превышать 5461." - откуда такая цифра? Указана в документации или получена опытным путем?
Если бы стандартный метод не имел ограничений, описанных в статье, - я бы только им и пользовался.
А в универсальных решениях, гораздо удобнее применять этот макрос
для факультатива хорошо чтобы разобраться в транспонировании, но есть стандартный метод для транспонирования.
Отправить комментарий