Страницы: 1
RSS
Ошибка Application.Transpose, Type Mismatch
 
Всем привет!

Кто знает, поделитесь справочной информацией, а то на MS ничего не нашел.
Есть простой код, который транспонирует массив типа Variant. Размерность его (1 to 300k, 1 to 1). Насколько я понял есть какое-то ограничение на использование Application.Transpose, т.к. один и тот же кусок кода нормально обрабатывает маленький массив (размерность в десятках), а на большом выдает ошибку.
Интересно знать, какая именно граница установлена, а так же, как ее обойти штатно. Если навскидку никто не подскажет, буду писать свою процедуру.

Фрагмент
Код
Dim arr(), arr2()
...
arr2() = Application.Transpose(arr())
...


Заранее огромное спасибо.
 
Два ограничения:
массив не может превышать 65536 строк
длина текста внутри может быть длиннее 255 символов, но при использовании Transpose будет обрезана до 255.
Еще проблема может быть в недостатке памяти.
Лично я советовал бы написать свою несложную функцию, аналогичную Transpose. На массивах будет работать весьма быстро.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Большое спасибо за оперативный ответ. Жаль, что так. Насколько я понял, Transpose изначально заточен под диапазоны, а обработка массивов в чистом виде - это как следствие. Так?
В любом случае спасибо)
 
Гугл говорит немного о других ограничениях:
Цитата
Как известно, встроенная в 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
Изменено: Александр Моторин - 06.11.2013 21:24:13
 
Да, этот код я уже встречал. Приспособлю к своим нуждам. За Null-значения отдельное спасибо.
 
Часто функцию транспонирования используют, чтобы считать ряд (строку)  или колонку в архив. В этом случае должен получиться одномерный архив. Приведенная выше функция будет такая:

Код
Function TransposeArrayX1(ByVal arr As Variant) As Variant
     ' Пользовательская функция для транспонирования массива
    Dim tempArray As Variant
     ReDim tempArray( LBound(arr, 1) To UBound(arr, 1))
     
         For Y = LBound(arr, 1) To UBound(arr, 1)
             tempArray( Y) = arr(Y, 1)
         Next Y
     
     TransposeArrayX1 = tempArray
End Function
Изменено: LeKon - 23.08.2019 15:25:48
Страницы: 1
Наверх