Krasnaja Shapka писал(а):...СТОЛБЕЦ(ИНДЕКС(1:1;1):ИНДЕКС(1:1;ЧИСЛСТОЛБ(A1:IV1))),
... можно заменить на
...СТОЛБЕЦ(A1:IV1)???
можно, но при двух условиях:
1) первая ячейка будет всегда в столбце А
2а) если диапазон кончается последним столбцом листа (напр.: А1:IV1 в Excel97-2003 или A1:XFD в Excel2007), никто не введет дополнительных столбцов перед столбцом A
2б) если диапазон не доходит до последнего столбца листа (напр.: А1:Z1), никто не введет дополнительных столбцов между первым и последним столбцами диапазона
Krasnaja Shapka писал(а):а... тьфу... нельзя заменить в общем случае, да... можно лько на
...СТОЛБЕЦ(A1:IV1)+СТОЛБЕЦ(A1)-1
Да, это нормальная альтернатива, даже слегка побыстрее в Excel2007.
Krasnaja Shapka писал(а):э... так может макрос будет работать быстее, если вместо всего кода написать Evaluate("Ч(СМЕЩ(A1;;ЧИСЛСТОЛБ(A1:IV1)-СТОЛБЕЦ(ИНДЕКС(1:1;1):ИНДЕКС(1:1;ЧИСЛСТОЛБ(A1:IV1)));1))")...
насколько мне известно, функция OFFSET(СМЕЩ) утрачивает способность возвращать массив при вызове ее через Evaluate
Но даже если закрыть глаза на это обстоятельство, то след. функция в 1000 ячеек затрачивает у меня 414 миллисек:
- Код: Выделить всё
Function ReverseArr(rng As Range)
Dim strAddress As String
strAddress = rng.Address(, , , True)
ReverseArr = Evaluate("N(OFFSET(INDEX(" & strAddress & ",1),,COLUMNS(" & strAddress & ")-COLUMN(INDEX(1:1,1):INDEX(1:1,COLUMNS(" & strAddress & "))),1))")
End Function
Krasnaja Shapka писал(а):...или посчитать тоже самое через Application.WorksheetFunction???
придется полностью менять концепцию решения - функция OFFSET недоступна в коллекции WorksheetFunction, а на ней все и строится
Если очень хочется сделать, чтобы в ячейке было что-то короткое, попробуй присвоить формуле имя через меню Вставка-Имя-Присвоить, только следи за относительными ссылками.
Krasnaja Shapka писал(а):или в таком случае ReverseArr тоже летучей станет?
Пользовательскую функцию можно сделать летучей
только с помощью инструкции Application.Volatile.