суббота, 25 октября 2008 г.
Где брать примеры?
Думаем... Думаем...
Ну да, там где устроен рыборазводный комбинат. На сайтах для программистов-фрилансеров.
Ну так я пошел и зарегистрировался сразу на трех. На www.codesnap.com (совсем молодой сайт, заказов мало - но пусть будет), на www.odesk.com (сайт интересный - создатели продвигают свою систему учета рабочего времени фрилансеров, чтобы заказчики видели, за какие часы они платят), ну и на патриархе всех фрилансерских сайтов - www.elance.com.
Сайты регулярно доставляют задачки. Так что будет о чем писать.
В качестве приятного дополнения - за эти задачки еще можно и денег получить.
Положил туда в портфолио предыдущие работы.
среда, 22 октября 2008 г.
PowerShell - литература на русском языке
Поскольку я стараюсь соблюдать авторские права, то обратился к Андрею, Бешкову, который курирует в русском Microsoft сообщество PowerShell, с вопросом - а как бы мне получить разрешение и выложить русский вариант книги?
Он откликнулся почти немедленно, сообщив, что Microsoft и автор книги, скорее всего, будут рады разместить ее у себя.
Так что уже скоро русскоязычных книг по PowerShell станет вдвое больше. :)
Вспоминать – не учить.
Хорошая задачка подоспела как раз ко времени. Кому-то потребовалась особенная форма для создания писем в Outlook. Я сказал, что посмотрю, и посмотрев, согласился. Поскольку никто больше не захотел даже смотреть, работа перешла ко мне.
Надо сказать, что я крепко успел забыть программирование в Office. Только на то, чтобы найти кнопку режима проектирования, у меня ушло четыре часа. Без преувеличения скажу, что это было самой трудной частью задачи. Второй по сложности стала ошибка VBA в интерпретации цикла For…Next. Интерпретатор ругался на поставленный Next, не соглашаясь признавать его валидным концом цикла. Пришлось заменить цикл на Do-While.
Вообще по сравнению с другими программами Office объектная модель Outlook – это что-то особенное. «Нечеловеческая музыка» (с). Но часов за двенадцать я создал довольно аккуратную, и главное рабочую форму. Пара часов на отдельную кнопку (пользовательскую форму в Outlook нельзя назначить формой по умолчанию, для использования ее каждый раз приходится вытаскивать из хранилища) – и работа принята. Сказанные при этом комплименты меня очень порадовали. Искренние и добрые слова придают сил для дальнейшей работы. Ну и оплата очень способствует, да.
воскресенье, 12 октября 2008 г.
Что нельзя сделать функциями Excel?
Имеется таблица:
В ячейку X1 следует поместить наиболее позднее значение из столбца G по указанной дате из B, или "последнее" значение из столбца G.
Просто использовать функцию ВПР нельзя, поскольку дате в B может соответствовать пустое поле в G (желтые строки).
Кроме того, было введено серьезное ограничение: таблица будет просматриваться на коммуникаторе, поэтому использовать VBА или вынести нужный код в отдельную .dll нельзя. Все, что у меня есть - это функции в ячейке.
Обдумывание условий показало, что они неполны.
- Непонятно, откуда должна браться дата для поиска. Функции Excel не распознают ни положения курсора, ни выделения ячеек. Я решил, что дата для поиска будет помещаться в ячейку W1.
- "Последнее" значение в столбце G тоже может оказаться пустым. На этот случай тоже надо было предусмотреть какие-то действия
У меня уже сложился отличный алгоритм. Всего-то делов - начать поиск с последней строки и продвигаться вверх, фильтруя пустые строки. Так, а какая функция это умеет?...
А никакая. Оп-па.
Честно скажу, не ожидал. Но факт есть факт - все функции Excel для поиска в списке могут искать только по возрастающему списку. Они прекращают работу после первого найденного значения - совсем хорошо. Ни циклов, ни рекурсии, ни координат активной ячейки или выделения. Прекрасно.
Ладно, а что же я могу? Могу узнать, существует ли указанная дата. Могу найти значение по дате, хотя бы первое. Могу проверить, не пустое ли оно. Могу вывести результат в X1. Ну так сделаю хотя бы это. Вот что в итоге оказалось в ячейке X1:
=ЕСЛИ(НЕ(ЕНД(ВПР($W$1;$B$1:$G$4096;6;ЛОЖЬ)+ЕПУСТО(ВПР($W$1;$B$1:$G$4096;6;ЛОЖЬ)));ВПР($W$1;$B$1:$G$4096;6;ЛОЖЬ);ЕСЛИ(НЕ(ЕПУСТО(ИНДЕКС($G$1:$G$4096;СЧЕТЗ($В$1:$В$4096))));ИНДЕКС($G$1:$G$4096;СЧЕТЗ($B$1:$B$4096));"---"))
Этот текст функции можно вставлять в ячейку, но понять его нельзя. :) Давайте разберемся, что он делает:
//Если дата, указанная в ячейке W1, имеется в столбце B, и первое значение, соответствующее этой дате, в столбце G - непустое, то
=ЕСЛИ(НЕ(ЕНД(ВПР($W$1;$B$1:$G$4096;6;ЛОЖЬ)+ЕПУСТО(ВПР($W$1;$B$1:$G$4096;6;ЛОЖЬ)));
// Вывести это значение
ВПР($W$1;$B$1:$G$4096;6;ЛОЖЬ);
// Иначе, если последнее значение в столбце G непустое, то
ЕСЛИ(НЕ(ЕПУСТО(ИНДЕКС($G$1:$G$4096;СЧЕТЗ($В$1:$В$4096))));
// Вывести его, иначе вывести прочерк
ИНДЕКС($G$1:$G$4096;СЧЕТЗ($B$1:$B$4096));"---"))
Вот и все, что я смог. Если у вас есть, что сказать по этому поводу - добро пожаловать в комментарии.