суббота, 25 октября 2008 г.

Где брать примеры?

Мне нравится решать небольшие, но интересные задачки на использование макросов и форм в MS Office. А вот вызумывать я их не люблю. Проще работать с готовыми. Встает вопрос, где же их брать? Где, так сказать, рыбы много?
Думаем... Думаем...
Ну да, там где устроен рыборазводный комбинат. На сайтах для программистов-фрилансеров.
Ну так я пошел и зарегистрировался сразу на трех. На www.codesnap.com (совсем молодой сайт, заказов мало - но пусть будет), на www.odesk.com (сайт интересный - создатели продвигают свою систему учета рабочего времени фрилансеров, чтобы заказчики видели, за какие часы они платят), ну и на патриархе всех фрилансерских сайтов - www.elance.com.

Сайты регулярно доставляют задачки. Так что будет о чем писать.
В качестве приятного дополнения - за эти задачки еще можно и денег получить.

Положил туда в портфолио предыдущие работы.

среда, 22 октября 2008 г.

PowerShell - литература на русском языке

Некоторое время назад я перевел книгу Франка Коха (Frank Koch) "Windows PowerShell - An introduction to scripting technologies for people with no real background knowledge", выложенную в открытый доступ на сайте Microsoft.
Поскольку я стараюсь соблюдать авторские права, то обратился к Андрею, Бешкову, который курирует в русском Microsoft сообщество PowerShell, с вопросом - а как бы мне получить разрешение и выложить русский вариант книги?
Он откликнулся почти немедленно, сообщив, что Microsoft и автор книги, скорее всего, будут рады разместить ее у себя.
Так что уже скоро русскоязычных книг по PowerShell станет вдвое больше. :)

Вспоминать – не учить.



Говоря честно-откровенно, только между нами – последний раз я программировал за деньги лет шесть назад. Но если уж взялся писать о технологиях, грешно жить воспоминаниями, о том, каким был мир в мое время, верно?
Хорошая задачка подоспела как раз ко времени. Кому-то потребовалась особенная форма для создания писем в Outlook. Я сказал, что посмотрю, и посмотрев, согласился. Поскольку никто больше не захотел даже смотреть, работа перешла ко мне.
Надо сказать, что я крепко успел забыть программирование в Office. Только на то, чтобы найти кнопку режима проектирования, у меня ушло четыре часа. Без преувеличения скажу, что это было самой трудной частью задачи. Второй по сложности стала ошибка VBA в интерпретации цикла For…Next. Интерпретатор ругался на поставленный Next, не соглашаясь признавать его валидным концом цикла. Пришлось заменить цикл на Do-While.

Вот такая форма - простая, но со вкусом



Вообще по сравнению с другими программами Office объектная модель Outlook – это что-то особенное. «Нечеловеческая музыка» (с). Но часов за двенадцать я создал довольно аккуратную, и главное рабочую форму. Пара часов на отдельную кнопку (пользовательскую форму в Outlook нельзя назначить формой по умолчанию, для использования ее каждый раз приходится вытаскивать из хранилища) – и работа принята. Сказанные при этом комплименты меня очень порадовали. Искренние и добрые слова придают сил для дальнейшей работы. Ну и оплата очень способствует, да.

воскресенье, 12 октября 2008 г.

Что нельзя сделать функциями Excel?

Вчера мне предложили решить небольшую задачку для 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));"---"))


Вот и все, что я смог. Если у вас есть, что сказать по этому поводу - добро пожаловать в комментарии.