Мэри, моей любимой жене, лучшему другу и постоянному спутнику. А также Чарли, самому забавному кокерспаниелю в мире, моему любимцу на протяжении вот уже 12 лет. Введение Я написал книгу Моделирование с помощью Microsoft Excel и VBA: разработка сис тем поддержки принятия решений для студентов и профессионалов, которые хотят создавать системы поддержки принятия решений с помощью электронных таблиц на основе Microsoft Excel. Предполагается, что вы уже знакомы с моделированием ситуаций принятия решений в электронных таблицах или изучаете методы разра# ботки подобных систем (по крайней мере имеете непосредственное отношение к системам прогнозирования возможных ситуаций). От вас не требуется специальных знаний по программированию. Настоящая книга состоит из двух частей. В первой изложены основные концепции и принципы программирования на VBA (Visual Basic for Applications), во второй части рассматриваются приложения и детально ана# лизируется их исходный код. Существует немало книг по программированию на VBA, не меньше изданий по# священо созданию систем поддержки принятия решений, а также методам модели# рования возможных ситуаций в электронных таблицах. Но я не нашел на рынке ни одной книги, рассматривающей все эти темы в одном практическом руководстве. Книга Моделирование с помощью Microsoft Excel и VBA: разработка систем поддержки принятия решений в полной мере рассматривает все описанные выше принципы, и я надеюсь, что она окажется полезным источником и справочником для многих читателей. Причины написания этой книги Предпосылки для написания данной книги возникли пять лет назад, когда я вме# сте с Уэйном Уинстоном (Wayne Winston) активно экспериментировали с системами практического обучения управлению, созданными на основе электронных таблиц. В это время было написано первое издание книги Practical Management Science (PMS). Поскольку меня всегда интересовало программирование, то я решил изучить язык VBA #### относительно новый макроязык, используемый в Excel. В дальнейшем я использовал его в курсе моделирования научных операций. Мне хотелось научить студентов создавать совершенные модели электронных таблиц, например таких, которые представляют приложение с прикладной и клиентской частями. С этой целью предлагалось использовать язык VBA. Клиентская часть приложения пре# доставляла пользователю возможность вводить исходные данные модели. Обычно для этого использовались диалоговые окна. Прикладная часть применялась для создания пользовательского в результате выполнения необходимых вычислений. Оказалось, что подобная задача вызывает всеобщий интерес и дополняет стандарт# ный курс моделирования, с чем единогласно согласились мои студенты. Основной проблемой в преподавании такого курса был недостаток соответствующей литературы, 26 Введение посвященной языку VBA. Несмотря на то, что в последнее время появилось доста# точное количество книг по VBA, в них рассматриваются преимущественно техниче# ские вопросы; главной же их целью является обучение лишь основам программиро# вания на языке VBA. Мне посоветовали написать собственную книгу, посвященную моделированию систем принятия решений, на что я с радостью согласился. Это са# мый подходящий момент для написания такой книги, так как ее выход совпадет с выходом второго издания PMS. Я предполагаю, что многие читатели PMS решат ис# пользовать фрагменты этой книги для обогащения своих знаний о методах науч# ного управления. Для тех читателей, которые слушают курс научного управления, в этой книге приведено достаточно материала, чтобы в полной мере ознакомиться с его основами на самостоятельном уровне. Цели Книга Моделирование с помощью Microsoft Excel и VBA: разработка систем под держки принятия решений рассказывает о том, как эффективно использовать моде# лирование в приложениях электронных таблиц для решения повседневных задач. С помощью языка VBA сложные модели научного управления становятся доступ# ными обычным пользователям. Для этого создаются упрощенные окна ввода данных и вывода отчетов. В книге подробно описан процесс разработки таких приложений, предназначенных для решения различных экономических задач. В процессе создания этой книги я постоянно задавал себе такой вопрос: ‘‘Что чи# татель сможет сделать самостоятельно?’’ Достаточно ли студенту показать завершен# ное приложение, описать его возможности и привести исходный код, не углубляясь в детальное рассмотрение? Или все же стоит подробно описать все действия по соз# данию приложений, научить пользователей ‘‘с нуля’’ разрабатывать собственные приложения? Я все еще не уверен в правильном ответе и подозреваю, что он будет зависеть от конечной аудитории, но знаю, что смогу обеспечить пользователей дос# таточными для самостоятельного создания приложений знаниями. Я заставлю пове# рить вас в свои силы и убедить вас в важности разработки таких приложений. С учетом всего вышесказанного я написал книгу, которая будет полезна пользо# вателям любого образовательного уровня. Для тех читателей, которые желают изу# чить язык VBA ‘‘с нуля’’ и потом применять полученные знания на практике, я опи# сал основы использования VBA в первых 13 главах. Этот обзор языка не настолько подробен, как в толстенных книгах по VBA в Excel, но я верю, что он в полной мере описывает основные понятия и концепции VBA. Самое важное, что в главе 6 рас# смотрены методы работы с диапазонами Excel (они активно применяются в сле# дующих главах и примерах). Изучив их, вы избавитесь от необходимости поиска ин# формации в интерактивном справочном руководстве, который зачастую сводится к применению ‘‘народного’’ способа проб и ошибок. Начинающие пользователи смогут практически использовать полученные навыки в главах 14##30. Но всегда найдутся пользователи, которым уже известны базовые методы программирования на VBA. Они могут смело воспользоваться примерами во второй части книги, чтобы практически Введение 27 изучить принципы разработки приложений. Как вы вскоре убедитесь, в книге реа# лизован универсальный подход к описанию методов программирования приложе# ний. Например, модель минимизации затрат на распространение товаров (глава 19) полностью универсальна, она может использоваться для решения любых моделей расчета минимальной стоимости распространения товаров в большой сети, описан# ных в главе 5 книги PMS (второго издания). Научный подход Мой подход к представлению данных в этой книге напоминает тот, который был применен в книге PMS #### я предпочитаю преподавать (и учиться) на примерах. Ока# залось, что я могу заставить себя выучить язык программирования только при нали# чии продуманной мотивации. Не думаю, что среди вас найдется хоть один человек с другим взглядом на эту проблему. Приложения, описанные в последних главах, основаны на самых интересных примерах из книги PMS. Они предоставят вам дос# таточную мотивацию для изучения материала. Эти примеры показывают, что данная книга не о программировании ради программирования, а о разработке полезных приложений для решения экономических задач. Студенты и профессиональные экономисты уже понимают, что навыки моделирования финансовых задач в Excel значительно расширяют их возможности по сравнению с возможностями рядовых пользователей процессоров электронных таблиц. Настоящая книга позволяет по# нять, как с помощью VBA упростить задачи пользователей, решающих экономиче# ские задачи. Содержимое книги Книга состоит из двух частей. Первая часть #### главы с 1 по 13 #### описывают основы языка VBA; они будут полезны студентам и начинающим пользователям с небольшим опытом программирования на VBA (или любом другом языке програм# мирования). Несмотря на то, что эти главы посвящены исключительно VBA, неко# торые из них затрагивают общие концепции программирования, а также рассматри# вают преимущества использования среды программирования в Excel. В частности, в главах 7, 9 и 10 описаны условные операторы (конструкции IfThenElse), циклы, массивы и подпрограммы, которые являются общими во многих языках программи# рования. В то же время в главах 6 и 8 речь пойдет о методах управления в VBA наиболее распространенными объектами Excel (диапазонами, книгами, листами и диаграммами). Кроме того, в некоторых главах предлагается описание объектов VBA, которые могут быть применены в Excel или других приложениях пакета Office (Access, Word, PowerPoint и т.д.), использующих VBA в качестве встроенного языка программирования. В частности, в главе 3 рассматривается редактор Visual Basic (Visual Basic Editor #### VBE), глава 5 посвящена записи макросов, в главе 11 вы научи# тесь запускать надстройку Поиск решения непосредственно из кода VBA. В главе 12 речь пойдет о создании пользовательских форм (диалоговых окон), в главе 13 #### об отладке и обработке ошибок. 28 Введение В первой части содержатся концептуально важные сведения, поскольку без их знания вы не сможете продвинуться в изучении дальнейшего материала этой книги. Но подобную информацию вы можете без особых проблем почерпнуть из других книг, в которых основы языка VBA рассмотрены на максимально детальном уровне1. Основной материал настоящей книги приведен во второй ее части #### в главах с 14 по 30. В каждой главе второй части вы найдете описание отдельного приложения элек# тронных таблиц. Чаще всего рассматриваемые приложения предназначены для оп# тимизации и моделирования определенных задач. Многие из приложений настолько универсальны, что вы сможете легко приспособить их для решения собственных за# дач. Например, в главе 16 рассматривается обобщенное приложение, моделирующее производство широкого ассортимента товаров, в главе 18 описывается обобщенное приложение планирования производства, а в главе 19 вы изучите обобщенное при# ложение расчета минимальных затрат при сетевом распространении товаров на рынке. Моделированию торговых сделок на бирже посвящена глава 20, в главе 24 приведен пример приложения системы массового обслуживания, а в главе 25 рас# сматривается обобщенная модель ценообразования акций в американских и евро# пейских опционах. Кроме того, в главе 27 вы ознакомитесь с универсальным прило# жением анализа биржевых данных. (Практически все программные модели, на которых основываются эти приложения, рассматриваются в книге PMS, хотя в на# стоящем издании была сделана попытка создания изолированных приложений.) В предложенном виде приложения могут использоваться для решения конечных задач или в обучающих целях #### для разработки на их основе собственных VBA#приложений. В этой книге рассматриваются все без исключения этапы раз# работки приложений и приводится их полный исходный VBA#код. Вы можете использовать представленные приложения для решения конкретных задач или просто детально изучить их, внимательно ознакомившись с кодом и реализован# ными методами программирования. Начиная с главы 14, способ изложения материала книги изменится. Вы ознакоми# тесь с общими сведениями о разработке приложений, а также некоторыми советами, затрагивающими проблемы написания эффективного VBA#кода. Представленные далее концепции иллюстрируются на примере приложения, которое рассчитывает выплаты, вносимые потребителем при покупке автомобиля в кредит. Такое прило# жение будет понятно большинству из вас, даже если вы не относите себя к профес# сиональным программистам. Рассматривая данное приложение, вы вначале разра# ботаете общую модель, диалоговые окна, отчеты и диаграммы, а затем научитесь связывать все воедино. Приложение расчета займа при покупке автомобиля иллюст# рирует важную концепцию, которая описывается на протяжении всей книги. При# ложения, которые выполняют сложные вычисления, обычно довольно длинные, они содержат много детальных сведений. Но это не значит, что сами приложения 1 Я бы рекомендовал начинающим программистам обратить свое внимание на книгу Про фессиональное программирование на VBA в Microsoft Excel 2003 Джона Уокенбаха (издательство ‘‘Диалектика’’, 2005). Введение 29 сложны для понимания или практического применения. При должном упорстве (я часто использую это понятие) вы сможете дополнять приложение новыми дан# ными #### только последовательное выполнение всех этапов разработки гарантирует получение эффективного и правильно работающего приложения. Практически все приложения научного управления требуют ввода данных. Особенно важным вопросом разработки приложений на языке VBA является внесе# ние исходных данных в модель электронной таблицы. Несколько различных спосо# бов ввода данных будет представлено во второй части этой книги. Если требуется обеспечить ввод небольшого объема данных, то воспользуйтесь диалоговыми окна# ми. Они применяются для запроса информации у пользователей в большинстве приложений. Существуют случаи, когда объем запрашиваемых данных превышает функциональные возможности, заложенные в диалоговые окна. В таких случаях данные обычно хранятся в базе данных определенного типа. В этой книге приведе# ны примеры такого способа хранения данных и методов их извлечения. В главе 16 входные данные приложения хранятся в отдельной электронной таблице. В главе 26 сведения о биржевых котировках сохранены в отдельной книге Excel. В главе 28 дан# ные модели представлены текстовым файлом (.txt). В главе 19 исходная информа# ция приложения расчета минимальных затрат при сетевом распространении товара на рынке хранится в файле базы данных Access (.mdb). Наконец, в главе 27 данные о биржевых ценах, используемые для оптимизации торговых операций, расположены на Web#узле и импортируются в Excel в процессе выполнения приложения! В каж# дом случае для импорта данных в приложение Excel я использую специальные опе# раторы VBA. Как пользоваться книгой Ранее уже отмечалось, что в этой книге реализовано несколько способов изуче# ния материала, который зависит от вашего опыта и желания изучить методы про# граммирования на VBA. Читателям, обладающим небольшим опытом программиро# вания или не имеющим его вообще, необходимо изучить основные концепции VBA #### они изложены в главах 1##13, предоставляющих всю необходимую информацию. (Следует заметить, что практически невозможно избежать использования сложных концепций программирования при описании простых операторов и методов языка.) Например, вы ознакомитесь с примерами применения конструкций IfThen и For еще до их формального описания в главе 7. Не думаю, что это вызовет серьезные проблемы с их пониманием. В листингах приведено достаточно много комментари# ев, кроме того, вы всегда можете заглянуть в следующие главы, поскольку в них поч# ти наверняка описываются все не рассмотренные ранее концепции. Описание базо# вых принципов программирования на VBA приведено в первых 13 главах, после этого вы должны перейти к изучению главы 14. Далее главы можно изучать в произ# вольном порядке, в зависимости от интересующих вас приложений. Обратите вни# мание, что отдельные части приложений могут показаться вам непонятными, если вы не будете знакомы с соответствующей моделью научного управления. Например, 30 Введение в главе 29 рассматривается универсальное приложение аналитического выбора про# фессии. Код VBA этого приложения относительно прост, но без знания алгорит# мов выполнения расчетов, используемых в модели, он совершенно непонятен. Предполагается, что с моделями вы уже знакомы из других источников, например книги PMS; здесь же модели описаны весьма кратко. С другой стороны, вы можете воспользоваться файлами приложений Excel для решения собственных проблем. Действительно, эти приложения специально соз# давались в расчете на конечных пользователей с нетехническим образованием, по# этому читатели любого уровня квалификации смогут открыть файл приложения и использовать его по прямому назначению. Другими словами, вам самим решать, на# сколько глубоко стоит изучать код приложения. Упражнения Для тех из вас, кто знаком с книгой PMS и привык к большому количеству упраж# нений в одной главе, настоящее издание покажется не очень сложным, поскольку в нем предложено не много заданий, которые необходимо решить самостоятельно. В конце каждой главы, начиная с пятой, приводится ряд упражнений по программи# рованию, которые призваны закрепить или расширить изученные в главе концепции программирования. Предложенные упражнения будут полезны и интересны многим читателям. Некоторые из них по очевидным причинам отмечены как ‘‘сложные’’. Раз# работанные мною дополнительные упражнения вы сможете найти и загрузить с Web# узла по адресу http://www.kelley.iu.edu/albrightbooks/VBA_Home.htm. Кроме того, в главах 6##13 отдельное упражнение приводится сразу после ввод# ного раздела. (Эта идея была предложена одним из рецензентов книги. По его сло# вам, подобного рода упражнения в самом начале главы ставят перед читателем кон# кретную задачу, которую он будет пытаться решить всеми возможными способами, а не просто читать книгу.) Материал в этих главах, полезный сам по себе, может ока# заться сложным для начинающих программистов, особенно не имеющих мотивации к созданию собственных приложений. Упражнения призваны в первую очередь обеспечить мотивацию к изучению следующего материала книги. Ожидается, что, увидев конкретную задачу, читатель сразу же попытается оценить ситуацию: ‘‘Смогу ли я ее выполнить?’’ Каждое упражнение имеет решение, что делает его наилучшим из возможных способов знакомства с новым материалом. Кстати, за время своей практики преподавания я выяснил, что все упражнения по программированию яв# ляются хорошими демонстрационными программами, пригодными для изучения в компьютерных классах. После краткого описания концепций вам предлагается от# крыть шаблон приложения, на примере которого и будет представлено завершенное решение. 31 Введение Компакт"диск Прилагаемый к книге компакт#диск содержит все рабочие книги Excel (.xls) и другие файлы, о которых речь идет в примерах (в том числе файлы, используемые в упражнениях). Все рабочие книги открываются в Excel 97 или более поздней версии программы; они не поддерживаются в Excel 95 или более ранних версиях. Кроме того, во многих файлах используются функциональные возможности надстройки Поиск решения. Эти файлы не будут корректно работать, если в вашей копии Excel данная надстройка не установлена. Наконец, приложение из главы 19 использует технологию ActiveX Data Object (ADO) для импорта данных из файлов Access. Ука# занная технология поддерживается только в Excel 2000 или более поздних версиях программы. Web"узел Да, вы правильно поняли! У этой книги есть собственный Web#узел, адрес которого упоминался ранее во введении. Web#узел содержит подробное описание и комментарии к программам, которые использовались во второй части книги. Такие комментарии разделяют код завершенных приложений на отдельные логические части. В книге ресурсы, расположенные на Web#узле, обозначаются пиктограммой, которую вы видите слева от абзаца. Кроме того, на Web#узле приведены дополнительные упражнения и обновленные материалы, которые были созданы уже после написания настоящей книги. Доступ к этому узлу можно получить по адресу www.duxbury.com (перейдите в раздел Online Book Companions) или непосредственно по адресу http://www.kelley.iu.edu/albrightbooks/VBA_Home.htm. Благодарности Я хотел бы поблагодарить очень многих людей. Я благодарю всех студентов, которые слушали мой курс научного управления после включения в него занятий по языку программирования VBA. Особенно хочу поблагодарить первую группу студен# тов, прослушавших этот курс в далеком 1996 году. В то время я не намного опережал студентов в изучении VBA и теперь осознаю, что использованные мною приложения были по меньшей мере неэффективными. Мои первые студенты оценили меня на# много лучше, чем я рассчитывал (возможно, потому, что я взялся учить их новому и полезному). Это и дало мне силы продолжить обучение. Во#вторых, я хотел бы поблагодарить всех коллег в издательстве Duxbury Thomson Learning. Особая благодарность #### редактору Курту Хинриксу (Curt Hinrichs). Когда он предложил мне написать книгу о VBA, моя первая реакция была такова: ‘‘Только не еще одну книгу #### этим летом я хочу пойти в отпуск!’’. Но я все же согласился на# писать небольшую книгу, дополняющую второе издание PMS. Как только проект начал ‘‘набирать обороты’’ и от рецензентов были получены первые положительные отзывы, Курт убедил меня увеличить объем книги и представить ее в виде отдельного 32 Введение издания, а не дополнения к уже опубликованным книгам. Как и раньше, я верю, что он принял правильное решение, и теперь, когда книга завершена, я ему неимоверно благодарен. Кроме того, большое спасибо профессионалам издательств Duxbury и Brooks/Cole: Сьюзен Рейланд (Susan Reiland), Джанет Хилл (Janet Hill), Саманте Кабалуна (Samantha Cabaluna), Тому Циолковски (Tom Ziolkowski), Натану Дею (Nathan Day) и Шиму Этвалу (Seema Atwal). В#третьих, я хотел бы поблагодарить рецензентов моей рукописи. Процесс ре# цензирования этой книги был не настолько сложен, как в случае других книг, но по# лученные рецензии были очень полезны, они побудили меня внести определенные изменения, которые сделали книгу несравнимо лучше. В итоге я хочу поблагодарить следующих людей: • Дональда Биркета (Donald Byrkett), университет Майами; • Костиса Христодулу (Kostis Christodoulou), Лондонская школа экономики; • Чарльза Франца (Charles Franz), университет Миссури; • Ларри ЛеБланка (Larry LeBlanc), университет Вандербилта; • Джерольда Мея (Jerrold May), университет Питтсбурга; • Джеймса Морриса (James Morris), университет Висконсина; • Тома Шрайбера (Tom Schriber), Мичиганский университет. Наконец, я хочу выразить благодарность своей жене Мэри. На протяжении всего лета она ни разу не пожаловалась, когда я убегал в ‘‘свою конуру’’ для написания очередных глав или программного VBA#кода. Она всегда готова была сделать кофе или бутерброд на завтрак, а когда мой мозг уже отказывался работать, на столе стоял отличный ужин. Свою награду она получит вместе с чеком на гонорар! С. Кристиан Олбрайт электронная почта: [email protected] Web#узел: http://www.kelley.iu.edu/albrightbooks/VBA_Home.htm. 33 Введение Ждем ваших отзывов! Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим ваше мнение и хотим знать, что было сделано нами правильно, что можно было сде# лать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно услы# шать и любые другие замечания, которые вам хотелось бы высказать в наш адрес. Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бу# мажное или электронное письмо либо просто посетить наш Web#сервер и оставить свои замечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится вам эта книга или нет, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас. Посылая письмо или сообщение, не забудьте указать название книги и ее авто# ров, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию последующих книг. Наши координаты: [email protected] E#mail: http://www.williamspublishing.com WWW: Адреса для писем: из России: из Украины: 115419, Москва, а/я 783 03150, Киев, а/я 152