Страницы: 1
RSS
Симметрично отобразить таблицу (транспонировать)
 
Здравствуйте!  
Спасибо всем, кто помог мне вчера! Я очень благодарен!  
Остался еще один вопрос!    
Необходимо транспонировать  таблицу, т.е.отобразить ее симметрично относительно диагонали с помощью функций эксель (в приложенном файле задание написано!)  
 
Только прошу!! не просто сделать это, а здесь написать мне КАК это делается! помогите!  
Заранее благодарен
 
{quote}{login=}{date=04.09.2012 12:34}{thema=Симметрично отобразить}{post}Спасибо всем, кто помог мне вчера! {/post}{/quote}А Вы кто?
 
Пожалуйста! (я вчера помогал! :)  
Если Эксель английский:  
1. выделяем диапазон G5:K9  
2. в строке формул пишем =TRANSPOSE(A5:E9)  
3. ввод завершаем Ctrl+Shift+Enter  
 
Всё подробно описано в help по этой функции.  
Для русского будет так: =ТРАНСП(A5:E9)
 
Выбирайте.
 
забыл залогиниться)  
вчера ночью несколько тем создал с вопросами, спасибо кто отвечал)  
и здесь спасибо за ответы! помогли!
 
Среди вариантов, показанных ShAM, самый оптимальный:  
=ИНДЕКС($A$5:$E$9;СТОЛБЕЦ(B2);СТРОКА(B2))  
Не формула массива, не летуча.
 
Виктор, а почему не ТРАНСП(A5:E9)?  
Хоть и массивная, но одна на весть диапазон, а не три на каждую ячейку.    
Или всё равно медленнее?
 
По скорости не замерял, но вряд ли быстрее ИНДЕКС(). И формула с ИНДЕКС() одна, не три. Недостаток ТРАНСП() - трехпальцевый ввод.  
Два других варианта содержат СМЕЩ() и ДВССЫЛ() - функции, пересчет которых запускается при любом изменении на листе.
 
А СТОЛБЕЦ(B2);СТРОКА(B2)? Тоже ведь на каждую ячейку по две :)
 
{quote}{login=Hugo}{date=04.09.2012 11:44}{thema=}{post}А СТОЛБЕЦ(B2);СТРОКА(B2)? Тоже ведь на каждую ячейку по две :){/post}{/quote}  
Функции Индекс(), СТОЛБЕЦ() и СТРОКА() очень быстрые и не летучи, Даже 20-30 тыс. формул на листе не будут оказывать какого нибудь заметного влияния на открытие, работу и даже будут незаметны на пересчёт по F9.  
Функция СМЕЩ() тоже довольно быстрая, но ее недостаток - летучесть. Если таких формул листе 20-30 тыс, то при любом изменении на листе может быть торможение 0,1-0,5 сек.  
Функция ДВССЫЛ(), помимо того, что летуча, так еще и очень медленная (а в сочетании с АДРЕС() медленнее вдвойне). Уже 50 таких формул будут заметно тормозить. Эту функцию нужно применять только тогда, когда без нее не обойтись.  
На счет скорости ТРАНСП() ни чего сказать не могу. Недостатки - массивный ввод и точное выделение необходимого диапазона, так как, если выделить с "запасом" на возможное увеличение первоначального диапазона довольно сложно избавиться от #Н/Д (только с помощью УФ). И массивный ввод в диапазон не означает, что формула одна. Формул ровно столько, сколько ячеек в массиве.
 
"ввод в диапазон не означает, что формула одна" - точно?  
Если написать и использовать массивную UDF - она будет одна :)
 
Формула не может изменять или показывать значение в другой ячейке.  
Вывод: сколько ячеек, столько и формул.  
Кстати, то же и с UDF: она-то одна, но формул, ее использующих - ровно столько, сколько ячеек с этими формулами.
 
Но массивная UDF отрабатывает один раз для всего диапазона (если она так написана конечно).  
Кстати, UDF может изменить данные в другой ячейке :)
 
{quote}{login=Hugo}{date=05.09.2012 09:31}{thema=}{post}Кстати, UDF может изменить данные в другой ячейке :){/post}{/quote}  
Я делал акцент на формулах:  
>>...формул, ее использующих...
 
{quote}{login=vikttur}{date=04.09.2012 11:27}{thema=}{post}По скорости не замерял, но вряд ли быстрее ИНДЕКС(). И формула с ИНДЕКС() одна, не три. Недостаток ТРАНСП() - трехпальцевый ввод.{/post}{/quote}Я измерил - действительно, формула с ИНДЕКС - самая быстрая!  
Результаты (секунды):  
 
I ТРАНСП 11,2  
II ДВССЫЛ 23,7  
III ИНДЕКС 10,6  
IV СМЕЩ 11,8  
 
Методика для файла ShAM:  
 
Sub bb()  
Dim calc, i&, j&, t!, r As Range  
With Application  
   calc = .Calculation  
   .Calculation = xlCalculationManual  
   .ScreenUpdating = False  
   .EnableEvents = False  
End With  
Set r = [H12:K15]
For i = 1 To 4  
   DoEvents  
   t = Timer  
   For j = 1 To 100000  
       r.Calculate  
   Next  
   t = Timer - t  
   r(-1) = t  
   Set r = r.Offset(6)  
Next  
 
With Application  
   .Calculation = calc  
   .ScreenUpdating = True  
   .EnableEvents = True  
End With  
End Sub
 
Алексей, а проверь скорость не в 5Х5, а, например, в 11Х11, как у меня в примере. Нужно из верней таблицы получить нижнюю (или наоборот).  
зы. Вообще-то, если работа одноразовая, то самое быстрое - копируем диапазон (в моем случае А1:К11), затем выделяем ячейку (А15), спец.вставка - транспонировать. Что я и сделал. Если же диапазон динамический - до лучше через ИНДЕКС()  
 
зы.зы. проверил бы и сам, но я немного не в форме.
 
Я применил немного другую методику проверки скорости работы функций. Получил такие результаты.  
 
Индекс - 4,828125  
Индекс - 4,765625  
Индекс - 4,789063  
 
TRANSPOSE - 3,765625  
TRANSPOSE - 3,8125  
TRANSPOSE - 3,8125  
 
ДВССЫЛ 11,26563  
ДВССЫЛ 11,27344  
ДВССЫЛ 11,25  
 
СМЕЩ 4,492188  
СМЕЩ 4,460938  
СМЕЩ 4,5625  
 
на 10'000 циклов  
 
Можете проверить на своих компах.
 
ЗЫ. Если изменения на листе происходят в ячейке вне диапазона, например  
For i = 1 To 10000  
       [m1] = i
   Next  
то результаты такие  
Индекс - 2,101563  
Индекс - 2,09375  
 
TRANSPOSE - 2,078125  
TRANSPOSE - 2,132813  
 
ДВДВССЫЛ 11,34375  
ДВССЫЛ 11,28906  
 
СМЕЩ 4,5  
СМЕЩ 4,539063
Страницы: 1
Читают тему
Наверх