Д.А.
Маевский, Е.Ю. Маевская,
А.Ф.
Винаков
Основы
программирования на VBA
для Microsoft
Excel
Учебное
пособие
Министерство образования и науки
Украины
ОДЕССКИЙ
НАЦИОНАЛЬНЫЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Основы
программирования на VBA
для Microsoft
Excel
Учебное
пособие
для студентов
электротехнических специальностей
Часть 1
Утверждено на
заседании кафедры
теоретических
основ и общей электротехники
Протокол № 4
от 12.12.2003
Одесса
ОНПУ
2011
Составители:
Д.А. Маевский, канд.техн. наук, доц.
Е.Ю. Маевская,
канд.техн. наук, асс.
А.Ф. Винаков,
канд. техн. наук, доц.
Оглавление
1. |
4 |
1.1. |
5 |
1.2. Основные |
8 |
1.2.1. Объект |
8 |
1.2.2. Объект |
9 |
1.2.3. Объект |
10 |
1.2.4. |
11 |
1.3. Краткие |
12 |
1.3.1. Встроенная |
12 |
1.3.2. Основные |
14 |
2. |
20 |
3. Задания для |
39 |
Литература |
46 |
Программа
Microsoft
Excel
в основном известна как электронная
таблица. Многие по достоинству оценили
простоту и удобство работы с электронными
таблицами, их мощь при проведении сложных
вычислений, построении графиков и
диаграмм. Однако сравнительно немногие
знают, что Excel
еще является и развитой средой
программирования, в которой можно
составлять, отлаживать и выполнять
самые разнообразные программы. И совсем
немногие умеют это делать.
Цель настоящего
учебного пособия – в кратком и доступном
виде изложить весьма сложные вопросы
программирования для Microsoft
Excel
и помочь начинающим в освоении
программирования вообще и программирования
в среде Excel
в частности.
1. Основы объектно – ориентированного программирования на vba в среде Microsoft Excel
Microsoft
Excel,
как и практически все сегодняшние
системы программирования является
объектно – ориентированной средой. Это
означает, что мы работаем с Excel
как с неким объектом, который существует
независимо от нас, который может выполнять
определенные функции и самое главное
– которым мы имеем возможность управлять.
К сожалению, нельзя дать однозначный и
исчерпывающий ответ на вопрос «А что
же такое объект?», как нельзя однозначно
определить такие категории, как «время»,
«пространство» в философии и «вероятность»
в математике. Выше мы попытались дать
ответ на этот вопрос, подменив, однако,
его ответом на вопрос «Для чего нужны
объекты и что они могут делать?».
Рассмотрим,
например, такой всем хорошо известный
объект, как телевизор. Телевизор – это
прямоугольный ящик со стеклянным
экраном, на котором может возникать
изображение. Это мы все хорошо знаем.
Как физический объект телевизор может
характеризоваться некоторыми свойствами,
например, такими как длина, высота,
ширина, вес, цвет, материал из которого
изготовлен корпус. С точки зрения
инженера – электронщика, телевизор
характеризуется составом элементной
базы, способом формирования изображения
на экране, специфическими особенностями
схемного решения. Таким образом, можно
сказать, что телевизор, как объект
характеризуется каким-то набором
свойств,
характеризующих этот объект.
Еще мы
знаем, что телевизором можно управлять.
Это означает, что в ответ на наши
воздействия телевизор в свою очередь
будет как-то себя вести – изменять
громкость звучания, переключать каналы,
изменять яркость изображения или вообще
выключаться. Действия, которые объект
выполняет в ответ на внешние воздействия
называются методами
объекта.
В свою
очередь, можно заметить, что сложный
объект „телевизор” в свою очередь
состоит из других, вложенных в него
объектов. Так, экран
(электронно – лучевая трубка) телевизора
также является самостоятельным объектом,
имеющим свои собственные свойства и
методы. Действительно, ведь в телевизоре
один объект типа „электронно – лучевая
трубка” может быть заменен другим
подобным объектом без ущерба для
работоспособности самого телевизора.
Можно сказать, что элементы, из которых
состоит телевизор – резисторы,
конденсаторы, микросхемы также являются
объектами. Таким образом, объекты могут
быть вложенными друг в друга, образуя
сложные иерархические системы.
Как уже
было сказано, Microsoft
Excel
является объектно – ориентированной
средой. Это значит, работая в Excel,
пользователь фактически управляет теми
объектами, которые Microsoft
Excel
ему предоставляет. Что это за объекты?
Прежде всего, это сам Microsoft
Excel,
который предстает перед нами в виде
своего главного окна. В главном окне
расположены или могут быть визуализированы
другие объекты – главное меню, панели
инструментов, кнопки, листы рабочей
книги, ячейки и так далее. Фактически,
пользователь может сказать, что он
научился работать с Excel,
если он научился работать с теми
объектами, которые Excel
ему предоставляет. Эти объекты созданы
и наделены разнообразными методами
поведения программистами фирмы Microsoft.
Сейчас нам необходимо научиться
самостоятельно создавать свои
нестандартные объекты, наделять их
свойствами и манерой поведения и
предоставлять для работы другим
пользователям. Таким образом, мы должны
попробовать себя в роли творца. И это
совсем не сложно. Приступим.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
10.02.20167.35 Mб14Методичка архитекторы_инженерка рус.docx
- #
- #
- #
- #
- #
- #
- #
- #
2.3. Объектно-ориентированное программирование
В последние годы огромную популярность приобрело так называемое объектно-ориентированное программирование ( ООП ). Для того, чтобы эффективно работать в VBA, нужно понимать основные положения ООП. В частности, вам нужно разобраться, что такое классы, объекты, что такое методы, свойства и события объектов.
Класс — это шаблон для создания объектов. Например, пусть у нас есть класс «автомобиль». Он создан по общему чертежу, по единой проектной документации. Но каждый отдельный объект — конкретный экземпляр автомобиля -индивидуален. Например, они различаются цветом, особенностями отделки салона и так далее. Точно также происходит и при работе с программными классами и объектами. Один класс может породить множество различных объектов.
На первых этапах VBA-программирования вам не придется самостоятельно создавать классы, но вы постоянно будете обращаться к объектам из своих процедур. Однако знайте, что VBA в MS Office 2007 поддерживает написание полностью объектно-ориентированных приложений классов и инструментария работы с ними.
Объект — это нечто целостное, неделимое, содержащее в себе данные и код. В объекте может храниться информация и программные инструкции для обработки этой информации.
У объектов есть свойства и методы. Объекты могут откликаться на события. Чтобы объяснить эти важнейшие понятия, разовьем уже использованный пример.
Напомним: наш объект — это автомобиль. Какие свойства есть у автомобиля? Цвет, тип двигателя, скорость движения и так далее. А какие методы? Что наш автомобиль умеет делать? Например, передвигаться, ехать. Получается, что у автомобиля есть как минимум два метода: «начать движение» и «остановиться». Точно так же, свойства и методы есть и у объектов, которыми мы будем пользоваться в VBA. А как насчет событий? Например, событием по отношению к автомобилю может быть нажатие педали газа, которое приводит к увеличению скорости.
Детали работы объекта скрыты от пользователя. Обычно пользователю доступны лишь те свойства и методы, которые специально для этого предназначены. Пользователь не может повлиять на внутренние механизмы объекта, работая лишь со специально выделенными для взаимодействия с внешним миром методами и свойствами.
Обращение к методам объектов в VBA ведется таким образом:
Возможны и другие варианты использования методов. Например, если в метод нужно передать какой-то параметр, его вызов будет выглядеть так:
Обратите внимание на то, что объект и метод отделены точкой. Если вы вводите в редакторе VBA имя объекта и ставите после него точку — редактор подскажет вам, какие методы и свойства есть у этого объекта.
С помощью методов объекта мы даем объекту команды. Например, такая команда: Application.Quit, приводит к закрытию приложения. Очевидно, что Application — это объект «Приложение«, а Quit — это метод «Выйти».
Со свойствами обычно работают так:
Такой командой мы присваиваем некое значение свойству объекта.
А так: Переменная=Объект.Свойство можно присвоить некой переменной свойство объекта. Подробнее с переменными мы познакомимся ниже. Пока можете считать переменные специальными «ящиками» в памяти компьютера, в которых можно хранить различные данные.
Свойства — это, как мы уже говорили, признаки объектов. Например, такая команда, txt_User_Name.Text=»Александр», выведет в текстовом поле ( объект txt_User_Name ) слово «Александр». Очевидно, что эта команда модифицирует свойство объекта Text, которое отвечает за выводимый на объекте текст.
Если вам пока непонятно, что это за текстовые поля и их свойства — просто читайте дальше. В следующей главе мы подробно все это обсудим — и вы сможете соединить теорию, которую вы уже знаете, с практикой.
Событие — это действие, которое объект распознает и на которое реагирует. Например, событием может быть щелчок мышью по кнопке, открытие нового документа и т.д.
Объекты могут объединяться в коллекции объектов. Фактически, коллекции — это объекты, которые содержат в себе другие объекты. Обычно в коллекцию входят объекты, имеющие один и тот же тип — то есть — одинаковые объекты.
В следующей главе мы вплотную займемся работой с объектами, а пока обсудим очень важную тему — объектные модели приложений Office.
2.4. Введение в объектные модели приложений Office
Объекты приложений Office объединены в иерархическую структуру, которую называют объектной моделью. У каждого приложения своя объектная модель, то есть свой набор объектов. Например, в Microsoft Word на верхнем уровне иерархии стоит библиотека классов Word. Она включает в себя множество классов, например — Application, который символизирует приложение Microsoft Word. Application, в свою очередь, включает в себя другие объекты, методы, свойства. Например, такая команда приводит к закрытию Microsoft Word:
Обычно при работе в MS Word опускают вызов объекта Word, то есть вышеприведенную команду вполне может заменить такая:
Вызов объекта Application тоже можно опускать, но делать это допустимо не всегда. Например, команду Application.Quit сократить уже не получится
Как мы уже говорили, в редакторе VBA есть средство для просмотра информации об объектах — Object Browser. Для его вызова служит одноименная кнопка на панели инструментов, или клавиша F2 (рис. 2.3.).
Рис.
2.3.
Окно Object Browser
В левой части окна (она называется Classes ) находится список классов и перечислений, входящих в библиотеку Word (или в ту библиотеку, которая выбрана в поле Object Browser ), в окне Members of можно просмотреть методы, свойства и события выбранного в предыдущем окне класса.
Значок с изображением руки в этом окне означает свойство, значок молнии — событие, значок с изображением маленького предмета с черточками — метод.
Здесь нет информации о том, что делает тот или иной метод, что означает то или иное свойство и т.д. Как же узнать подробности? Для начала — задуматься над именами классов, объектов, свойств, методов, событий. Правда, для их понимания нужно знать значения английских слов, которые использованы для их именования.
Далее, можно поискать информацию по интересующим вас объектам в справочной системе VBA, а так же — в базах данных Microsoft (www.microsoft.com).
Если вы не знаете, какой именно объект нужен для выполнения того или иного действия, но знаете как выполнить это действие с помощью визуальных средств приложения (например — с помощью кнопок на вкладках), вы можете исследовать объектные модели с помощью макрорекордера.
Объектные модели приложений огромны. С одной стороны, для эффективного использования всех объектов, нужно хорошо в них разбираться, с другой же — запомнить все это многообразие очень сложно. К счастью, для повседневной работы вам достаточно знать лишь основные классы и объекты объектных моделей, а если вам понадобится что-нибудь особенное — всегда можно воспользоваться справкой или использовать макрорекордер.
Помимо обычных объектных моделей приложений Office, вы можете использовать в своих программах другие объектные модели. Например, программируя для Word, можете воспользоваться объектной моделью Excel а так же — любыми другими моделями, установленными в системе. Для этого нужно подключить нужные модели из редактора VBA с помощью команды меню Tools -> References (Инструменты o Ссылки) (рис. 2.4.).
В данном случае мы подключаем библиотеку Microsoft Excel (она ценна встроенными функциями) к Microsoft Word, то есть сможем пользоваться некоторыми функциями Excel в Word. Подключенные модели можно просматривать в окне Project Explorer.
Рис.
2.4.
Подключение библиотеки объектов Microsoft Excel
Подключив объектную модель Microsoft Excel в Microsoft Word, вы сможете программно работать с документами MS Excel из программ, написанных в MS Word (и наоборот). Если вы собираетесь работать с базами данных — вам понадобится особая объектная модель ADO и т.д.
2.5. Старые и новые версии Office: совместная работа
Сегодня нередко встречается ситуация, когда пользователям приходится одновременно работать со старыми версиями MS Office (например, Office XP, 2003) и новыми (Office 2007). Как вы знаете, эти версии имеют различные форматы файлов. Например, в предыдущих версиях MS Word используется универсальный формат .doc для хранения файлов документов, .dot — для шаблонов, а в новой — .docx и .docm для документов (второй формат поддерживает макросы, а первый — нет), и . dotm — для шаблонов.
Новый Office нормально работает со старыми версиями файлов, в том числе и с файлами, содержащими макросы. Однако, если вы хотите, чтобы, скажем, ваши *.doc — файлы, содержащие макросы, гарантированно работали в Office 2007 — обязательно тестируйте их в среде Office 2007.
Старые версии в исходном виде не умеют работать с новыми файлами. Чтобы они смогли читать новые файлы, нужно установить специальный конвертер, который можно скачать с сайта Microsoft, однако это не гарантирует полную совместимость программного кода. Так, объектные модели приложений Office 2007 дополнены новыми объектами (например, OMath для работы с формулами в MS Word).
Если вам приходится работать в среде, которая предусматривает параллельное использование двух разных версий Office, лучше всего создавать и отлаживать программы именно в той версии, в которой вы планируете их использовать.
Большая часть материала данной книги справедлива для всех современных версий Office, однако, как уже было сказано, объектные модели приложений различаются, поэтому, используя тот или иной объект в устаревших версиях — обязательно сверяйтесь со справочной системой или исследуйте операции с помощью макрорекордера.
2.6. Выводы
В этой лекции вы узнали самое главное о программировании на VBA. Теперь вы знаете, как найти редактор Visual Basic и где хранится код макроса. Теперь вам нужно научиться пользоваться редактором, ориентироваться в его инструментах. Всему этому посвящена следующая лекция.
Уровень сложности
Простой
Время на прочтение
13 мин
Количество просмотров 5.4K
На собеседовании:
— Как у вас с Экселем?
— Я его ненавижу!
— О, да вы VBA-разработчик!
Я не могу открывать здесь Америк, ибо не технарь, но раз тут был чей-то текст, как написать «Hello world» в Word’e, и всем понравился, то думаю, что нелишним будет и мой небольшой опыт по теме, слабо раскрытой в целом в литературе, и в учебных курсах дающейся обычно факультативно.
п1. Как обычный пользователь пишет макросы в эксельке
Периодически и даже регулярно мне приходится читать чужой код на VBA. Как русскоязычных соотечественников, так и их зарубежных коллег. И создается впечатление, что макрописание, несмотря на большую распространенность, достаточно неплохо разработанный макрорекордер (по сравнению с импортозамещающими аналогами — так просто идеально разработанный), в русский народ не пошло, или почти не пошло. Подавляющее большинство кода для Экселя — это так или иначе связанные между собой и кое-как зацикленные куски, записанные макрорекордером и обработанные напильником.
Ну, например, очень редко для обращения к ячейке употребляется метод Cells с индексами номера строки и колонки, по большей части используют уродцев типа Cells(«A»&(i+1)) , а переход к следующей ячейке делают через Offset (и. что интересно, код работает — умудряются не запутываться в сдвиге А относительно Б, С относительно Б и так далее, могу только предположить, сколько такую связку из офсетов отлаживают). Массивов в их классическом виде средний российский макрописец не признает в принципе, и я догадываюсь, что он просто не знает, что есть такая сущность, и все переборы и вычисления проводит. обращаясь напрямую к ячейкам (хотя сансэй Уокенбах в каждой книжке повторяет, что массивы работают на порядок быстрей).
Даже на специализированных форумах типа «Планеты Эксель» взрослые дяди, написавшие не по одной тысяче строк кода, по старинке отвергают мертвую теорию и продолжают обрабатывать массивы данных через прямое обращения к ячейкам и диапазонам мимо массивов и коллекций объектов.
В зарубежье же немного, на мой взгляд по-другому, там очень резкое разделение на профи. заставших еще табличный редактор Cells и сами разрабатывавшие эти чертовы эксели (реально, как-то на замудреный вопрос по Outlook’у ответил русский чувак из Кремниевой долины, который этот же самый Namespace и разрабатывал в составе команды таких же гиков- вопрос его как-то профессионально задел) и ламеров, которые в основном тыкают в макрорекордер и теории не ведают, как Адам и Ева не ведали добра и зла до поедания злополучного яблочка. Но тут все понятно, а вот в случае наших родных макрописцев, то похоже. что все-таки русская привычка читать инструкцию в последнюю очередь стойко берет верх над здравым смыслом.
Но тем не менее — мне достаточно редко приходилось видеть массивы в чужом VBAшном коде, как правило, код при этом был не нашего происхождения, и ни разу не приходилось видеть на наших родных просторах классов и объектов пользовательского класса хотя бы для эксельки. Сразу оговорюсь — для Outlook’а и Powerpoint видел, но обычно такие вещи пишутся не «средним» пользователем — в эти макросы достаточно высокий порог входа.
п.2 Как я дошел до пользовательских объектов
Путь к пользовательским объектам и классам объектов был далеко не прямой. Дело в том, что макросы я писать начал где-то в году 2004-2005, и в памяти еще свежи (относительно) были школьные годы(самое начало 90-х), когда про ООП ни в доступной школьнику литературе, ни из преподавателей никто не заикался. И мое знакомство с VBA началось с того, что я сначала просто правил на работе глючные макросы, написанные кем-то до меня (благополучно ушедшим в закат) и адаптировал их к новым реалиям. Они написаны были приблизительно так, как описано было в п.1., и мне просто некогда было подвергать ревизии их общую концепцию, а надо было дописывать что-то или менять какие-то параметры, адреса ячеек, алгоритмы перебора и пр.
А потом был перерыв в работе с VBA (просто не было задач) ,прошло еще лет 10, и мне пришлось самостоятельно что-то делать. И делал это я сам так, как мне подсказывал собственный опыт, приобретенный в 90-х — то есть, через массивы. Например, алгоритм сортировки пузырьком для массива на бейсике мне в школе вдолбили чисто на уровне фотографической памяти в виде готового кода. А когда я попробовал сортирнуть это для одного мужика через обращение к ячейкам, то я поймал себя на том, что блин, задумался и засомневался в правильности своих знаний (!). Короче, как научился я когда-то давно, когда об экселе ведали только продавцы умных табличек и IBM286 ATXT, работать с массивами, так и продолжал — загонял диапазон в массив, работал с ним, и образно заполнял.
Получалось проще чем с ячейками, негромоздко, и, главное — массив в своей форме так или иначе отражал некоторое содержание данных — если я называл массив Result1, то я понимал, что я обрабатываю первичный результат, если обзывал Total — то значит, массив обрабатывает общие данные. Точно так же можно было наименовать диапазон, но первый же опыт показал, что в диапазоне контроль за типом данных эфемерен — стоит только одному дураку поменять тип ячейки, и все летит к черту.
Что же до коллекций объектов и классов, то сансэй (в смысле Уокенбах) в 2010 году очень бегло и кратко прошелся по этой теме, не создав впечатления. что эта вещь нужна, важна и удобна. А те русскоязычные пособия, которые писались для ВУЗов и где проблема была разложена глубже, писались на задачах чисто расчетных и технических, и для моих задач ни фига не подходили.
Первый случай, когда встала реальная необходимость написать класс и создать коллекцию объектов — это была классическая задача динамических контролов на юзерформе. И я ее написал по образцу, найденному в интернетах и снова надолго забыл об этом. Потому что обычно хватало массивов — двумерных, трехмерных, я тут не видел особых проблем.
Но потом оказалось, что оказывается, нужная эта штука — объекты пользовательских классов.
п.3 Объект реального мира и зачем он в эксельке
Как-то на Хабре вычитал, что объект-де в коде надо создавать просто так, потому что надо. Что объект в программировании не должен отражать объекты реального мира и каких-то отраженных в данных реальных свойств реальных объектов. Объект есть — а он ничего реального не отражает, просто набор данных.
И тут меня накрыло обломками старых‑престарых дискуссий махистов с марксистами. Потому что еще в 1911 году материалисты не сомневались, что в голове нет и не может быть ничего того. что не отражало бы объективной реальности, что не соответcвовало бы реальному миру. А больше всех не сомневался Ульянов‑Ленин с его работой «Материализм и эпириокритицизм», и правильно делал. Заодно вспомнилось, что как Винер, так и Витгенштейн считали информацию некоторым самосущным предметом, даже без носителя и связи с материальной объективной реальностью, за что кибернетику и окрестили буржуазной лженаукой. Но это не значит, что были прекращены работы по теории информации, ее организации и переработке — в то время, когда кибернетику в СССР громили, кибернетикой называлось только достаточно узкое теоретическое направление западной мысли, которое считало информацию существующей отдельно от материи с целым рядом вытекающих из этого выводов — как то о самостоятельном мышлении роботов. Расширенное понимание как общая теория информации термин «кибернетика» получил позже.
Мысль о самосущности информации бродит в кругах в основном технарей, проспавших ВУЗовскую философию где-то на задних партах как ненужный им гуманитарный предмет и создает невероятную путаницу, реально мешающую понять, что такое объект и зачем он нужен. Если мы берем информацию обязательно отражающей объекты реального мира — то тогда информационный объект лишь абстрагирует реальность, а соответственно, и ценность обработки ее реальна, а самосущность лишь плодит бесплодные объекты, из которых не следует ничего реального. Код, по сути, есть максимальная абстракция, и развитие ЯП постоянно идет на приближение его к естественному языку, к физическим понятиям.
Так вот, объект в ООП полезен именно тем, что снижает уровень абстрактности кода, приближает его к реальности, упрощает структурирование и обработку информации. Можно загнать информацию в трехмерный массив, где представить, что первая размерность отражает, например, конкретную машину, вторая — основные узлы, а третья — запчасти. Но в коде такой массив представится набором абстрактных символов, и трудности в его восприятии у кожаных мешков начинаются уже с третьего порядка. Человек, которому я подкинул такой массив в коде, чуть с ума не сошел, пытаясь понять, как и почему пересчитывается четвертая размерность массива. К чести его, я и сам не понял уже через месяц, что же такое я имел в виду, когда в массиве bTotal(x,y,z,5) поставил именно 5, а не 6 или 4, и под какие данные были зарезервированы пустые элементы, и должны ли они вообще использоваться.
У массива в VBA еще есть недостаток — я не могу сделать часть элементов одного типа, а часть другого. Я могу сделать его общего типа, когда умная машина сама определяет тип, и тем самым отдать на откуп дураку-пользователю, который поменяет тип ячейки и потом будет ныть, что у него ничего не работает.
И альтернативой является объект — этакий мини-массивчик с разным типом данных, где я могу неймингом привязать свойства и методы объекта к реальным объектам объективной реальности и снизить уровень абстрактности кода для восприятия.
Например, у меня есть накладные. Накладная — у нее есть некоторые свойства. Есть клиент, которому она идет, есть адрес, дата, перевозчик. На складе накладную комплектуют — в паллеты, у паллеты есть свойства — весогабариты, тип паллета, в паллетах лежат короба, у них тоже свойства — количество материалов, количество комплектов, габариты, в коробах‑ отдельные материалы со своими свойствами — номером, весом, габаритами, классом опасности и комплекты материалов с свойствами типа количества материалов, количество упаковки и пр.
Можно это все упаковать в массив, а можно на каждый реальный объект создать по объекту VBA пользовательского класса и связать их в коллекцию объектов с внутренней иерархией, вкладывая объекты и коллекции объектов внутрь объекта, в коде почти буквально повторяя физический процесс — берется накладная, материалы по накладной подбираются в комплекты, кладутся в короба, короба и отдельные материалы кладутся в паллеты. Если вдруг у какого-то материала появятся какие-то свойства, то они легко добавляются без пересчета индексов — просто дописывается свойство. То есть, мы приближаем код к естественному языку и к объективной реальности, выводя его на приемлемый для нас уровень абстракции. Заодно как бонус я получаю поиск по ключу, и не перебираю тысячи раз одни и те же массивы, чтобы найти нужный элемент (их тайно перебирает встроенная функция, от чего скорость не улучшается, но для табличек менее сотни тысяч строк это не очень принципиально).
Создаем класс для накладной Waybill, определяя следующие свойства
Public Address As String 'адрес
Public WGT As Double 'общий вес
Public pal As Long ' количество паллет
Public Whole As Integer 'количество целых
Public Part As Integer ' количество сборных
Public WblNbr As String ' номер накладной
Public StrQty As Long 'количество строк в накладной
Public IDHQty 'количество материалов в накладной
Public Company As String 'Наименование компании
Public Receiver As String 'Получатель
Public Order As String 'Заказ
Public Timeslot As String 'Время погрузки
Public Status As String 'статус
Public OutDate As String 'дата отгрузки
Public Client As String 'Клиент
Public PLTs As New Collection 'коллекция паллет
Выглядит не так коротко, чем просто определить Dim Waybill(17, count) и где-то запомнить или прокомментировать, что первый индекс 1 означает номер накладной, а 2 — получателя, например. Плюс мы имеем самые разные типы данных в одном месте, и эти типы никуда от нас не деваются — один элемент строчный, другой числовой, и все под контролем.
Создаем коллекцию
Set wbls= New Collection
заполняем ее элементами класса Waybill
For i=2 to count
wbls.Add Item:=New Waybill, Key: =CStr(Cells(i,1))
Next i
Внутри цикла заполняем элемент коллекции чем-то, например, присваиваем ему свойства какие-то, какие есть у нас в табличке. Например,
akey=CStr(Cells(i, WB))
wbls.Add Item:=New MWaybill, Key:=akey
wbls(akey).Receiver = Cells(i, rec)
wbls(akey).WblNbr = CStr(Cells(i, WB))
wbls(akey).Timeslot = CStr(Cells(i, ts))
wbls(akey).OutDate = CStr(Cells(i, dt))
Таким образом в коде мы видим, что безликие индексы превращаются во вполне понятные и кое-как человеческие образы, несущие информацию именно для человека — мне не надо сверяться, что у нас в первомвтором и так далее индексе массива нашифровано, заодно, чтобы достать получателя по номеру накладной из массива, не надо шуршать перебором или поиском. Каждой накладной у нас соответствует один объект класса со своими свойствами
Но у нас есть есть еще одна табличка — с описанием паллет, которая с первой табличкой соотнести можно только по номеру накладной. Так как в каждой накладной их там может быть много (десятки и даже сотни), мы создаем для каждого объекта вложенную коллекцию PLTs класса Pallets, в которую собираем информацию по паллетам:
Public WgtPal As Double'вес паллета
Public pType As String 'тип паллета
Public pColor As Integer 'цвет заливки
Public HUnbr As String 'Номер паллета
Public IDHInside As New Collection 'коллекция материалов внутри паллета
Public IDHCountinPal As Long 'количество материалов на паллете
аналогично создается коллекция материалов внутри паллета IDHInside.
На практике обращение к этой коллекции выглядит несколько громоздко:
wbls(key1).PLTs(key2).IDHInside(key3).QtyBox = Cells(i, 3)
wbls(key1).PLTs(key2).IDHInside(key3).QtyPcs= Cells(i, 4)
Но это с лихвой компенсируется структурированностью. Теперь в массиве (коллекции) можно по номеру накладной, номеру паллета и номеру материала сразу обратиться к количеству коробок с этим материалом на паллете и к количеству рассыпухи на том же паллете. То есть, в результате код нагляден, неплохо читается с нуля без особых замороченных описаний, в него легко добавлять элементы на любом уровне, мы получаем массив, определенным образом структурированный, в том числе и иерархически, и снабженный ключами.
И если нам надо сформировать и распечатать упаковочный лист на накладную, то мы находим накладную по ключу и переносим в нужную форму для печати каждый из паллет перебором коллекции паллет через
For Each y In wbls(key1).PLTs
For Each z In y.IDHInside
count = count + 1
Cells(count, 1) = wbls(key1).WblNbr'номер накладной
Cells(count, 2) = y.HUnbr'номер паллета
Cells(count, 3) = z.IDH0'материал
Cells(count, 4) = z.QtyPcs'количество расыпухи
Cells(count, 5) = z.QtyBox' количество целых упаковок
Cells(count, 6) = y.pType' тип паллета
Next y
Next z
И если вдруг изменится форма упаковочного, источник данных, добавится какое-то свойство накладной, которое надо выводить (например. реквизиты получателя или физические габариты, или тип транспорта для каждой паллеты), то достаточно легко добавить, не меняя алгоритм и структуру кода. Одним словом, моделирование физических объектов реального мира через пользовательские объекты VBA помогает упростить работу с кодом.
Есть. конечно, ограничения — например, я никогда не пробовал коллекции такого рода для диапазонов более 30 тысяч строк, а потому не знаю, как это будет вести себя на полумиллионной табличке, и не сложится ли весь офис, как турецкие хибары во время землетрясения, но подозреваю, что вопрос о ресурсах обязательно встанет. В некоторых случаях этот огород городить излишне — написать само заполнение коллекций займет больше времени. чем просто сделать проход нескольких циклов по массиву. Однако смысл есть в том, что такой код проще развивать, и к объекту можно цеплять в принципе любые типы данных, в том числе и очень экзотические объекты.
п.4. Актуально ли сие сейчас, когда мелкософты помахали нам ручкой, а VBA вроде как развивать никто не собирается?
Как ни странно, но СВО и уход многих зарубежных компаний спровоцировал временный бум на рынке приложений VBA. Многие компании начали заменять стандартный функционал нефункциональных более программ на костыли в пока еще работающем Экселе. Импортозаместили, разумеется далеко не все нужные и полезные функции систем ERP, например, и в силу того, что корпорации и без этого очень туго дорабатывают свои программные продукты, народ начал массово суетиться и искать разработчиков костылей, которыми можно было бы подпереть рассыпающиеся процессы. В принципе, и до СВО очень много примочек на VBA писалось благодаря негибкости 1Сной коробки, дороговизне и замороченности ее доработки напильником и различными самопальными мастерами. Я бы с уверенностью сказал, что не одно поколение VBA-разработчиков накормил продукт 1С. А после февраля 2022 ошарашенные новыми реалиями люди прямо таки рвались закрывать образовавшиеся дыры доступными им способами.
Многие годами налаженные процессы посыпались — например, у одной компании отвалилась лицензия на инструмент конвертации и передачи xml (там функций было больше, но почему-то конвертацию xml и добавление в него данных заместить не смогли) — закрыли примочкой на VBA. Решение планировалось как временное до конца года — но я в январе уже дописывал обновление по форме, видимо, неповоротливые корпоративные процессы его так и не решили, или примочка им просто дешевле обходится.
В последнее я неплохо верю — российские компании, которые кинулись «импортозамещать», выдают такие цены на разработку, что проще нанять человека, который будет нажимать кнопку макроса на ломаном офисе у себя дома, чем купить их продукт.
Еще один фактор, который хотел бы отметить — за последний год достаточно заметно повысилась и сложность задач для VBA. Если ранее основная масса задач составляла блок достаточно простых аналитических задач или формирования печатных форм, то в 2022 начали спрашивать такое, что тянет на очень полноценную разработку отдельных приложений с блэкджеком и шлюхами. Например, имитировать на VBA WMS. Или автоматически собирать информацию с сайтов, анализировать ее и закидывать обратно через форму, или нафигачить продукт сложной логики на границе с ИИ по формированию пакета каких-то регламентных документов. То есть, пошло то, с чем даже опытный человек справится с огромным трудом, не говоря уже об обычном пользователе.
Вторым моментом, который обильно накормил VBAшников в РФ за последний год стал высокий порог входа в языки макросов импортозамещающих MS Office пакетов. Хотя должно быть в принципе, наоборот — чем больше импортозамещают, тем меньше получают на VBA. Но тем не менее — обнаружив, что импортозамещающие пакеты используют плохо документированную объектную базу, с малоизвестными ЯП (классика — LUA в МойОфис), с убогим IDE и НИКАК не развитой средой (вплоть до того, что спрашивать, как обработать какую‑нибудь картинку на листе приходится спрашивать напрямую разработчиков пакета), многие компании выбирают ряд процессов вести именно на MS Office до тех пор, пока принудительно не отрубят. В таком случае разработка макроса на VBA на порядки дешевле, проще, чем на JS и дешевле, чем ручной обезьяний труд. Если для простейшего макроса на LUA надо еще найти какого‑то умельца, который еще и ценник выкатит, то на VBA умельцев уже достаточно много, и возможностей у них тоже побольше, чем на новых никому не известных продуктах. И поэтому пока мелкософты всем не отрубят руки возможность работать в своих продуктах, будут плакать, колоться, но жрать этот кактус. Потому что он гораздо съедобней того кирпича, который предлагают взамен.
Буквально на днях специалисты из импортозамещающей MS Office компании на вопрос — «раз ваш язык макросов дергает API, то где взять полное описание этого API и куда бежать, если что-то не сработает», промычав маловразумительно, скинули ссылку на сайт, где была статья рассказывающая, как программно расскрасить ячейку, а на вопрос о наличии макрорекордера бодро ответили «нет». Из этого можно вполне уверенно делать вид, что в тех случаях, в которых потребуются макрокостыли в офисных приложениях, цепляются, цеплялись и будут цепляться за майкрософт, потому что более цепляться не за что.
Одним словом, пока пациент скорее жив, чем мертв. Откачать, может, и не получится, но это произойдет не скоро, а потому даже после года «решительного отказа» уходящего и потом возвращающегося Майкрософта актуальность статья вряд ли потеряла.
Федеральное агентство по образованию
Московский Государственный Университет
Дизайна и Технологии
Курсовой проект по информатике
на тему:
«Объектно-ориентированное программирование
на VBA в среде Excel »
Вариант №3
Выполнила:
студентка группы ЭЭ-073
Воробьева А.А.
Проверила:
Мокринская Е.В.
Москва 2008
Содержание:
Теоретическая часть……………………………………………………………3
Введение………………………………………………………………………….3
1.Переменные и константы……………………………………………………..4
2.Структура проекта VBA и автоматизация программирования…………….4
3.Объект Range…………………………………………………………………..5
4.Свойство Cells………………………………………………………………….6
5.Операторы организации циклов…………………………………………..….6
6.Процедуры и встроенные функции организации диалога………………….7
7.Визуальные элементы управления. Экранная форма пользователя……….8
Практическая часть……………………………………………………………10
1. Задание………………………………………………………………………10
2. Вид формы UserForm1…………………………………………………………10
3. Вид формы UserForm2………………………………………………………11
4. «Макрос1»……………………………………………………………………11
5. Кнопка «Шапка таблицы»………………………………………………….15
6. Кнопка «Ввод исходных данных»…………………………………………16
7. Кнопка «Расчет»…………………………………………………………….16
8. Кнопка «Добавить» …………………………………………………………16
9. Кнопка «Очистить»…………………………………………………………17
10.Кнопка «Итого»…………………………………………………………….17
11.Кнопка «Выход»……………………………………………………………18
Список использованной литературы………………………………………..19
Теоретическая часть.
Введение
Программирование в Excel, в основном, сводится к управлению объектами. Эта задача выполняется с помощью инструкций, введённых на языке, понятном Excel. Язык программирования VBA(VisualBasicforApplication) является составной частью всех последних версий приложений MSOffice (Word, Excelи т.д.) и предназначен для создания дополнительных решений не выходя из среды этого приложения. Первая версия VBA появилась как упрощенное подмножество более раннего языка MicrosoftVisualBasic(VB). Однако по мере развития VBи VBAфирма – разработчик этих языков Microsoft практически их объединила.
Но многие опытные программисты не воспринимают идею программирования на Basic всерьёз. Само название (Beginner’sAll-purposeSymbolicInstructionCode– универсальный символический язык инструкций для начинающих) предполагает, что это не профессиональный язык. Действительно, Basic был разработан профессорами Дартмутского университета Дж. Кенеми и Т. Куртцом в 1963 году и задумывался как наглядное средство преподавания методов программирования студентам колледжей. Basic довольно быстро приобрёл большую популярность, и сейчас поддерживается во многих типах компьютеров. Basic первого поколения применялся в 70-е годы в основном на мини- и микро-ЭВМ. Так в 1975 году Билл Гейтс и Пол Аллен, основатели и в тот момент единственные сотрудники новой компании MicroSoft, разработали Basic-интерпретатор для микроЭВМ Altair8800.
Развитие систем программирования на основе Basic второго поколения началось с появлением в начале 80-х годов персональных компьютеров. В конце 80-х насчитывалось около десятка Basic-систем различных фирм-разработчиков. С 1989 года этим языком стала заниматься только компания MicroSoft. Basic стал намного популярнее в 1991 году, когда компания MicroSoft выпустила VisualBasic третьего поколения для Windows. Этот продукт облегчил массовую разработку самостоятельных приложений для Windows. В 1995 году компания MicroSoft значительно расширила возможности пакета Office за счёт доступа к объектным моделям приложений. С этих пор язык VBA, поддерживающий спецификацию COM(СomponentObjectModel), позволяет пользователю легко и понятно манипулировать объектами приложений. Применительно к среде Excel такими объектами являются рабочие листы, диапазоны, ячейки и т.д.
В настоящее время VB и VBA являются самыми популярными в мире инструментами разработки приложений, с которыми работают несколько десятков миллионов программистов.
1. Переменные и константы
Хороший стиль программирования предполагает объявление имён переменных и констант в самом начале текста программы. Переменная – именованная область оперативной памяти, отведённая для временного хранения данных, значение которых можно менять в процессе выполнения программы. Способ объявления переменной предполагает задания её имени и ключевого слова типа по схеме: Static/Public/Private/DimИмя Переменной1 (Имя Переменной2… ) AsТип. Dim или одно из других перечисленных – ключевое слово объявления переменной и выделения области оперативной памяти для хранения её значений. As — ключевое слово, предшествующее объявлению типа переменной. Другой способ объявления переменной имеет следующий синтаксис: Static/Public/Private/DimИмя Переменной1Суффикс (Имя Переменной2… ). В данном случае тип переменной определяется символом-суффиксом, который записывается в конце имени. Некоторые типы данных VBA:
Byte – короткое число, от 0 до 255;
Integer– целые числа, от -32768 до 32767;
Single – вещественные (дробные) числа обычной точности, от -3,402823Е38 до -1,401298Е-45 для отрицательных и от 1,401298Е-45 до 3,402823Е38 для положительных значений;
String – строка символов переменной длины, от 0 до приблизительно 2 млрд. символов.
При описании переменных из возможных ключевых слов Static/Public/Private или Dim применяется необходимое одно, которое определяет область определения и время жизни переменной. Область определения – устанавливает пространство программы, в котором переменная имеет значение и является доступной к использованию. Время жизни переменной – время, в течение которого переменная сохраняет присвоенное значение.
Константа — именованная область оперативной памяти, отведённая для хранения данных, сохраняющих постоянное значение в течение выполнения программ. Их значение нельзя изменять. Объявление константы производится по следующей схеме: (Public/Private) ConstИмя Константы AsТип = Значение.
2. Структура проекта VBA и автоматизация программирования
Отличительной особенностью VBA является то, что для разработки итогового документа он предоставляет возможность непосредственной работы с любыми объектами MSOffice. Программа в объектно-ориентированной среде представляет собой сложную иерархическую структуру, называемую проектом, который может включать в себя модули, формы и объекты приложения. Модуль – это именованная программная единица, состоящая из раздела объявлений модуля и процедур. В разделе описаний модуля объявляются переменные и константы. Различают 2 основных типа модулей – стандартные и модули объектов. Стандартные модули могут содержать программные коды доступных для всего проекта процедур и функций. В модулях класса содержится описание нового объекта. Новый объект создаётся при создании нового экземпляра класса. Модуль форм является модулем объекта и содержит процедуры обработки событий формы пользователя и размещённых на ней элементов управления. Листы рабочей книги Excel так же являются объектами, на которых могут размещаться визуальные элементы управления. Каждый рабочий лист связан с отдельным модулем рабочего листа, в которых записываются процедуры обработки событий листов и размещённых на них элементов управления. Для каждого рабочего листа автоматически создаётся свой модуль.
Приложение Excel предоставляет пользователю возможность автоматизировать программирование любой последовательности действий и при этом не требует от него знания программирования. Такая программа называется макрос . Макрос – процедура, записанная на языке VBA, в которой запрограммировано выполнение действий пользователя. Макрос создаётся с помощью предназначенной для этой цели специальной программы – «Макрорекодер» — средство автоматизации программирования действий пользователя. Макрос имеет структуру процедуры Sub…EndSub. Он записывается средствами приложения Excel и запускать его на выполнение лучше из Excel, не прибегая к помощи редактора VBE.
3.Объект Range
Объект Rangeиспользуется в программном коде VBA наиболее часто и он позволяет работать как с отдельными ячейками, так и диапазонами — строками, столбцами и двухмерными областями. Доступ и работу с ячейками объект осуществляет с помощью своих свойств и методов. Свойства этого объекта следующие: Name – возвращает имя диапазона; Value – возвращает значение ячейки или диапазона; RowHeight – возвращает высоту строки; ColumnWidth – возвращает ширину столбца; Font – возвращает объект Font (Шрифт); Formula– возвращает формулу в формате А1; FormulaR1C1 – возвращает формулу в формате R1C1. Методы можно разделить на 2 большие группы – методы, относящиеся к объекту, и методы, реализующие некоторые команды Excel. Упрощённый формат ссылки на ячейку имеет следующий синтаксис: Range(Cell), где Cell – адрес ячейки. В данном варианте используется стандартная адресация ячеек типа столбец-строка и адрес, который может представлять собой ячейку, строку, столбец или диапазон ячеек, записывается в кавычках в виде строки символов.
4. Свойство Cells
Свойство Cells, как правило, используется для доступа к отдельно взятой ячейке, однако позволяет задавать и диапазоны. Основная идея применения этого способа в том, что программным путём подготавливаются значения переменных, которые затем применяются в качестве координат ячеек. В свойстве Cells используется адресация ячеек типа строка-столбец, т.е. аналогично индексации элементов матрицы. В общем виде координаты ячейки в свойстве Cells можно записать так: Cells (i,j), где i – номер строки ячейки; j – номер столбца. Для формирования ссылки на диапазон ячеек возможно совместное использование свойств Cells и Range. Ссылки имеют следующий синтаксис: Range(Cells1, Cells2), где Cells1 – адрес левой верхней ячейки диапазона; Cells2 — адрес правой нижней ячейки диапазона. В данном варианте используется адресация ячеек типа строка-столбец, и адреса формируются с помощью свойства Cells. Такая ссылка позволяет программное формирование адресов ячеек.
5. Операторы организации циклов
В каждом языке для программирования алгоритмов циклической структуры существует некоторый набор операторов организации циклов. Цикл – это последовательность инструкций (операторов), которые программа выполняет многократно. Последовательность многократно выполняемых инструкций образуют область цикла. Для управления количеством повторений цикла анализируется некоторое условие и принимается решение о продолжении выполнения цикла или его завершения.
Различают 2 типа циклов:
— циклы со счётчиком – заданным числом повторений;
— циклы с условием – неопределённым числом повторений.
Выбор определённого вида цикла зависит от алгоритма решения задачи и реализуется в VBA с помощью соответствующих управляющих инструкций (операторов).
Наиболее простой и понятной является задача, в которой количество повторений группы инструкций известно заранее до момента начала выполнения циклов. В таких случаях целесообразно использовать инструкцию организации цикла со счётчиком For … Next , который имеет следующее правило записи:
ForСчётчик = Начальное значение ToКонечное значение [StepШаг ]
[инструкции ]
[ExitFor]
[инструкции ]
Next[Счётчик ]
Инструкция For…Next содержит следующие элементы:
For – ключевое слово начала цикла; Счётчик – числовая переменная, используемая в качестве счётчика; Начальное значение – начальное значение переменной Счётчик циклов, которое может быть задано числовым значением, переменной или выражением; Конечное значение – конечное значение переменной Счётчик циклов; StepШаг – необязательная фраза, используемая для задания числового значения шага, на которое изменяется счётчик при каждом выполнении тела цикла; инструкции – составляющие область цикла инструкции, которые выполняются заданное число раз; ExitFor – инструкция досрочного выхода из цикла; Next – ключевое слово, завершающее оператор организации цикла.
Во многих алгоритмах нельзя заранее определить количество повторений цикла и условие окончания выхода формируется и проверяется в ходе вычислений. В этих случаях организуются циклы второго типа – циклы с условием, которые подразделяются на 2 типа:
-циклы с предусловием
-циклы с постусловием.
Организовать выполнение циклов неопределённое число раз возможно с помощью нескольких операторов. Один из них – Do … Loop , который имеет 4 модификации и организуется с помощью следующих конструкций: 1.Цикл с предусловием –
Do [While/Untilусловие ]
[инструкции ]
[ExitDo]
[инструкции ]
Loop
2.Цикл с постусловием –
Do
[инструкции ]
[ExitDo]
[инструкции ]
Loop[While/Untilусловие ].
Оператор Do…Loop содержит следующие элементы: Do – ключевое слово начала цикла; While/Until – ключевое слово, определяющее условие повторения цикла; условие – выражение, формирующее условие выполнения цикла и возвращающее значение логического типа(Trueили False); инструкции — составляющие область цикла инструкции; ExitDo – инструкция альтернативного выхода из цикла; Loop – ключевое слово завершения оператора цикла.
6. Процедуры и встроенные функции организации диалога
Решение практически любой задачи, а также составления программы, целесообразно разбивать на отдельные логически завершённые фрагменты. Все языки программирования содержат в себе 2 инструмента структурирования программы – подпрограммы-процедуры и подпрограммы-функции. В данной работе используются процедуры. Процедура – последовательность совместно выполняемых инструкций, имеющая имя. Процедуры занимают центральное место в VBA программировании и подразделяются на несколько типов. Один из них – процедура пользователя, которая имеет следующую конструкцию:
[Static,Public,Private] SubИмя Процедуры [(Список_Аргументов )]
[инструкции ]
[ExitSub]
[инструкции ]
EndSub
Процедура пользователя содержит элементы: Sub – ключевое слово, соответствующее началу конструкции определения процедуры; Имя Процедуры – обязательный элемент, удовлетворяющий принятым в языке правилам формирования имён переменных; Список_Аргументов – список разделённых запятыми данных, передаваемых в процедуру или возвращаемых ею при вызове подпрограммы Sub; ExitSub – инструкция немедленного выхода из процедуры Sub; инструкции – необязательный элемент, любая группа инструкций, выполняемых в процедуре Sub.
Для организации ввода и вывода информации в процедурах VBA применяются 2 стандартные диалоговые функции. Одна из них – InputBox создаёт окно ввода данных, вторая – MsgBox формирует достаточно мощное окно сообщений. В данной работе использовалась функция InputBox, которая выводит на экран диалоговое окно, содержащее сообщение, текстовое поле ввода информации пользователя и 2 управляющие кнопки. При этом прерывается выполнение работающей процедуры и устанавливается режим ожидания ввода текста пользователем или нажатия одной из кнопок. Синтаксис этой функции: InputBox(сообщение[, заголовок] [, текст_по_умолчанию]), где сообщение – текст в диалоговом окне; заголовок – строковое выражение, отображаемое в строке заголовка диалогового окна; текст_по_умолчанию — строковое выражение, отображаемое в поле ввода в момент вывода окна на экран.
7. Визуальные элементы управления. Экранная форма пользователя
Визуальные элементы управления впервые были применены в первой версии VisualBasic, созданной фирмой Microsoft в 1991 году. Они значительно упростили программирование интерфейса прикладной программы, работающей в новой для того времени операционной среде Windows. Элемент управления – объект, помещаемый пользователем в форму или на рабочий лист и имеющий собственный набор распознаваемых свойств, методов и событий. Размещение элементов управления в форме пользователя осуществляется при помощи панели инструментов VBA “Toolbox”, которая появляется на экране при вставке формы. Среди множества элементов управления наиболее часто используются три – «Командная кнопка» (CommandButton), «Текстовое поле» (TextBox) и «Надпись» (Label). Элемент «Командная кнопка» (CommandButton) всегда связан с процедурой обработки событий. Элемент «Текстовое поле» (TextBox) используется для ввода информации в программу или вывода сообщений. Элемент «Надпись» (Label) применяется только для вывода различных текстов в форме, а также рисунков. Элементы управления начинают работать и реагировать на действия пользователя только после того, как они помещены на рабочий лист или форму пользователя.
Для разработки более удобных и разнообразных окон пользователя применяется объект «Форма» (UserForm). Форма – это окно, конструируемое пользователем. Объект UserForm представляет собой диалоговое окно, являющееся составной частью интерфейса пользователя в приложении. Для того чтобы вставить форму в проект нужно использовать вставку «UserForm» из меню «Вставка». Формам пользователя присущи также и методы, которые позволяют воздействовать на неё. Например, Load – загружает форму пользователя в оперативную память, но не отображает её на экране; Unload– удаляет форму из памяти; Show– отображает на экране форму пользователя. Программирование работы с формами пользователя заключается в написании процедур реакции на различные события, которые могут произойти при работе пользователя с формой. При создании объекта UserFormVBA система автоматически создаёт связанный с ним модуль. В этом модуле размещаются процедуры обработки событий Формы и размещённых в ней элементов управления. В общем случае заготовка процедуры обработки события имеет синтаксис:
PrivateSubОбъект управления _Событие ()
EndSub
В последующем пользователь в текст заготовки добавляет необходимые для решения поставленной задачи инструкции и получает завершённую процедуру обработки конкретного события конкретным объектом (элементом управления).
Практическая часть:
1. Задание:
Для размещения на рабочем листе Excel табличного документа и визуальных элементов управления в среде VBA разработать проект, включающий в себя следующие основные компоненты:
1. Процедуру макроса формирования заголовка таблицы и названия столбцов.
2. Форму пользователя ввода данных строк таблицы.
3. Процедуру построчной записи считанной информации в таблицу.
4. Процедуру расчёта незаполненных столбцов таблицы на основе известных данных строк.
5. Вспомогательную процедуру очистки таблицы.
Исходная таблица:
«Список товаров, подготовленных к продаже. Ожидаемая выручка»
Номенк. Номер | Наименов. Товара | Еден. Изм. | Цена за ед., руб. | Кол-во | Сумма, руб. | Налог (20%) | Всего, руб. |
13675 | Шапки | шт. | 788,00 | 64 | 60518,40 | ||
3816 | Пальто | шт. | 1435,80 | 42 | 72364,32 | ||
13855 | Платки | шт. | 194,35 | 86 | 20056,92 | ||
3843 | Рубашки | шт. | 220,75 | 110 | 29139,00 | ||
3811 | Куртки | шт. | 984,40 | 38 | 44888,64 | ||
13868 | Костюмы | шт. | 1495,00 | 40 | 71760,00 | ||
Итого | 298727,3 |
2. Вид формы UserForm 1:
3. Вид формы UserForm2:
4. «Макрос1»
Sub Макрос1()
‘ Макрос1 Макрос
‘ Макросзаписан 25.11.2008 (User)
Range(«A1:H1»).Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Selection.Font.Bold = True
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Range(«A1:H1»).Select
ActiveCell.FormulaR1C1 = _
«Список товаров, подготовленных к продаже. Охидаемаявыручка»
Range(«A3:H3»).Select
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Range(«A3»).Select
ActiveCell.FormulaR1C1 = «Номенк. Номер»
With ActiveCell.Characters(Start:=1, Length:=13).Font
.Name = «Arial Cyr»
.FontStyle = «обычный»
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(«B3»).Select
ActiveCell.FormulaR1C1 = «Наименов. Товара»
With ActiveCell.Characters(Start:=1, Length:=16).Font
.Name = «Arial Cyr»
.FontStyle = «обычный»
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(«C3»).Select
ActiveCell.FormulaR1C1 = «Еден. Изм.»
With ActiveCell.Characters(Start:=1, Length:=10).Font
.Name = «Arial Cyr»
.FontStyle = «обычный»
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(«D3»).Select
ActiveCell.FormulaR1C1 = «Ценазаед., руб.»
With ActiveCell.Characters(Start:=1, Length:=16).Font
.Name = «Arial Cyr»
.FontStyle = «обычный»
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(«E3»).Select
ActiveCell.FormulaR1C1 = «Кол-во»
With ActiveCell.Characters(Start:=1, Length:=6).Font
.Name = «Arial Cyr»
.FontStyle = «обычный»
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(«F3»).Select
ActiveCell.FormulaR1C1 = «Сумма, руб.»
With ActiveCell.Characters(Start:=1, Length:=11).Font
.Name = «Arial Cyr»
.FontStyle = «обычный»
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(«G3»).Select
ActiveCell.FormulaR1C1 = «Налог (20%)»
With ActiveCell.Characters(Start:=1, Length:=10).Font
.Name = «Arial Cyr»
.FontStyle = «обычный»
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(«H3»).Select
ActiveCell.FormulaR1C1 = «Всего, руб.»
With ActiveCell.Characters(Start:=1, Length:=11).Font
.Name = «Arial Cyr»
.FontStyle = «обычный»
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range(«A3:H3»).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Selection.Font.Bold = True
Columns(«B:B»).ColumnWidth = 10.43
End Sub
Sub Кнопка1_Щелкнуть()
Load UserForm1
UserForm1.Show
End Sub
5. Кнопка « Шапка таблицы »
Private Sub CommandButton1_Click()
Call Макрос1
End Sub
6. Кнопка « Ввод исходных данных »
Private Sub CommandButton2_Click()
Load UserForm2
UserForm2.Show
End Sub
7. Кнопка « Расчет »
Private Sub CommandButton3_Click()
Dim N, I As Integer
N = 0
Do While Cells(4 + N, 1) <> «»
N = N + 1
A = Cells(3 + N, 4)
B = Cells(3 + N, 5)
C = A * B
Cells(N + 3, 6) = Str(C)
D = C * 0.2
Cells(N + 3, 7) = Str(D)
F = C + D
Cells(N + 3, = Str(F)
Loop
End Sub
8. Кнопка «Добавить»
Private Sub CommandButton4_Click()
Dim I, N, J As Integer
Dim A, B, C As String
Dim F As Single
Dim D As Single
I = 0
Do While Cells(I + 3, 1) <> «»
I = I + 1
Loop
Range(Cells(I + 3, 1), Cells(I + 3, 8)).Clear
J = InputBox(«Введите номер строки добавляемой записи»)
N = J + 1
Do While I < N
A = InputBox(«Номенклатурный номер»)
B = InputBox(«Наименование товара»)
C = InputBox(«Еденица измерения»)
D = Val(InputBox(«Цена за еденицу»))
F = Val(InputBox(«Количество»))
Cells(3 + I, 1).Value = A
Cells(3 + I, 2).Value = B
Cells(3 + I, 3).Value = C
Cells(3 + I, 4).Value = D
Cells(3 + I, 5).Value = F
I = I + 1
Loop
End Sub
9. Кнопка « Очистить »
Private Sub CommandButton5_Click()
Dim I, N As Integer
N = 0
Do While Cells(3 + N, 7) <> «»
N = N + 1
Loop
For I = 1 To N
Cells(I + 3, 1).Clear
Cells(I + 3, 2).Clear
Cells(I + 3, 3).Clear
Cells(I + 3, 4).Clear
Cells(I + 3, 5).Clear
Cells(I + 3, 6).Clear
Cells(I + 3, 7).Clear
Cells(I + 3, 8).Clear
Next I
End Sub
10. Кнопка «Итого»
Private Sub CommandButton6_Click()
Dim N%
Dim I%
Dim SG!
Dim G!(20)
N = 0
Do While Cells(N + 4, 7) <> «»
N = N + 1
Loop
For I = 1 To N
G(I) = Cells(I + 3, 8).Value
Next I
SG = 0
For I = 1 To N
SG = SG + G(I)
Next I
Cells(N + 4, 7).Value = «Итого»
Cells(N + 4, 8).Value = SG
11. Кнопка « Выход »
Private Sub CommandButton7_Click()
End
End Sub
Итоговая таблица:
Номенк. Номер | Наименов. Товара | Еден. Изм. | Цена за ед., руб. | Кол-во | Сумма, руб. | Налог (20%) | Всего, руб. |
13675 | Шапки | шт. | 788,00 | 64 | 50432,00 | 10086,40 | 60518,40 |
3816 | Пальто | шт. | 1435,80 | 42 | 60303,60 | 12060,72 | 72364,32 |
13855 | Платки | шт. | 194,35 | 86 | 16714,10 | 3342,82 | 20056,92 |
3843 | Рубашки | шт. | 220,75 | 110 | 24282,50 | 4856,50 | 29139,00 |
3811 | Куртки | шт. | 984,40 | 38 | 37407,20 | 7481,44 | 44888,64 |
13868 | Костюмы | шт. | 1495,00 | 40 | 59800,00 | 11960,00 | 71760,00 |
Итого | 298727,28 |
Список использованной литературы:
1. Джон Уокенбах. Профессиональное программирование на VBA в Excel. Диалектика. М., С-Пб., Киев, 2003.
2. Г.В.Росляков. Программирование на VBA для Excel: Учеб. пособие. МГУДТ, 2006.
3. П.П. Мельников, И. В. Миронова, И. Ю. Шполянская. Практикум по экономической информатике. Часть III. Изд. «Перспектива», Москва 2002.