Страницы: 1
RSS
Особенность сортировки диапазона с формулами, Баг или фича?
 
Убил кучу времени, пока сообразил, в чем дело:

Если в диапазоне есть формулы с относительными ссылками и явным указанием на текущий лист (например, на листе МойЛист в ячейке B1 — ссылка МойЛист!A1, в ячейке B2 МойЛист!A2 и т.д.), то при сортировке этого диапазона (например, по числовому столбцу C) такие ссылки не меняются, то есть обрабатываются, как абсолютные.

Это баг, прикол, или я чего-то не знаю?
 
dhead, добрый день.
Если ссылки перевести в стиль R1C1 (который, по-моему, Excel внутри себя и использует), то всё становится логичным.
Например, формулы в B1:B3:
Код
=A1
=A2
=A3
Станут одинаковыми (ссылаются на ячейку в той же строке и столбцом левее):
Код
=RC[-1]
=RC[-1]
=RC[-1]
Поэтому при сортировке (диапазон B1:C3) ничего не поменяется.
Другое дело - абсолютные ссылки (B1:B3) - они как раз и переместятся при сортировке:
Код
=A$1
=A$2
=A$3
Код
=R1C[-1]
=R2C[-1]
=R3C[-1]
 
Цитата
dhead написал:
Это баг, прикол, или я чего-то не знаю?
Это особенность.. При стандартной сортировке не отслеживаются перемещения ссылок. В ином случае наверное это бы сильно замедляло процесс. Ссылки корректируются если перемещать ячейки ручным перетаскиванием либо вырезать/вставить, либо соответствующими методами в vba коде (но там нужно создавать объект для каждой ячейки. В vba лучше всего делать сначала соротировку массива значений с дополнительным столбцом начальных индексов, потом перемещать объекты ячеек согласно новым позициям индексов. Я делал сие
Изменено: testuser - 25.03.2024 07:09:07
 
andypetr, testuser, мне казалось, что я точно описал суть проблемы, но сейчас вижу, что необходимо дополнение.
Иначе каждый понимает что-то свое:)

Я знаю про особенности сортировки ячеек с формулами, знаю как они выглядят в разных системах адресации и т.д. Проблема в том, что если ссылка относительная, но с явным указанием текущего листа в адресе, то сортировка работает так, как если бы ссылка была абсолютная. А если имя листа из адреса убрать, то все встает на свои места. В прямом и переносном смысле:)

Мне казалось, что на листе МойЛист формулы =МойЛист!А1 и =А1 идентичны и должны во всех случаях обрабатываться одинаково. Но нет.
Файл с примером во вложении.
Изменено: dhead - 25.03.2024 10:02:03
 
dhead, вот теперь понятно.
Вернее, не понятно в отношении Excel - зачем он так поступает.
Причём, если на листе Неправильно сменить формулы с "=Неправильно!A1" на "=Правильно!A1" - то сортировка отработает нормально.
Может, ещё от версии зависит? У меня Excel 2016.
 
Цитата
andypetr написал:
Может, ещё от версии зависит? У меня Excel 2016.
Проверял в 2007 и 2019. Работает одинаково странно.
 
Цитата
dhead написал:
Мне казалось, что на листе МойЛист формулы =МойЛист!А1 и =А1 идентичны и должны во всех случаях обрабатываться одинаково. Но нет.
Всегда так было, это особенность
 
ZVI, и это только при сортировке проявляется? Или еще в каких-то случаях.
 
dhead, да, проявляется только при сортировке,  других ситуаций не знаю
 
ZVI, успокоили, спасибо.
Получается, перед сортировкой желательно пробегать по диапазону реплейсом, удаляя ссылки на текущий лист.
Вообще, забавная особенность. И официальной инфы никакой, да и на форумах тоже ничего не нашел. Может плохо искал.
Изменено: dhead - 25.03.2024 13:45:14
 
Цитата
dhead написал: ...забавная особенность. И официальной инфы никакой, да и на форумах тоже ничего не нашел.
Просто редко случается. Вот, когда-то в 2008м отвечал на MrExcel - Sorting doesn't sort
 
Владимир, спасибо, не знал этого.
Владимир
 
Цитата
написал:
Владимир, спасибо, не знал этого.
Владимир, приветствую! Знать бы еще, зачем так сделано 🙂
 
Есть у меня подозрение, зачем это сделано. Не факт, но других идей нет.
По сути имя листа добавляется как правило в случаях, когда ссылка ведет на ДРУГОЙ лист или книгу. И если мы отсортируем таблицу со ссылками, а ссылки сортировать не станем - они могут в этом случае перестать ассоциироваться с нужными данными. Например, если мы ссылаемся на конкретную строку другого листа для получения из неё нужных данных. И для каждой строки текущей таблицы - это разная строка. При этом формула может не зависеть вообще от данных в текущей таблице - это ведь может быть совершенно самостоятельная формула, которая просто "тащит" показатель из другого листа просто на основании того, что пользователь решил, что для строки "Иван" текущей таблицы надо взять строку "7" листа "коэффициенты". И если мы не будем сортировать такие формулы - их ассоциации просто собьются.
Понятно, что более-менее продвинутые пользователи не делают такой бредовины, но ведь и Excel когда-то разрабатывали не для профи.
Другой вопрос, почему до сих пор не реализован механизм распознавания ссылок с именем листа текущего :) Думаю, просто забили на это дело, ибо общая статистика ошибок из-за этого бага явно незначительная.

P.S. Чтобы более понятно что я имею ввиду - добавьте еще один столбец в листе "Неправильно" и пропишите в нем на все значения формулы типа:
Код
=Правильно!A1

Т.е. ссылка на ячейку другого листа, которая соответствует конкретному имени.
Отсортируйте таблицу. Всё будет отсортировано корректно с точки зрения соответствия данных - т.е. Петя напротив Пети, Вася напротив Васи. При этом ссылки изменятся.
Изменено: Дмитрий(The_Prist) Щербаков - 25.03.2024 18:49:37 (добавил файл)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх