Excel : relative named ranges
Nov. 19th, 2010 04:54 pm«Шутка» для любителей Excel (смеяться грустно, после слова «L516»).
Знаете, есть там возможность дать какой-то области имя, и потом это имя использовать в формулах? В английском Excel это делается через Insert->Names.
Я только что потерял пол часа, пытаясь сделать то же самое через VBA.
Оказывается, когда я пишу Call ThisWorkbook.Names.Add("LIB_TYPE«, «=param!I1:K516»), написанный мною абсолютный адрес I1:K516 пересчитывается в относительный (относительно той ячейки, на которой стоит в это время курсор, например, если он стоит на A1, то пересчитанный адрес будет L1C9:L516C11), и именованная зона определяется с этим относительным адресом.
Таким образом, если я потом переставлю курсор на B1 и вызову LIB_TYPE, мне вернётся значение матрицы J1:L516! Я не могу представить себе, кому может понадобиться такое поведение именованных зон.
Решением является простановка долларов: Call ThisWorkbook.Names.Add("LIB_TYPE«, «=param!$I$1:$K$516»)
Дабы предупредить возможные комментарии «Переходи наLinux Open Office!», расскажу шутку из Open Office Calc. Предположим, у вас есть файл с двумя закладками: A и B. В закладке B есть формула, указывающая на ячейку X1 закладки A. Скопируем закладку B и поставим её (под именем C) третьей в этом же файле. Вместе со всеми данными закладки скопируется и формула, только теперь она будет указывать на ячейку X1 закладки B!
В данном случае я не то, что не понимаю, кому может пригодиться такое поведение. Я искренне верю, что писавшие Open Office люди просто проморгали этот баг. Надо бы как-нибудь сообщить о нём...
Знаете, есть там возможность дать какой-то области имя, и потом это имя использовать в формулах? В английском Excel это делается через Insert->Names.
Я только что потерял пол часа, пытаясь сделать то же самое через VBA.
Оказывается, когда я пишу Call ThisWorkbook.Names.Add("LIB_TYPE«, «=param!I1:K516»), написанный мною абсолютный адрес I1:K516 пересчитывается в относительный (относительно той ячейки, на которой стоит в это время курсор, например, если он стоит на A1, то пересчитанный адрес будет L1C9:L516C11), и именованная зона определяется с этим относительным адресом.
Таким образом, если я потом переставлю курсор на B1 и вызову LIB_TYPE, мне вернётся значение матрицы J1:L516! Я не могу представить себе, кому может понадобиться такое поведение именованных зон.
Решением является простановка долларов: Call ThisWorkbook.Names.Add("LIB_TYPE«, «=param!$I$1:$K$516»)
Дабы предупредить возможные комментарии «Переходи на
В данном случае я не то, что не понимаю, кому может пригодиться такое поведение. Я искренне верю, что писавшие Open Office люди просто проморгали этот баг. Надо бы как-нибудь сообщить о нём...
no subject
Date: 2010-11-19 04:34 pm (UTC)no subject
Date: 2010-11-19 04:57 pm (UTC)К тому же, есть какие-то задачи, которые делаешь каждый месяц, и каждый месяц они слегка отличаются друг от друга.
У меня вообще точка зрения, что Excel и ему подобные программы — это алфавит, грамотность нашего времени. если ты не умеешь работать с такими программами, ты можешь работать, но с той же эффективностью, как неграмотный человек может работать водителем автобуса (знание алфавита формально не требуется для работы). Теоретически можешь, но на практике — будешь регулярно терять время на каких-то простых вещах.
no subject
Date: 2010-11-19 05:15 pm (UTC)Я не говорил писать под вас, я говорил о более специальной программе, с такой же возможностью программирования (хоть бы и на бейсике, чтобы было легче людей с excel'ля пересадить), телегу с бортами и крышей и с двигателем. Не все туда влезет, но вам совсем все и не надо.
no subject
Date: 2010-11-19 06:27 pm (UTC).. впрочем, ехать или везти что-то на телеге все равно лучше и надежнее по сравнению с перетаскиванием мебели руками, или ожиданием изобретения антигравитации.
Подход "некогда чинить экскаватор, копать надо" плох когда копать много - но если надо кинуть две лопаты земли...
no subject
Date: 2010-11-20 10:30 am (UTC)no subject
Date: 2010-11-20 10:30 am (UTC)Если честно, мне уровень Excel очень даже подходит. Разумный компромисс: за 5 минут я на нём сделаю любую ерунду, при этом я уверен, что что бы я ни задумал сделать (ну, в разумных пределах — мне не нужно Quake на работе писать), это делается, и более того, в интернете есть тысячи описаний, как именно это сделать.
Например, если мне нужна какая-нибудь функция гамма, я уверен, что либо она есть в Excel, либо я её найду в сети. Функция не обязательно математическая (как мой пример с гаммой), любая — перевод номера колонки в его буквенное представление (вчера искал — нашёл за 2 минуты), pivot tables (ни разу сам не делал, вчера надо было поправить сделанную коллегой — за 5 минут в сети разобрался, как их через VBA править) и т.д. и т.п.
no subject
Date: 2010-11-22 01:01 pm (UTC)Мне по работе присылают много таблиц, в таблицах указаны имена вирусов (речь идет о гриппе, т.е. биологических вирусах), даты их выделения, результаты измерений и еще куча всякой информации в крайне нестабильном формате (т.е., в принципе, нужен интеллект, чтобы нормализовать эти данные). Но я сейчас о датах. Дату можно ввести так, что эксель поймет, что это дата, а, если ошибиться (например, написать 13/13/01), то эксель молча преобразует ячейку в формат строки. Т.е. не будет совсем никакого предупреждения и человек так и не заметит своей ошибки. Дата - это лишь простейший пример, там много всяких возможностей для ошибок в других полях и люди, естественно, ошибаются.
Предполагаю, что и ты с подобным сталкиваешься.
Мы думали написать на VBA проверку данных, но быстро выяснилось, что различных проверок много и форматы часто меняются (например, появляется новый вид гриппа: калифорнийский прошлой весной) и по-хорошему надо уже держать сервер со всеми справочниками, а лучше осуществлять проверку прямо на сервере (вместо практически ежедневной рассылки обновлений). Но это уже другая история. Но суть в том, что эксель, на самом деле, не очень пригоден для ввода данных.
no subject
Date: 2010-11-22 01:17 pm (UTC)А так да — на предыдущей работе у нас была необходимость обмениваться данными с филиалами, и там люди вводили что попало. Пока мы не стали делать «фашистские» файлы, то есть контроль на всех ячейках, в которых разрешён ввод, все остальные ячейки тупо заблокированы.
Пи этом, очевидно, проводили кучу времени на телефоне, потому как не смогли сразу предусмотреть все варианты (классика: филиал отделился от одной группы, и тут же его купила другая, тоже у нас застрахованная).
Так что да, согласен, подходит очень плохо. Но при этом не вижу какой-то разумной замены.
no subject
Date: 2010-11-19 06:38 pm (UTC)no subject
Date: 2010-11-20 10:33 am (UTC)Ты же понимаешь, я тоже в душе предпочитаю java. Но, во-первых, я трезво оцениваю способности к информатике моих коллег (продолжая аналогию, это уже не грамотность, а каллиграфия), а во-вторых, как задумаюсь, как на java сделать то самое представление данных, которое у меня в Excel by default — то есть растягиваемая по желанию таблица, выпадающие списки значений, форматирование одной кнопкой, графики на любой вкус. Это всё да, делается на java. И я даже, наверное, способен понять, как...
no subject
Date: 2010-11-20 07:28 pm (UTC)no subject
Date: 2010-11-22 01:05 pm (UTC)no subject
Date: 2010-11-22 01:22 pm (UTC)В качестве примера — Антони очень долго возился над тем, как сделать титульную страницу с двумя картинками за заголовке.
Аналогично с графиками, картинками и презентациями. У всего есть свои преимущества.
no subject
Date: 2010-11-22 01:33 pm (UTC)no subject
Date: 2010-11-22 01:34 pm (UTC)no subject
Date: 2010-11-22 01:37 pm (UTC)no subject
Date: 2010-11-22 01:41 pm (UTC)no subject
Date: 2010-11-22 01:44 pm (UTC)no subject
Date: 2010-11-22 01:49 pm (UTC)написанный мною абсолютный адрес I1:K516
Date: 2010-11-19 07:17 pm (UTC)no subject
Date: 2010-11-20 10:35 am (UTC)no subject
Date: 2010-11-20 10:33 am (UTC)no subject
Date: 2010-11-20 10:37 am (UTC)no subject
Date: 2010-11-20 10:40 am (UTC)задал зеркало поточечно, плюс производную
самое сложное - формализовать "угол падения = углу отражения" в терминах y=ax+b
Луч прекрасно строится по 3 точкам - точка на зеркале, точка далеко справа (прямой их эксель сам), и точка слева..
no subject
Date: 2010-11-20 10:45 am (UTC)no subject
Date: 2010-11-20 10:48 am (UTC)У меня была некая прога, которая считала на не очень сильном компе дифуры - эволюция системы со временем.
Я с тех пор привык, что матлаб запустил = перерыв на чай