ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ДАЛЬНЕВОСТОЧНЫЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
(ДВПИ им.В.В.Куйбышева)
М...
21 downloads
604 Views
544KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ДАЛЬНЕВОСТОЧНЫЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
(ДВПИ им.В.В.Куйбышева)
Методы автоматизации при работе в MS Excel Методические указания
Владивосток 2005
1
Одобрено научно-методическим советом университета УДК 681.3.06 М54 Методы автоматизации при работе в MS Excel: метод. указания / сост. Г.А.Синявская. – Владивосток: Изд-во ДВГТУ, 2005. – 73 с. Методические указания разработаны в помощь студентам гуманитарных специальностей при изучении дисциплины «Информатика». В этой работе приводятся основные конструкции языка VBA, обсуждаются некоторые элементы управления. Рассматривается практическая задача с применением элементов управления «Поле со списком» и «Список» в приложении MS Excel. В процессе решения практической задачи используются встроенные функции MS Excel, даны рекомендации по построению вложенных функций. Эффективное применение встроенных функций показано в задаче по преобразованию «Суммы цифрами» в «Сумму прописью».
Составитель Синявская Г.А. Отпечатано с оригинал-макета, подготовленного автором
© Синявская Г.А., 2005 © Издательство ДВГТУ, 2005
2
Содержание
СОДЕРЖАНИЕ ВВЕДЕНИЕ...........................................................................................................................................4
Глава I. Visual Basic for Applications (VBA).......................................................................5 1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.8.
Понятие об объектно-ориентированном программировании ......................................................5 Visual Basic for Applications (VBA)...............................................................................................6 Объекты, свойства и методы VBA................................................................................................7 Алфавит и лексика языка VBA.....................................................................................................8 Переменные и типы данных..........................................................................................................9 Константы.....................................................................................................................................11 Массивы........................................................................................................................................12 Операции с данными, приведение типов.....................................................................................13
1.8.1. 1.8.2. 1.8.3. 1.8.4. 1.8.5.
Приведение и преобразование типов ....................................................................................................13 Операции над числами ..........................................................................................................................14 Операции со строками...........................................................................................................................15 Операции с датами ................................................................................................................................16 Операции с логическими значениями...................................................................................................19
1.9. Операторы присваивания .............................................................................................................19 1.10. Управляющие конструкции ..................................................................................................20 1.10.1. Ветвления ..............................................................................................................................................20 1.10.2. Циклы ....................................................................................................................................................23
1.11.
Процедуры VBA....................................................................................................................26
1.11.1. Вызов подпрограмм и функций ............................................................................................................29 1.11.2. Область видимости переменных и процедур........................................................................................29
1.12.
Использование элементов управления .................................................................................31
1.12.1. Использование элемента Label для вывода текста ...............................................................................34 1.12.2. Ввод текста при помощи элемента TextBox .........................................................................................35 1.12.3. Выбор альтернативных вариантов ........................................................................................................35 1.12.4. Работа со Cписками ..............................................................................................................................37
Глава II. Практическое использование приложения MS Excel......................................38 2.1. Одна задача и три варианта решения...........................................................................................38 2.1.1. Постановка задачи и подготовка информации .....................................................................................38 2.1.2. Используемые термины.........................................................................................................................40 2.1.3. Автоматизация с помощью формул ......................................................................................................40 2.1.3.1. Ввод формул с помощью Мастера функций .................................................................................41 2.1.3.2. Использование вложенных функций...............................................................................................44 2.1.4. Применение элемента управления Поле со списком ..........................................................................46 •
Подготовка документа к печати.............................................................................................................................48
•
Получение значений при множественном выборе.................................................................................................50
2.1.5. Использование элемента управления Список для выбора группы товаров ........................................48
2.2. Преобразование суммы цифрами в сумму прописью .................................................................57 2.2.1. Анализ проблемы и построение алгоритма ..........................................................................................57 2.2.2. Разбиение числа на отдельные составляющие.....................................................................................59 2.2.3. Словесное описание каждой цифры числа ...........................................................................................62
ЗАКЛЮЧЕНИЕ....................................................................................................................................71 Библиографический список.................................................................................................................72
3
ВВЕДЕНИЕ Данные методические указания разработаны для самостоятельной работы студентов гуманитарных специальностей при изучении дисциплины « Информатика» и рассчитаны на студентов, имеющих некоторые навыки работы в MS Excel. В первой главе вводятся основные понятия объектно-ориентированного программирования и приводятся основные конструкции языка Visual Basic for Applications. С помощью этого языка во второй главе будут реализованы простейшие процедуры, освобождающие пользователя от рутинной работы. Применение готовых « кирпичиков» – элементов управления – при создании программного продукта упрощает этот процесс и делает его привлекательным. Во второй главе приводятся три варианта решения практической задачи с разной степенью автоматизации, а также ставится, казалось бы, противоположная задача: как, не прибегая к алгоритмическим языкам, а используя лишь встроенные функции MS Excel, преобразовать «сумму цифрами» в «сумму прописью». Этот вариант решения поставленной задачи лишь подчеркивает богатые возможности MS Excel. Реализация задач производится в приложении Microsoft Excel 2000.
4
Глава I. Visual Basic for Applications (VBA) 1.1. Понятие об объектно-ориентированном программировании Программы, рассчитанные на работу в операционной системе Windows, предоставляют пользователю большие возможности и имеют развитый пользовательский интерфейс. Эти приложения могут реагировать на движения и щелчки мыши, а также на ее местоположение. В таких программах, отвечающих на различные действия человека, каждая манипуляция пользователя – будь то щелчок мыши или нажатие клавиши – называется событием . Поэтому разработка программ, реагирующих на эти события, называется програм мированием , управляемым событиями . Ключевая технология, которая позволила упростить создание приложений для Windows, называется объектно - ориентированным про граммированием ( ООП ) . ООП поддерживает три основных принципа: инкапсуляцию , на следование и полиморфизм . Под инкапсуляцией понимают то, что и информация об объекте (его свойства ), и функции объекта ( методы ) содержатся в описании этого объекта. Наследование означает то, что один объект может быть построен на базе описания другого объекта. Полиморфизмом называют способность многих объектов использовать один и тот же метод, при этом выполняемые действия зависят от объекта, который его вызвал. Объектно-ориентированный подход использует следующие базовые понятия: . Базовый элемент программы, содержащий свойства для описания Объект характеристик объекта и методы для определения выполняемых функций и распознавания событий, на которые этот объект может реагировать. Элементы управления и формы – примеры объектов, применяемых в Visual Basic. Свойства . Характеристики объекта, например, размер, местоположение, цвет и текстовый шрифт. Свойства определяют отображение и, иногда, поведение объекта. Они также используются для хранения данных в объекте и для получения информации от объекта. . Программный код, включенный в описание объекта и определяющий то, как этот объект работает с информацией и реагирует на заданные события.
Метод
5
Событие
. Действие, инициированное пользователем или операционной сис-
темой. . Совокупность объектов, характеризующихся общностью применяемых методов обработки или свойств.
Класс
Схематично связь основных понятий объектно-ориентированного программирования можно представить так: Классы Объекты
— свойства объектов
— методы обработки
Рис. 1. Соотношение основных понятий объектно-ориентированного подхода
. Фрагмент кода, служащий для выполнения некоторой задачи. Обычно процедуры пишутся для обработки определенного события.
Процедура
1.2. Visual Basic for Applications (VBA) Многие пользователи с успехом работают в приложениях Microsoft Office, не погружаясь в изучение языка Visual Basic для создания собственных программ. Но, совершая одни и те же действия при обработке документов, пользователь задумывается: « А нельзя ли как-то все эти повторные операции переложить на компьютер, а самому в это время попить кофе?» И такое решение есть – использование макросов. Их действительно применяют широко, но и они не всегда могут выручить. Например, в зависимости от номера месяца, за который формируется отчет, добавляются или игнорируются итоги за квартал или полугодие. Для решения такой задачи, возможно, придется в созданный макрос вставить программный код на VBA. Основа языка VBA – Visual Basic, но для каждого приложения существуют свои особенности применения языка. Нашей целью будет объединение вы-
6
числительных возможностей электронных таблиц MS Excel с Visual Basic for Applications. Visual Basic – язык, основанный на применении технологии ООП. С помощью этого языка можно создать программу, работающую в системе Windows и решающую какие-либо конкретные задачи. В данной работе будут применены лишь некоторые возможности языка VBA. Что касается приложения MS Excel, речь будет также идти только о тех его возможностях, которые будут использоваться при решении конкретных задач.
1.3. Объекты, свойства и методы VBA Одним из основных понятий VBA является объект. Объект – это то, чем вы управляете с помощью программы на языке VBA, например, рабочий лист, диапазон ячеек, элемент управления. Каждый объект обладает некоторыми характеристиками или свойствами. Примером свойства объекта может быть шрифт, используемый для отображения информации в ячейке (объекте) рабочего листа. Изменяя свойства, можно менять характеристики объекта. Объект содержит также список методов, которые к нему применимы. Методы – это то, что вы можете делать с объектом. Например, можно с помощью метода Clear очистить содержимое и форматирование диапазона ячеек, а с помощью метода ClearContents очищается только содержимое ячеек, не изменяя форматирования. Примеры: Worksheets("Лист1").Range("A1:A2").Clear Worksheets("Лист1").Range("A1:A2").ClearContents
В общем случае это можно записать так: Объект.Метод
Таким образом, объект – это программный элемент, который имеет свое отображение на экране, содержит некоторые переменные, определяющие его свойства, и некоторые методы для управления объектом. Объект является «кирпичиком» построения программ VBA. В VBA имеется много встроенных объектов, например: Range
Диапазон ячеек (может включать только одну ячейку)
Cells
Ячейка
WorkSheet
Рабочий лист
WorkBook
Рабочая книга
7
Большинство объектов принадлежит к группе подобных объектов или к классу. Например, все рабочие листы рабочей книги образуют класс, называемый WorkSheets. Установка значений свойств – это один из способов управления объектами. Синтаксис установки значения свойства объекта выглядит следующим образом: Объект.Свойство = Выражение
Пример: Диапазону ячеек b1:b5 присваивается значение 10: Range("b1:b5").Value = 10
Некоторые свойства являются неизменными, т.е. допустимыми только для чтения ( значение свойства можно узнать, но нельзя изменить). Например, для диапазона, состоящего из одной ячейки, свойства Row ( строка) и Column (столбец) являются неизменными. Другими словами, можно узнать, в какой строке и в каком столбце находится ячейка, но изменить ее положение путем изменения этих свойств нельзя. Синтаксис чтения свойств объекта выглядит следующим образом: Переменная = Объект.Свойство
Пример: Чтобы узнать, сколько всего элементов в Элементе управления Список, надо воспользоваться свойством ListCount и присвоить значение этого свойства переменной. numidx = Spisok.ListCount Здесь numidx – переменная, Spisok – имя элемента управления Список (ListBox).
1.4. Алфавит и лексика языка VBA Описание любого языка, в том числе и языка программирования, обычно начинается с алфавита , то есть определения набора допустимых символов. Алфавит языка VBA включает следующие группы символов: • цифры (0-9); • латинские строчные и прописные буквы (A-Z, a-z); • строчные и прописные буквы кириллицы (А-Я, а-я); • символы типа: !, @, #, $, %, &; • символ подчеркивания. Из этих символов образуются слова языка VBA. Слова в программах отделяются друг от друга разделителями и специальными символами. Разделителями являются: • пробел; • символ продолжения строки ( _ ); • символ табуляции; • символ новой строки.
8
Специальные символы (+,-,*,/,’,”,.,=,<,>,:) используются для обозначения операторов и других языковых конструкций. Все слова языка VBA можно разделить на четыре группы: • имена (идентификаторы); • ключевые (зарезервированные) слова; • числа; • строки. Имя ( идентификатор ) – произвольная последовательность букв и цифр, не превышающая 255 символов, которая обязательно должна начинаться с буквы. Эта последовательность может включать также символы подчеркивания и заканчиваться одним из символов типа. В качестве идентификаторов не могут использоваться зарезервированные слова языка и имена стандартных объектов. Пробелы в идентификаторах недопустимы. Примеры идентификаторов: SalesHistory; intCount; Счетчик_Строк% и т.п. Строка – произвольная последовательность символов алфавита, заключенная в двойные кавычки (“…”). Если строка включает символ кавычки, перед ним ставится еще один такой же символ, чтобы отличить его от символа конца строки, например “Акционерное общество ““Балтийские линии””. Число используется для представления дробных и целых чисел. Целое число записывается в виде последовательности цифр. Для записи десятичных чисел в качестве разделителя десятичных знаков используется точка (.). Иногда для записи чисел используется экспоненциальная форма. Ключевое ( зарезервированное ) слово – слово, которое представляет целую языковую конструкцию или ее часть и может использоваться только в том виде, в каком оно указывается при описании синтаксиса языка. Никакое другое слово в программе не должно совпадать с ключевым словом. Первая буква ключевого слова обычно прописная, но можно вводить слово только строчными буквами. Если в слове нет ошибки, редактор исправит его так, как это принято в языке. Соответственно, если слово не исправляется – это признак наличия ошибки. Текст программы на языке VBA состоит из последовательности предложений, каждое из которых представляет собой комбинацию ключевых слов и идентификаторов. Правила такого комбинирования и есть синтаксис языка.
1.5. Переменные и типы данных Как и в других языках программирования, для хранения значений, выполнения вычислений и передачи параметров в процедуры и функции в VBA используются переменные. Переменная – это элемент данных в программе, которому присвоено имя. Значение переменной может задаваться и изменяться программой ( переменная – не константа).
9
Перед тем как использовать переменную, нужно ее объявить . Однако VBA позволяет использовать необъявленные переменные. В этом случае тип данных определяется по последнему символу в имени переменной. Если же специального символа в имени не обнаружено, этой переменной присваивается тип Variant – специальный тип, который может использоваться для хранения различных типов данных. Для объявления переменной, как правило, используется оператор Dim. Его синтаксис: Dim <имяПеременной> [As <типДанных>][,<имяПеременной>[As <типДанных>]]… Пример: Dim intPersonCount As Integer
В описании синтаксиса оператора Dim имяПеременной и тип Данных , заключенные в « угловые скобки», означают выражения, которые в программе заменяются вполне конкретным текстом. Имя переменной является идентификатором. Dim, As и тип данных в этой конструкции являются ключевыми словами, и после ввода всей конструкции при переходе к следующему предложению программы они изменяют свой цвет ( этот цвет задается в параметрах Редактора Visual Basic). После ввода ключевого слова As и пробела после него возникает подсказка – список возможных вариантов, из которых надо выбрать нужный тип данных или написать самому. Конструкции, заключенные в квадратные скобки, являются необязательными, т.е. при написании программы их можно опустить. В дальнейшем мы будем придерживаться такого стиля описания синтаксиса языка. В операторе Dim конструкция As <типДанных> является необязательной. Если в имени переменной используются символы типа, то еще раз определять тип данных не нужно. Например, Dim Count% также объявляет переменную типа Integer. Во многих языках программирования в имени переменной принято использовать префикс, позволяющий определить при чтении программы тип переменной ( для каждого типа имеется свой префикс). Однако использование префикса не объявляет переменную, а лишь напоминает о типе данных, присваиваемом этой переменной. Тип данных не только определяет перечень возможных операций с переменной, но и диапазон возможных значений и количество памяти, которое требуется для хранения ее значения. Перечень типов данных VBA приведен в табл.1.
10
Таблица 1. Типы данных VBA Тип данных Boolean
(Логический)
Byte (Целое число без знака) Integer (Целое) Long (Длинное целое) Single (Число с плавающей точкой) Object (Объект) Double (Число с плавающей точкой двойной точности) Date (Дата) Currency
(Денежный)
String (Строка переменной длины) Array (Массив) Variant (Используется для хранения всех типов) Определяемый пользователем тип
Занимаемый размер памяти Диапазон (байт) 2 True ( Истина ) или False ( Ложь ) 1 от 0 до 255 2 от –32 768 до 32 767 4 от –2 147 483 648 до 2 147 483 647 4 По абсолютной величине от 1,401298 Е-45 до 3,402823 Е38 4 Любой определенный объект 8 По абсолютной величине от 4,9 Е-324 до 1,7 Е308 8 от 1 января 100 г. до 31 декабря 9 999 г. 8 от –922 337 203 685 477,5808 до 922 337 203 685 477,5807 1 байт на сим- от 0 до 64 Кбайт вол Зависит от размера массива и типа элементов массива 16 байт плюс 1 байт на каждый символ строковых значений Используется для описания различных структур данных
Ниже приведены рекомендуемые префиксы имен переменных для каждого типа данных и, в скобках, символы типа (где они определены): • Boolean – bin; • Byte – byt; • Currency – cur (@); • Date – dte; • Double – dbl (#); • Integer – int (%); • Long – lng (&); • Single – sng (!); • String – str ($); • Variant – vnt.
1.6. Константы Кроме переменных в программах VBA могут использоваться константы. В отличие от переменной константа никогда не меняет своего значения. Константа, как и переменная, должна объявляться, при этом используется оператор Const, аналогичный оператору Dim.
11
Const <имяКонстанты> [As <типДанных>] = <Выражение>, где <Выражение> – это любое значение или формула, возвращающая значение, которое должно использоваться в качестве константы.
Пример: Const intPersonCount As Integer = 100 Const maxLen% = 50
Кроме констант, описываемых пользователем, в VBA существуют еще встроенные константы. Такие константы используются обычно при работе с объектами приложения. Эти константы не требуют предварительного описания. Имена встроенных констант начинаются с префикса, который указывает, к объекту какого приложения Microsoft Office они относятся. Так, встроенные константы объектов Excel имеют префикс xl. Для безопасности не вводите имена констант, начинающихся с префиксов: xl(Excel); wd(Word); ac(Access); pp(Power Point); ol(Outlook); vb(VBA).
1.7. Массивы – это совокупность однотипных переменных. Чтобы узнать значение конкретной переменной – элемента массива, нужно указать имя этого массива и порядковый номер (индекс) элемента. Массивы могут быть одномерными, и тогда они имеют один индекс, двумерными – с двумя индексами и т.д. Массив, как и другие переменные, объявляется с помощью оператора Dim: Массив
Dim <имяМассива> (<размер1>,<размер2>, …) [As <типДанных>], где <размер1>, <размер2> определяют границы индексов массива.
Каждый индекс может быть определен: • одним числом, которое в этом случае представляет собой верхнюю границу индекса; • парой чисел, которые являются нижней и верхней границей индекса. Например, объявление Dim intArray (15) As Integer определяет одномерный массив, который содержит 16 целых чисел. Индекс этого массива будет меняться от 0 до 15. Обращение к i–му элементу массива будет выглядеть так: intArray(i-1).
Пример объявления двумерного массива размером 5 на 20 элементов: Dim sngMatrix(4, 19) As Single
Можно массив из 7 элементов объявить следующим образом: Dim intDay (1 to 7) As Integer В этом случае индекс массива меняется от 1 до 7.
12
Массивы, для которых мы указываем границы, являются статиче скими . Количество элементов в таких массивах определяется при их описании. Однако VBA позволяет работать с динамическими массивами, то есть массивами, размеры которых могут меняться в процессе работы программы. Объявление динамического массива: Dim <имяМассива> () [As <типДанных>]
Определение количества элементов массива и выделение памяти под эти элементы делается перед использованием массива с помощью специального оператора ReDim: ReDim [Precerve] <имяМассива> (<размер1>,<размер2>, …)
В операторе ReDim может использоваться ключевое слово Precerve . В этом случае при изменении размеров массива сохраняются значения его элементов. Если слово Precerve опущено, текущие значения элементов массива теряются, так как для него заново выделяется память. Оператор ReDim можно применять неоднократно для изменения размеров массива.
1.8. Операции с данными, приведение типов Для каждого типа данных определено некоторое множество простейших действий, называемых операциями . В языке VBA существует множество встроенных функций , которые работают с определенными типами данных. Приведение и преобразование типов Приведением называется автоматическое преобразование значения одного типа данных в эквивалентное значение другого типа в процессе выполнения операций с данными. Приведение выполняется, если операнды (данные, участвующие в операции) имеют разные типы. При этом результат будет иметь тот тип, к которому приводится один из операндов. Например, складываются два числа – целое ( Integer) и вещественное ( Double). В процессе этой операции целое число приводится к вещественному (Double), и результат будет иметь тип Double. Обратное преобразование (Double в Integer) может привести к потере данных. На рис. 2 приведена схема, показывающая, значения каких типов к каким типам приводятся без потери информации. VBA имеет также набор функций, которые можно использовать для явного преобразования типов данных в операциях. Например, функция CInt преобразует действительное число, находящееся в диапазоне от –32 768 до 32 767, в целое ( с округлением), а функция Chr возвращает символ по заданному коду (аргумент функции имеет тип Integer). Полезной может оказаться функция Str, преобразующая число в строку.
1.8.1.
13
Рис. 2. Схема приведения типов
Операции над числами Над числами в VBA определены стандартные арифметические операции и операции сравнения: • + – сложение; • - – изменение знака числа; • * – умножение; • / – деление; • \ – целая часть от деления; • Mod – модуль (целая часть остатка от деления); • ^ – возведение в степень; • = – равно; • <> – не равно; • > – больше; • < – меньше; • >= – больше или равно; • <= – меньше или равно. Для округления вещественных чисел в VBA теперь есть функция: 1.8.2.
Round(x,n),
где x – само число, а n – количество знаков после запятой.
14
1.8.3.
Операции со строками Для данных типа String существует только одна операция – конкатенация.
Пример: “Петр”&” “&”Иванович” Результат: “Петр Иванович”.
Для работы со строками существует большое количество функций. В качестве примера приведем некоторые из них: q
Len(<строка>) – Возвращает длину строки.
Пример: Sub Proba() Dim n As Integer, strY As String strY = Worksheets("Лист1").Range("a1") n = Len(strY) Worksheets("Лист1").Range("a2") = n End Sub В ячейку Лист1!А2 записывается количество символов строки, введенной в ячейку А1. q
Left(<строка>,<длина>) – Выделяет из аргумента <строка> указанное ко-
личество символов слева. Пример: В ячейках листа “Первый” введена информация: А1: Первый урок А2: =НАЙТИ(" ";A1) Процедура Proba1() выделяет из предложения, введенного в ячейку А1, первое слово и посылает его в ячейку А3. Sub Proba1() Dim n As Integer, strY As String Dim strZ As String strY = Worksheets("Первый").Range("a1") n = Worksheets("Первый").Range("a2") strZ = Left(strY, n - 1) Worksheets("Первый").Range("a3") = strZ End Sub q
Mid(<строка>,<старт>[,<длина>]) – выделяет из аргумента <строка> под-
строку с указанным числом символов, начиная с позиции <старт>. Если аргумент <длина> опущен, выделяется подстрока от позиции <старт> до конца строки. Пример: Если добавить в процедуру Proba1() два оператора: strZ = Mid(strY, n + 1) Worksheets("Первый").Range("a4") = strZ , то в ячейку А4 запишется оставшаяся часть предложения. Или другой пример:
15
Mid(“12345678”,4,3)=”456” Ltrim(<строка>) – удаляет пробелы в начале строки.
q
Операции с датами Значение дата/время хранится в памяти компьютера в виде 8- байтового числа с плавающей точкой, причем в целой части этого числа хранится дата, а в дробной – время. Отсутствие дробной части означает полночь, а дробная часть 0,5 – полдень, остальные значения обозначают время, прошедшее от полуночи. Дата представляется количеством дней, начиная с 31 декабря 1899 года. Такая форма представления даты позволяет просто выполнять вычисления над датами – прибавлять и вычитать дни. Например, используя ключевые слова Date или Time, можно легко переопределить системную дату или время: Date = Date + 31 переопределит системную дату на месяц вперед. Для определения текущей даты используются функции Date и Now. Эти функции не имеют аргументов, и их можно использовать даже без скобок. Функция Date возвращает системную дату, а функция Now – текущие системные дату и время. Еще одна функция Time возвращает текущее системное время. Форматировать дату и время для вывода на экран можно с помощью двух функций: FormatDateTime и Format. Первая функция позволяет использовать несколько встроенных форматов представления даты и времени, например, FormatDateTime(Date,vbShotDate) будет возвращать дату в кратком формате типа “23.03.01” 1. Функция Format позволяет задать формат вывода, отличный от встроенных форматов. Например, функция Format(Date, “ddd, d mmm, yyyy”) будет возвращать текущую дату в формате “ Чт, 5 фев, 2004”. Указать значение конкретной даты в коде программы можно двумя способами. Использовать строковое выражение, например: dtBirthday=”21.1.1972” или dtBirthday=”21/1/1972”. В этом случае прежде чем присвоить значение переменной типа Date, строковое значение будет преобразовано в дату. Разделители можно использовать либо стандартные (/), либо заданные в региональных установках. Очередность числа и месяца также определяется региональными установками. Использовать стандартный формат даты – #mm/dd/yy#. Выглядит это так: dtBirthday=#01/21/72#. Ограничителем в датах является знак (#). Отдельные элементы даты – число, месяц, год – могут быть выделены с помощью функций Day, Month и Year соответственно. Например, Day(#3/20/98#)=20.
1.8.4.
1
Встроенные краткий и полный форматы даты и времени определяются региональными установками на вашем компьютере.
16
И наоборот, можно собрать дату из отдельных компонентов с помощью функции DateSerial, например: DateSerial(1998.3.21) = “21/03/98”. Аналогичные функции существуют для времени: Hour, Minute, Second, TimeSerial. Функции Weekday и WeekdayName возвращают, соответственно, номер и наименование дня недели, на который приходится указанная дата. Возвращаемый функцией Weekday номер дня недели зависит от необязательного параметра < первыйДеньНедели>. Если этот параметр пропущен, первым днем недели считается воскресенье. Функция WeekdayName преобразует номер дня недели в наименование. Она имеет тот же необязательный параметр <первыйДеньНедели>, но по умолчанию использует региональные установки (для русскоязычных версий первым днем недели считается понедельник). Пример: Для русскоязычных версий необязательный параметр для функции Weekday должен быть vbMonday или 2. Тогда эта функция возвращает привычный нам номер2: n = Weekday(#2/5/2004#, vbMonday) Worksheets("Первый").Range("b12") = n Для использования этого номера (регионального) в функции WeekdayName необязательный параметр либо не указывается, либо используются значения: vbMonday или 2. Worksheets("Первый").Range("a12") = WeekdayName(n , , vbMonday) В результате в ячейках А12:В12 имеем: четверг
4
Можно также использовать в обоих случаях значение необязательного параметра 0. Тогда будут использоваться региональные установки. Имя дня недели можно получить в ячейке а12, воспользовавшись одним предложением: Worksheets("Первый").Range("a12") = WeekdayName(Weekday(#2/1/2004#, 0)) 1 февраля 2004 г. — воскресенье: воскресенье
- ячейка А12
Кроме этих отдельных функций существует функция DatePart, которая может вернуть любую часть даты. Функция имеет два обязательных и два необязательных аргумента: DatePart(<интервал>,<дата>[,<первыйДеньНедели>[,<перваяНеделяГода>]]). Первый аргумент <интервал> указывает, какую часть даты, передаваемой
в качестве второго параметра, нужно вернуть. Возможные значения этого параметра представлены в табл. 2.
2
Здесь и далее мы продолжаем работу с процедурой Proba1() и листом “ Первый” приложения MS
Excel.
17
Таблица 2. Временные интервалы Значение параметра yyyy q m y d w ww h n s
Описание Год Квартал Месяц День года День месяца День недели Неделя Час Минута Секунда
Еще две функции помогают работать с временными интервалами: DateAdd и DateDiff. Если нужно добавить к дате какой-то временной интервал или вычесть его из даты, используется функция DateAdd, которая имеет следующий синтаксис: DateAdd(<интервал>,<число>,<дата>), где <интервал> – строковое выражение, одно из тех, что перечислены в табл. 2; <число> – числовое выражение, которое определяет, сколько временных ин-
тервалов нужно прибавить (если число положительное) или вычесть (если число отрицательное) из указанной в последнем аргументе даты; <дата> – начальная дата. Например, чтобы узнать, какая дата будет через 4 недели от 23 февраля, надо воспользоваться функцией DateAdd("ww", 4, #2/23/2004#), в результате чего будет получен ответ 22.03.2004. Если в ячейке А13 введена дата, а в ячейку А14 надо записать другую дату, например, на месяц большую, то реализовать это можно так: dteX = Worksheets("Первый").Range("a13") dteX = DateAdd("m", 1, dteX) Worksheets("Первый").Range("a14") = dteX
Функция DateDiff применяется для вычисления количества временных интервалов между двумя датами. Чаще всего она используется для вычисления числа дней между двумя датами, например, DateDiff("d", "01/01/2004", "01/04/2004")
дает результат 91. Две функции – DateValue и TimeValue – преобразуют аргумент-строку в дату и время соответственно.
18
Операции с логическими значениями С данными типа Boolean можно выполнять ряд специальных операций, называемых логическими или булевыми . Эти операции используются для построения булевых выражений, которые обычно применяются для управления последовательностью команд. Список логических операций приведен в табл. 3.
1.8.5.
Таблица 3. Логические операции Операция
Название
not a a and b a or b a xor b a eqv b a imp b
Отрицание Логическое И (конъюнкция) Логическое ИЛИ (дизъюнкция) Исключающее ИЛИ Эквивалентность Импликация
Результат выполнения логических операций над двумя операндами, a и b, задается таблицей истинности (табл. 4). Таблица 4. Таблица истинности a True True False False
b True False True False
Not a False False True True
a and b True False False False
a or b True True True False
a xor b False True True False
a eqv b True False False True
a imp b True False True True
1.9. Операторы присваивания Операторы присваивания служат для изменения значения переменных. В VBA существует четыре вида операторов присваивания: q q q q
Let – прямое присваивание; Lset – левое присваивание; Rset – правое присваивание; Set – объектное присваивание.
Использование ключевого слова Let необязательно, поэтому для прямого присваивания достаточно использовать оператор (=). Важно, чтобы тип присваиваемого значения совпадал с типом переменной, которой это значение присваивается. Оператор Lset имеет два вида синтаксиса: Lset <имя СтроковойПеременной> = <строковоеВыражение> Lset <имяПеременной1> = <имяПеременной2>
19
В первом случае результатом присваивания является строка той же длины, что и у значения строковой переменной. Если значение выражения <строковоеВыражение> длиннее, лишние символы справа удаляются, если короче – недостающие символы справа заполняются пробелами. Во втором случае Переменной1 присвоится столько левых символов из Переменной2, какова длина Переменной1. Аналогичным образом работает оператор Rset, только в этом случае удаляются лишние символы слева или заполняются слева пробелами недостающие символы. Объектное присваивание Set упрощает работу с громоздкими ссылками на объект. Если переменные SourceRange и fillRange имеют тип Object , то можно воспользоваться таким присваиванием: Пример: Если в ячейках А1:А2 введены даты: 09.02.04 и 16.02.04, то с помощью метода автозаполнения можно заполнить диапазон ячеек А1:А17 списком дат с интервалом в неделю: Set SourceRange = Worksheets("Лист1").Range("A1:A2") Set fillRange = Worksheets("Лист1").Range("A1:A17") SourceRange.AutoFill Destination:=fillRange
1.10. Управляющие конструкции Как и во многих языках программирования, в VBA имеются различные управляющие конструкции, позволяющие изменять порядок выполнения операторов программы. Для реализации любых алгоритмов достаточно иметь только два вида управляющих конструкций: ветвления и циклы . 1.10.1. Ветвления Управляющие конструкции ветвления позволяют проверить некоторое условие, а затем в зависимости от результатов этой проверки выполнить ту или иную группу операторов. Для организации ветвлений в VBA используются стандартный оператор ветвления If … Then … Else и оператор выбора Select Case. Оператор ветвления If … Then … Else имеет несколько форм представления: Форма 1: If <условие > Then < оператор >
—
краткая форма в одну строку. Форма 2:
В блочной форме краткое ветвление выглядит следующим образом: If <условие > Then
20
< оператор 1> < оператор 2> … End If
В качестве условия можно использовать логическое выражение, возвращающее значение True ( Истина) или False ( Ложь), или любое арифметическое выражение. Если используется арифметическое выражение, то нулевое значение этого выражения эквивалентно логическому значению False, а любое ненулевое выражение эквивалентно True. Если <условие > принимает значение False, то ни один из операторов, заключенных между Then и End If, выполняться не будет. Форма 3: If <условие > Then <блокОператоров1> Else < блокОператоров2> End If
Если <условие > истинно, то выполняется <блокОператоров1>. В противном случае выполняется < блокОператоров2>. При простом ветвлении бывает удобно использовать функцию Iif: Iif(<выражение>,<значениеЕслиДа>,<значениеЕслиНет>)
Функция Iif является встроенной функцией и, как всякая функция, используется в выражении. Таким образом, функцию Iif удобно применять, когда ветвление требуется в программе не для того, чтобы выбрать ту или иную альтернативную последовательность действий, а для присвоения того или иного альтернативного значения. Форма 4:
Для выбора одного из целой группы альтернативных действий на основе проверки нескольких различных условий используется такая форма: If <условие1 > Then <блокОператоров1> ElseIf <условие2 > Then < блокОператоров2>
21
ElseIf <условие3 > Then < блокОператоров3> … ElseIf <условиеN > Then < блокОператоровN> Else < блокОператоровElse> End If
Такие цепочки операторов обладают большой гибкостью и помогают решить многие проблемы. Однако если выбор одной из нескольких возможностей всегда основан на проверке одного и того же условия, гораздо удобнее использовать для этого оператор выбора Select Case, имеющий следующий синтаксис: Select Case <проверяемоеВыражение > Case <списокВыражений1> <блокОператоров1> Case <списокВыражений2> <блокОператоров2> … Case Else <блокОператоровElse> End Select
Проверяемое выражение вычисляется в начале работы оператора Select Case. Это выражение может возвращать значение любого типа, например, логическое, числовое или строковое. Список выражений представляет собой одно или несколько выражений, разделенных запятой. При выполнении оператора проверяется, соответствует ли хотя бы один из элементов этого списка проверяемому значению. Эти элементы списка выражений могут иметь одну из следующих форм: q <выражение> – проверяется, совпадает ли значение проверяемого значения с этим выражением; q <выражение1> To < выражение2> – проверяется, находится ли значение проверяемого выражения в указанном диапазоне значений; q Is < логическийОператор> < выражение> – проверяемое выражение сравнивается с указанным значением с помощью логического опера-
22
тора, например, условие Is <= 19 считается выполненным, если проверяемое значение не больше 19. Если хотя бы один из элементов списка соответствует проверяемому выражению, выполняется соответствующая группа операторов, и на этом выполнение оператора Select Case заканчивается, а остальные элементы списка выражений не проверяются, то есть отыскивается только первый подходящий элемент списка выражений. Пример: В ячейку А17 вводится какая-либо цифра. В ячейку А18 посылается соответствующее этой цифре числительное. Если n не попадает в диапазон от 1 до 9, то ячейка А18 будет пустой. Переменная k имеет тип Variant. k = Worksheets("Первый").Range("a17") Select Case k Case 1 Worksheets("Первый").Range("a18") = "один" Case 2 Worksheets("Первый").Range("a18") = "два" Case 3 Worksheets("Первый").Range("a18") = "три" Case 4 Worksheets("Первый").Range("a18") = "четыре" Case 5 Worksheets("Первый").Range("a18") = "пять" Case 6 Worksheets("Первый").Range("a18") = "шесть" Case 7 Worksheets("Первый").Range("a18") = "семь" Case 8 Worksheets("Первый").Range("a18") = "восемь" Case 9 Worksheets("Первый").Range("a18") = "девять" Case Else Worksheets("Первый").Range("a18") = "" End Select
1.10.2. Циклы Операторы цикла в языке программирования позволяют описывать многократное выполнение одного оператора или группы операторов. Операторы цикла в VBA можно разделить на три группы: q циклы с условием (Do … Loop); q циклы со счетчиком (For … Next); q циклы по структуре данных (For Each … Next). Циклы типа Do … Loop используются, когда заранее неизвестно, сколько раз должно быть повторено выполнение блока операторов. Такой цикл продолжает свою работу до тех пор, пока не будет выполнено определенное условие. Существуют четыре вида циклов Do … Loop , которые
23
различаются типом проверяемого условия и временем выполнения этой проверки. Синтаксис этих четырех конструкций приведен в табл. 5. Таблица 5. Синтаксис операторов циклов Do … Loop Конструкция
Описание
Do While <условие>
Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, пока это условие выполняется ( то есть имеет значение True), иными словами, в этой конструкции указывается условие продолжения работы цикла Условие проверяется после того, как операторы, составляющие тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, пока это условие остается истинным, иными словами, в этой конструкции указывается условие продолжения работы цикла Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. Цикл продолжает свою работу, если это условие еще не выполнено, и прекращает работу, когда оно станет истинным, иными словами, в этой конструкции указывается условие прекращения работы цикла Условие проверяется после того, как операторы, составляющие тело цикла, будут выполнены хотя бы один раз. Цикл продолжает свою работу, если это условие еще не выполнено, а когда оно станет истинным, цикл прекращает работу, иными словами, в этой конструкции указывается условие прекращения работы цикла
<блокОператоров> Loop Do < блокОператоров > Loop While <условие> Do Until <условие> <блокОператоров> Loop Do <блокОператоров> Loop Until <условие>
Частным случаем оператора Do … Loop Wend:
является оператор While …
While <условие> <блокОператоров> Wend <блокОператоров> выполняется,
пока <условие> истинно. Цикл со счетчиком For … Next обычно используется при обработке массивов, а также когда требуется повторить выполнение некоторой группы операторов заданное число раз. В отличие от циклов Do … Loop данный тип цикла использует специальную переменную, называемую счетчиком, значение которой увеличивается или уменьшается при каждом выполнении тела цикла на заданную величину. Когда значение этой переменной достигает заданного конечного значения, выполнение цикла заканчивается. Синтаксис этого вида цикла таков: For <счетчик> = <начальноеЗначение> To <конечноеЗначение>
24
[Step <приращение>] <блокОператоров> Next [<счетчик>]
Необязательный параметр <приращение> определяет шаг цикла. Он может быть как положительным, так и отрицательным числом. Если использовать отрицательное приращение, то конечное значение должно быть меньше либо равно начальному значению, чтобы тело цикла выполнилось хотя бы один раз. После завершения цикла For … Next переменная, которая использовалась в качестве счетчика, получает значение, обязательно превосходящее конечное значение, если приращение положительно, и строго меньше конечного значения, если приращение отрицательно. При совпадении начального и конечного значений тело цикла выполняется лишь один раз. Пример: В ячейки В1:В10 вводятся числа от 1 до 10 с помощью оператора цикла: For n = 1 To 10 Worksheets("Первый").Range("b" & n) = n Next n
В VBA при обработке объектов, составляющих массив или семей ство однородных объектов, часто используется другая разновидность цикла: For Each <элемент> In <семейство> <блокОператоров> Next [<элемент>],
где <элемент> – переменная, используемая для ссылки на элементы семейства объектов; <семейство> – имя массива или семейства. Пример: Требуется проверить диапазон ячеек Е1:Е5 на присутствие там слова «Нет» и заменить это слово на «Да». Если в ячейке другая информация, то написать слово «Нет». Dim objCells As Object For Each objCells In Worksheets("Первый").Range("e1:e5") If objCells = "Нет" Then objCells = "Да" Else objCells = "Нет" End If Next objCells При первом запуске этой процедуры все ячейки, содержащие слово «Нет», заменятся на слово «Да», а ячейки, содержащие любую другую информацию, заменятся на «Нет». При последующих запусках этой процедуры слова будут заменяться на противоположные.
25
1.11. Процедуры VBA Процедуры VBA бывают двух типов: q общие процедуры; q процедуры обработки событий.
Рис. 3. Рабочее окно редактора Visual Basic
Рис. 4. Окно Module1 (Code) предназначено для ввода общих процедур
26
Процедуры обработки событий всегда связаны с каким-либо объектом. Этим объектом может быть элемент управления, лист MS Excel и т.п. Вызов процедуры может произойти по щелчку мыши на ярлычке листа или при выборе элемента из списка в элементе управления Поле со списком и по многим другим событиям, возникающим в системе. Хранятся процедуры обработки событий на листе программного кода, который можно открыть с помощью меню Сервис / Макрос / Редактор Visual Basic (рис. 3). Из приведенного рисунка видно, что на Листе 3 Книги 1 была создана Командная кнопка CommandButton1 ( один из элементов управления ). Щелкнув дважды по этой кнопке в режиме редактирования, пользователь создал процедуру обработки события Click . Остается только заполнить тело процедуры программным кодом, и при нажатии кнопки эта процедура будет отрабатываться. Выбирая в окне Project один из встроенных объектов Microsoft Excel, можно просмотреть все программные коды, относящиеся к тому или иному листу. Если новый объект будет создан на Листе 2 , то его процедура обработки будет находиться в окне Лист 2 (Code) . Общие процедуры можно создавать в любом месте, однако для возможности обращения к ним из любого листа лучше помещать такие процедуры в Стандартный модуль . По умолчанию Проект VBA вновь созданной книги содержит только папку Microsoft Excel Objects. С помощью меню Insert/Module ( Вставка / Модуль ) создается окно, в котором пользователь может написать процедуру, доступную из любого места данной книги. Структура проекта приложения приобретает новый вид (рис. 4). На Па нели проекта (Project) отобразилось новое иерархическое дерево, в котором добавилась папка Modules с одним пока модулем – Module1 . Процедуры могут быть процедурами-подпрограммами и процедурамифункциями. Процедура-подпрограмма может выглядеть так: Sub <имяПроцедуры> (<аргумент1>,<аргумент2>,…) <оператор1> <оператор2> … End Sub
Список аргументов у процедуры может отсутствовать и может иметь необязательные аргументы. Объявление каждого аргумента имеет следующий синтаксис:
27
[Optional][ByVal|ByRef] [ParamArray] <имяАргумента> [()] [As <типДанных>] [=<значениеПоУмолчанию>],
где ключевое слово Optional указывает, что данный аргумент является необязательным. Если это слово отсутствует, аргумент является обязательным. В списке аргументов сначала должны присутствовать все обязательные аргументы, и только после них необязательные. Для необязательного аргумента может быть указано <значениеПоУмолчанию>, которое будет использоваться, если этот аргумент будет опущен. Когда по логике работы процедура должна понимать, передано ли ей значение необязательного аргумента, нужно описать этот аргумент как Variant (обязательно) и использовать в процедуре функцию IsMissing(), которая возвращает значение True , если параметр не передан. При переменном числе аргументов процедуры используется ключевое слово ParamArray, после которого описывается аргумент в виде массива типа Variant . Этот массив, также как и необязательные аргументы, должен быть последним в списке аргументов процедуры. Ключевые слова ByVal и ByRef определяют способ передачи параметров процедуре: ByVal – по значению, ByRef – по ссылке. Передача значения параметра по ссылке ( ByRef) означает, что на самом деле процедуре передается адрес соответствующей переменной в памяти. Значение переменной может быть изменено в теле процедуры, и при выходе из нее переменная будет иметь это новое значение. Если же фактический параметр передается по значению ( ByVal), то вызываемая процедура получает копию значения переменной. И как бы переданное значение ни менялось в теле процедуры, это никак не скажется на значении переменной, которая передавалась в качестве фактического параметра процедуры. Описание подпрограммы-функции мало чем отличается от описания процедуры-подпрограммы: Function <имяФункции> (<аргумент1>,<аргумент2>, …) [As <типЗначения>] <оператор1> <оператор2> … < имяФункции > = <возвращаемоеЗначение> End Function
Кроме того, что ключевое слово Sub заменяется на Function, в теле процедуры-функции обязательно присутствует оператор присваивания имени функции какого-нибудь значения. Это значение и возвращается функцией. В заголовке функции может быть описан тип возвращаемого значения. Если этот тип не указан, функция возвращает значение Variant. Если такая процедурафункция описана в стандартном модуле, она появляется при работе с мастером
28
функций в категории Определенные пользователем пользовать так же, как и другие встроенные функции.
. Ее можно ис-
1.11.1. Вызов подпрограмм и функций Вызов процедуры-подпрограммы отличается от вызова процедурыфункции. Обычно подпрограмма вызывается из другой подпрограммы или функции с помощью специального оператора VBA. Если она имеет аргументы, ей передается список фактических параметров. Оператор вызова подпрограммы может использоваться в двух формах: <имяПроцедуры> <списокФактическихПараметров> или Call <имяПроцедуры>(<списокФактическихПараметров>)
В первом случае список фактических параметров задается без скобок, во втором – использование скобок обязательно. Но всегда список фактических параметров должен полностью соответствовать списку аргументов, заданному в объявлении подпрограммы. Все фактические параметры для обязательных аргументов должны быть перечислены в том порядке, в каком они присутствуют в описании подпрограммы, после чего могут идти параметры для необязательных аргументов. Если подпрограмма не имеет аргументов, ее можно вызвать не только из другой процедуры, но и с помощью комбинации клавиш быстрого вызова, команд раскрывающихся меню и кнопок панелей инструментов. Большинство подпрограмм обработки событий также являются подпрограммами без параметров. Вызов подпрограммы-функции имеет следующий вид: <имяПеременной> = <имяФункции>(<списокФактическихПараметров>)
1.11.2. Область видимости переменных и процедур Область видимости – это область программы, где имя переменной, процедуры или константы видимо, а значит, возможен к ним доступ. Например, если переменная А объявлена в теле процедуры Proc1 с помощью оператора Dim, областью ее видимости будет только эта процедура. В другой процедуре Proc2 вы снова можете описать переменную с этим же именем А, но это будет уже другая переменная. Время жизни переменной – это время, в течение которого сохраняется память, выделенная ей при инициализации ( при этом сохраняется и значение этой переменной).
29
Существует три уровня определения области видимости переменной: уровень процедуры, уровень модуля и уровень проекта. Когда переменная объявлена в теле процедуры, говорят, что она описана на уровне процедуры. Такие переменные называются локальными. Они доступны только в пределах той процедуры, в которой они объявлены. Переменные, объявленные неявно, всегда являются локальными. Если переменная объявлена в разделе объявлений модуля, то есть до каких-либо объявлений процедур ( рис. 5), говорят, что она объявлена на уровне модуля. Такая переменная доступна для совместного использования во всех
Рис. 5. Переменная strA объявлена на уровне модуля
процедурах данного модуля и недоступна из процедур в других модулях. Значения переменной уровня модуля сохраняется все время, пока работает этот модуль. Если нужно, чтобы переменная могла использоваться процедурами, которые располагаются в нескольких модулях, она должна быть описана на уровне проекта. Для этого ее нужно описать в разделе объявлений одного из модулей и вместо слова Dim поставить ключевое слово Public . Переменные, описанные на уровне проекта, называются глобальными. Время жизни глобальных переменных – все время, пока работает приложение. Для локальной переменной существует еще один способ объявления, не меняющий ее уровень, но влияющий на время жизни. Если при объявлении переменной в теле процедуры вместо оператора Dim поставить Static, то выделенная ей память не отбирается при выходе процедуры, в которой она была описана и использована, и значение переменной сохраняется. Такая переменная называется статической. Статическая переменная не доступна вне тела процедуры, в которой она объявлена. Но если произойдет повторный вызов этой процедуры, переменная не будет заново инициализироваться, а будет иметь то значение, которое она имела в момент завершения работы процедуры при предыдущем вызове. Процедуры имеют только два уровня видимости – уровень модуля и уровень проекта. По умолчанию используется уровень проекта.
30
1.12. Использование элементов управления Элементы управления – это объекты VBA, разработанные для решения определенных задач. По сути, каждый элемент управления представляет собой мини-программу, принимающую ввод и обеспечивающую вывод посредством своих свойств. К примеру, при использовании текстового поля можно задавать свойства, определяющие размер этого поля, шрифт для отображения текста и его цвет. Это текстовое поле настраивается так, чтобы правильно передавать размер и вид текста с учетом установленных значений свойств. Кроме того, текстовое поле имеет внутренний код, позволяющий обрабатывать нажатия клавиш. Благодаря внутреннему коду поле «знает», что при нажатии клавиши BackSpace (←) нужно удалить предыдущий символ. Обычно элементы управления рассматриваются как части графического интерфейса. Их внешним видом, и в особенности поведением, управляют при помощи трех основных компонентов: свойств, методов и событий. Свойства элементов управления можно рассматривать как описание характеристик объекта. Это напоминает характеристики человека: вес, рост, цвет волос и глаз. Каждый элемент такого описания можно называть свойством. Общие характеристики большинства объектов: § Местоположение объекта Свойства объекта Left и Top определяют его положение внутри рабочего листа. Свойство Left указывает расстояние от левой границы объекта до левой границы рабочей области листа. Свойство Top задает расстояние от верхней границы объекта до верхней границы рабочей области листа. Height (высота) и Width (ширина) определяют размер объекта. § Видимость объекта Свойства Visible и Enabled имеют значение True или False . Эти свойства определяют, может ли пользователь видеть данный объект и взаимодействовать с ним. Если свойство Visible имеет значение False , объект не отображается и пользователь даже не подозревает о его существовании. При установке свойства Visible в True объект отображается. Если свойство Enabled имеет значение False , то объект видим (при условии, что Visible – True ), однако пользователь не может с ним взаимодействовать. Обычно, если объект заблокирован, он отображается на экране серым или приглушенным цветом. Благодаря этому пользователь может определить, что объект недоступен. § Наименование объекта Другим свойством любого объекта в VBA является свойство Name . Это свойство задает уникальный идентификатор, при помощи которого к данному объекту можно обращаться из программы. Каждый элемент управления в пределах одного рабочего листа должен иметь уникальное имя. VBA при создании объекта присваивает ему имя по умолчанию. Например, первому элементу управления Поле со списком по умолчанию присваивается имя
31
второму – Combobox2 , и т.д.), а кнопке – , CommandButton2 и т.д. Однако обычно объектам дают некоторые значащие имена. Что касается именования объектов, хороший стиль программирования предполагает использование префикса для определения типа называемого объекта. С помощью меню Вид / Панели инструментов / Элемен ты управления открывается панель, на которой расположены следующие кнопки: ComboBox1 ( CommandButton1
Таблица 6. Список кнопок, находящихся на панели инструментов Элементы управления Вид
Наименование кнопки
ПреВид фикс
Режим конструктора (Design Mode) / Выход из режима конструктора (Exit Design Mode)
Исходный текст (Code) chk
Кнопка (Command Button)
cmd
Выключатель (Toggle Button) Полоса прокрутки (Scroll Bar) Рисунок (Image)
Рис. 6. Панель инструментов
Префикс
Свойства (Properties)
Флажок (Check Box)
Список (List Box)
Наименование кнопки
Поле (Text Box) Переключатель (Option Button) Поле со списком (Combo Box)
lst
txt opt cbo
tgl
Счетчик (Spin Button)
spn
scb
Надпись (Label)
lbl
img
Элементы управления в VBA – это не просто пассивные компоненты, отображающиеся на экране. Эти объекты могут выполнять некоторые функции. Подобно тому, как свойства объекта определяют его вид и поведение, методы описывают задачи, выполняемые этим объектом. Фактически, метод – это фрагмент программного кода, встроенный в объект. Используя встроенный метод, объект может выполнять поставленную задачу, никаких дополнительных команд не требуется.
Элементы управления.
32
Как и в случае со свойствами, каждый тип объекта может иметь различные методы и разное их количество. Кроме выполнения различных задач, объекты могут реагировать на действия пользователя или другие внешние воздействия, которые называются событиями. Например, щелчок по кнопке вызывает для этого элемента управления событие Click . Чтобы программа реагировала на событие, необходимо написать процедуру обработки этого события, т.е. программный код. Для добавления элемента управления на рабочий лист надо щелкнуть по кнопке этого элемента на панели инструментов Элементы управления , а затем мышкой обозначить местоположение и размер объекта. После этого можно переходить к установке свойств элемента управления. Один из способов установки значений свойств – определить их в процессе проектирования при помощи диалогового окна Properties ( Свойства ) (рис. 7). Однако, для того, чтобы элементы управления были действительно полезны, нужно иметь возможность изменять свойства из программы и, что еще важнее, получать значения свойств. Например, поль- Рис. 7. Диалоговое окно Свойства зователь может вводить текст в Тексто вом поле , но для того, чтобы использовать этот текст, нужно получить его от элемента управления и передать в программу. Поскольку текст хранится в свойстве Text Текстового поля , этот текст можно получить, обратившись к этому свойству. Когда некоторое свойство элемента управления используется в программе, его можно рассматривать как переменную или константу. Свойства можно включать в операторы сравнения как условия ветвления кода и в арифметические операторы – для установки значения переменных. При помощи арифметических операторов можно также задавать свойству некоторое значение. Пример: Dim strInput As String strInput = TextBox1.Text
33
Mid(strInput, 1, 1) = UCase(Left(strInput, 1)) TextBox1.Text = strInput Здесь свойство Text текстового поля используется для получения строки, введенной пользователем, после чего первая буква строки делается заглавной ( благодаря функции Ucase), и модифицированный текст обратно отображается для пользователя.
Для ссылки на свойство элемента управления из программы нужно указать имя этого элемента (свойство Name ) и имя свойства. При этом имя элемента управления и имя свойства разделяются точкой. Как видно из приведенного примера, сначала указывается имя элемента, TextBox1 , после которого следуют точка и имя свойства Text . Такой синтаксис применяется для обращения к любому свойству любого элемента управления. 1.12.1. Использование элемента Label для вывода текста Простейший элемент управления, служащий для отображения текста, – это Label ( Надпись ). Чаще всего он описывает назначение располагающегося рядом какого-либо поля. В этом случае каждая надпись, как правило, задается при проектировании, и необходимый текст приписывается свойству Caption диалогового окна Properties . Однако элемент Label используется и для других целей. На самом деле его можно применять для вывода на экран любой информации. Надпись может представлять собой дату, число, отдельное слово или даже целый параграф текста. В то время как свойство Caption надписи содержит текст, существуют и другие свойства элемента управления Label , влияющие на способ отображения этого текста. Наиболее очевидные из них – свойства Font и ForeColor , которые определяют шрифт и цвет текста. Однако если надпись отображает достаточно много символов, то самыми нужными будут свойства AutoSize ( автоматическая настройка размера) и WordWrap (перенос слов). Свойство WordWrap определяет, может ли текст занимать несколько строк в элементе управления. Если свойство имеет значение False , то текст может появиться только в одной строке. Если он длиннее этой строки, то конец строки обрезается, хотя по-прежнему информация остается в свойстве Caption . Если свойство WordWrap имеет значение True и элемент управления имеет высоту, достаточную для отображения нескольких строк текста, то при достижении конца текущей строки текст переносится на следующую. Если заранее известно, какой текст будет отображаться в надписи, то для нее можно задать соответствующий размер. Однако если в разные моменты времени надпись отображает различный текст (например, при работе с базами данных), то нужно иметь возможность обрабатывать тексты неопределенной длины. Свойство AutoSize надписи определяет, нужно ли автоматически
34
подстраивать размер элемента управления под отображаемый текст. Способ настройки зависит также от значения свойства WordWrap . Если оно имеет значение False , то при установке свойства AutoSize в True надпись растягивается по горизонтали. Если WordWrap установлено в True , то ширина надписи остается постоянной, а элемент управления растягивается по вертикали так, чтобы текст вошел в него. Предупреждение! Для того чтобы сохранить начальную ширину элемента управления Label , сначала нужно установить в True свойство WordWrap , а потом определять свойство AutoSize . Свойство TextAlign ( выравнивание текста) определяет, как текст выравнивается внутри надписи. Возможные значения: 1-fmTextAlignLeft 2-fmTextAlignCenter 3-fmTextAlignRight Свойство BorderStyle
значением 1-fmBorderStyleSingle одинарную окантовку вокруг надписи.
задает
1.12.2. Ввод текста при помощи элемента TextBox Одним из основных рабочих элементов программ является Текстовое окно (TextBox), или Поле . Такое поле позволяет выводить текст и, что еще важнее, предоставляет пользователю возможность вводить и редактировать текст, который в дальнейшем будет обрабатываться программой. Главное свойство – Text . Для обработки больших текстов Поле имеет два удобных свойства: Multiline ( Много строк) и ScrollBar ( Полоса прокрутки). Программно можно менять не только содержимое текстового поля ( с помощью свойства Text ), но и шрифт, его цвет и размер и т.п. Например, чтобы вид текста, отображаемого в Поле , изменился, можно использовать операторы: TextBox1.ForeColor = &HFF0000 TextBox1.Font.Bold = True ‘ TextBox1.Font.Size = 12 ‘
‘
Изменяет цвет шрифта на синий Шрифт становится жирным Размер шрифта устанавливается, равным 12.
Чтобы узнать, какой код использовать для того или иного цвета, можно в Режиме конструктора открыть диалоговое окно Properties и найти свойство ForeColor . В столбце для установки значений свойств надо щелкнуть по раскрывающей кнопке и выбрать вкладку Palette , с помощью которой определить подходящий цвет. Напротив свойства ForeColor отобразится значение этого свойства, которое можно скопировать в процедуру для изменения цвета шрифта. 1.12.3. Выбор альтернативных вариантов Для обработки альтернатив в VBA имеются два элемента управления: Флажок (CheckBox ) и Переключатель (OptionButton ).
35
Элемент CheckBox позволяет пользователю выбирать один из двух вариантов – « Да» или « Нет». При щелчке состояние флажка меняется на противоположное. Состояние «Да» отмечается галочкой внутри флажка. При состоянии «Нет» значок флажка пустой. Если альтернатив несколько, то можно использовать кнопкипереключатели ( OptionButton ). Эти кнопки всегда группируются для того, чтобы можно было выLabel6 брать одно значение из нескольких. Когда переключатели помещаются на рабочий лист, они образуют группу переключателей, название которой у каждого переключателя отражается в свойстве OptionGroup . Чтобы ListBox2 создать на этом же листе другую группу переклюOptionButton1 OptionButton2 чателей, необходимо группе новых переключателей дать другое имя. Рис. 8. Группа связанных элементов Внутри группы в каждый момент времени может быть выбрана только одна кнопка. При выборе некоторой кнопки остальные кнопки группы сбрасываются. Когда кнопка выбрана, ее свойство Value устанавливается в True . Для других кнопок группы это свойство равно False . Пример: На рис. 8 показана группа элементов управления: Label6 – Надпись, текст в которой отображается в зависимости от выбранного переключателя; ListBox2 – Список, в котором отображается информация либо по материалам либо по работам; OptionButton1 и OptionButton2 – Переключатели ( Материалы и Работы), от выбора которых зависит содержание текста в Надписи и список элементов в Списке. Private Sub OptionButton1_Click() Label6.Caption = "Выберите из списка необходимые материалы" ListBox2.ListFillRange = "Материалы" ‘Информация выбирается из диапазона с End Sub ‘именем Материалы Private Sub OptionButton2_Click() Label6.Caption = "Выберите из списка перечень работ" ListBox2.ListFillRange = "Работы" ‘Информация выбирается из диапазона с End Sub ‘ именем Работы
36
1.12.4. Работа со Cписками Хотя флажки и переключатели удобны при небольшом количестве альтернатив, во многих случаях пользователь должен делать выбор из большого количества вариантов. В этом случае VBA представляет два элемента управления для работы со списками: Список (ListBox) и Поле со списком (ComboBox).
Элемент управления ListBox состоит из списка опций и полосы прокрутки. Обычно список представляет собой группу логически связанных элементов. Чтобы выбрать элемент из списка, пользователь может использовать полосы прокрутки для перемещения по списку, а затем щелкнуть мышью по нужному элементу. Выбранная опция отмечается полосой-указателем. Для того, чтобы создать элемент управления ListBox , сначала нужно нарисовать его, подобно любым другим элементам. Первоначально список пуст. Чтобы в нем отобразился какой-либо элемент или целый список, надо в свойстве ListFillRange указать диапазон (или его имя), информация из которого будет выбираться в список. Диапазон может содержать несколько столбцов. Любой элемент списка можно получить через свойство List , которое в общем случае представляет собой двумерный массив. Первый индекс этого массива – номер элемента в списке, а второй индекс – номер колонки, из которой выбирается информация. И первый, и второй индекс принимают свои значения, начиная с 0. Если информации из одного столбца не достаточно для точного выбора того или иного элемента, к просмотру можно представить несколько колонок, указав в свойстве ColumnCount необходимое количество колонок. Более подробно свойства элементов управления ComboBox и ListBox будут рассмотрены в гл.2.
37
Глава II. Практическое использование приложения MS Excel 2.1. Одна задача и три варианта решения В офисах небольших компаний или на небольших производствах часто возникает необходимость выписывать счета-фактуры или накладные, составлять сметы или калькуляцию. Объем работ не настолько велик, чтобы приобретать дорогостоящий программный продукт, а рутинная работа, которую приходится день за днем проделывать, доставляет немало хлопот. К сожалению, встречаются работники, которые в текстовом редакторе рисуют таблички, вносят в них информацию, а потом на калькуляторе все пересчитывают. В этой главе предлагаются три способа автоматизации: • один – использовать формулы; • второй способ – подключить к работе элемент управления Поле со списком
(ComboBox);
• а третий – не останавливаться на достигнутом: применять макросы, писать небольшие процедуры. Пусть даже есть такая работа, которую вы делаете только в начале месяца (например, очищаете таблички от информации, копируете из месяца в месяц одни и те же участки), но ведь эта работа носит повторяющийся характер, а значит, ее не только можно, но и нужно автоматизировать. Пусть компьютер за вас это сделает, а вы в это время кофе попьете. Но прежде надо немного поработать, сделать «задел», может быть, даже на целый год вперед. Задача, которую мы будем рассматривать, носит несколько обобщенный характер, но мы ее будем решать на примере конкретных данных. Так будет понятнее. Постановка задачи и подготовка информации Предположим, имеется товарный склад, из которого товары или материалы распределяются по другим складам или товарным точкам. С помощью MS Excel создается база данных по имеющемуся ассортименту. Как показано на рис. 9, список находится на листе Товары, каждый товар пронумерован, т.е. имеет свой уникальный код, и весь список товаров отсортирован по полю кодов. Не обязательно, чтобы поле кодов было числовое, но важно, чтобы список был отсортирован по возрастанию по этому полю, так как функция, с которой в дальнейшем придется работать, требует этой сортировки. При выдаче со склада товара выписывается какой-либо документ, например Накладная (рис. 10). Бланк этой накладной помещается на отдельный лист с названием Накладная. «Шапка» документа может быть заполнена заранее, так как некоторые ее элементы не изменяются, а вот табличная часть в каждой на2.1.1.
38
кладной будет каждый раз своя. Как можно автоматизировать формирование табличной части документа?
Рис. 9. Вид таблицы со списком товаров (материалов) Поле Имя. Здесь сейчас отображается адрес текущей ячейки
Строка формул
Рис. 10. Бланк накладной
39
Сформируем бланк на листе Накладная, руководствуясь следующими соображениями. Столбец А будет использоваться как вспомогательный. Начиная с ячейки А14 (в соответствии с нашим примером), в нем будут располагаться коды товаров. Будем считать, что количество отпускаемых товаров по одной накладной не превышает 10. Поэтому заготовим в табличной части 10 строк. Дальнейшее выполнение задачи будет строиться на основе приведенного бланка (рис. 10). Используемые термины В MS Excel заголовки строк и столбцов располагаются слева и сверху рабочей области листа. Строки нумеруются цифрами, а столбцы – в зависимости от настройки параметров – латинскими буквами или цифрами. В нашем примере используется буква. Адрес ячейки формируется из буквы столбца и номера строки, на пересечении которых находится эта ячейка (А17, С45, Н21, АВ33 и т.п.). Несколько расположенных рядом выделенных ячеек образуют диапазон, который обозначается так: В1:L30, или А14:А23, или В14:L23. Кроме адреса, ячейка или диапазон может иметь Имя. Дать имя какомулибо диапазону или ячейке можно с помощью поля Имя, которое находится слева от Строки формул. Надо выделить ячейку или диапазон, затем щелкнуть по полю Имя и ввести нужное слово или комбинацию слов. Однако надо помнить, что в Имени нельзя использовать пробелы, поэтому вместо пробелов рекомендуется использовать символ « подчерк» ( _ ). В завершении процедуры обязательно нажмите клавишу ENTER, иначе имя за диапазоном не закрепится. При создании бланка накладной придется неоднократно прибегать к форматированию ячеек, обратившись к меню Формат / Ячейки (рис. 11). Чаще всего используются вкладки Выравнивание, Шрифт, Граница. В некоторых ячейках заголовка таблицы можно применить такие особенности форматирования, как переносить по словам и объединение ячеек, а также выравнивание по горизонтали и вертикали – по центру. В тех ячейках, где предполагается расположить числа, надо задать с помощью вкладки Число числовой формат и указать нужное число десятичных знаков. Для вычерчивания рамки используется вкладка Граница. 2.1.2.
Автоматизация с помощью формул Познакомившись с некоторыми терминами MS Excel, перейдем к первому шагу автоматизации, суть которого состоит в следующем: нам надо автоматизировать процесс ввода наименования товара и его реквизитов (единиц измерения и цены) в табличную часть накладной. Чтобы не печатать каждый раз эту информацию и не наделать лишних ошибок, мы будем вводить код товара в столбец А, а по этому коду из соответствующих столбцов листа Товары будет выбираться с помощью формул 2.1.3.
40
Рис. 11. Форматирование ячеек. Вкладка Выравнивание
нужная информация в табличную часть накладной. Для осуществления этого замысла придется произвести еще некоторые вспомогательные действия. Выделим столбец А на листе Товары. Для выделения столбца надо щелкнуть по его Заголовку. Назовем этот диапазон Код_т. Также дадим имена столбцу В – Наименование, столбцу С – Ед_изм, а столбцу D – Цена. Это для удобства ввода и копирования формул. 2.1.3.1. Ввод формул с помощью Мастера функций Введем в ячейку А14 один из кодов товара, например 9. В ячейку В14 с помощью Мастера функций введем формулу. Мастер функций вызывается Вставка функции нажатием кнопки Вставка функции (рис. 12) на Панели инструментов Стандартная. На первом шаге Мастера функций ( рис. 13) в левом окне выбирается Категория, а в правом – ищется нужная функция из выбранной категории. Мы будем использовать функцию ПРОСМОТР из категории Ссылки и массивы. Выбрав данную функцию и нажав кнопку ОК, мы попадаем в окно выбора вида данной функции. Здесь представлены два списка ее аргументов. Рис. 12. Кнопка
41
Рис. 13. Ввод функции с помощью Мастера
Нам нужен список искомое_значение; вектор_просмотра; вектор_результата.
Следующее диалоговое окно Мастера функций непосредственно помогает создать выбранную функцию. На рис. 14 представлено изображение диалогового окна на завершающем этапе. Мы разберем построение формулы чуть подробнее.
Рис. 14. Функция ПРОСМОТР
42
Диалоговое окно имеет три поля ввода ( по числу аргументов функции). Щелкнув мышью в первом поле ввода, мы можем вписать адрес той ячейки, в которой находится искомое значение. Но можно просто щелкнуть мышью по нужной ячейке, и ее адрес впишется в поле ввода. Если диалоговое окно закрывает ячейку, его можно передвинуть, щелкнув левой кнопкой мыши в любой его области, кроме полей ввода и кнопок, и протянуть в нужном направлении, не отпуская кнопки мыши. Можно временно убрать диалоговое окно, нажав кнопку, находящуюся с правой стороны поля ввода, выбрать нужную ячейку и возвратиться в диалоговое окно, нажав похожую кнопку в оставшемся на экране поле ввода. Для ввода второго аргумента функции необходимо щелкнуть по второму полю ввода диалогового окна. Здесь можно вписать название диапазона, а можно в Меню Вставка выбрать опцию Имя / Вставить и выбрать имя нужного диапазона. В данном случае надо выбрать имя Код_т. А для третьего аргумента функции выбирается имя Наименование. Появление ошибки #Число можно исключить, если при присвоении имен диапазонам (Код_т, Наименование, Ед_изм и Цена) выделять диапазоны ячеек, начиная со второй строки и до какой-нибудь тысячной строки (т.е. диапазон, в котором все данные будут однородны). При этом все диапазоны должны иметь одинаковую длину. Однако в целях удобства и для исключения других возможных ошибок можно использовать в качестве диапазонов целые столбцы, так как на результат данная ошибка в нашем конкретном случае не влияет. Для появления в бланке накладной единиц измерения создается аналогичная формула, только в качестве вектора результата ( третий аргумент функции) выбирается диапазон с именем Ед_изм. (Для цены соответственно Цена). Итак, в ячейках F14 и J14 должны быть формулы: =ПРОСМОТР(A14;Код_т;Ед_изм) =ПРОСМОТР(A14;Код_т;Цена)
Нужное количество отпущенного товара вносится « вручную», а для Суммы надо ввести обычную формулу: =I14*J14
Теперь можно обычным способом скопировать полученные формулы на 9 строк вниз. Выделяем диапазон В14:L14, в котором находятся формулы. Для этого надо встать в ячейку В14 и, нажав левую кнопку мыши, протянуть мышку вправо до последней формулы. В правом нижнем углу выделенного диапазона можно заметить маленький квадратик, который называют маркером заполнения. Подведя курсор мыши к маркеру заполнения (при этом курсор должен изменить свой вид на тонкий плюс – «+»), надо нажать левую кнопку мыши и, не отпуская ее, протащить вниз. Если в столбце А нет данных, то в скопированных формулах появится « #н/д ». Подставив любой из имеющихся кодов товара, мы сразу получим в формулах необходимые результаты. Однако не всегда таблица будет заполнена
43
полностью, и появление в строках, где код не задан, этой ошибки может помешать при попытке подвести итог в поле Сумма. Обезопасим себя путем усложнения формул. Сначала определимся, что мы хотим получить. Нам надо, чтобы в тех случаях, когда в столбце А нет кода товара, формула не выдавала результат. Нас вполне устроит, чтобы результатом было «пусто». («Пусто» – это информация, записанная с помощью двух двойных кавычек подряд без всякого пробела – ""). Таким образом, ЕСЛИ в ячейке столбца А ничего нет, т.е. «пусто», ТО и результат – тоже « пусто», а ИНАЧЕ – работает описанная выше функция ПРОСМОТР. Для реализации проверки этого условия и выбора того или иного результата воспользуемся функцией ЕСЛИ из категории Логические. Ее синтаксис: ЕСЛИ(Логическое_выражение; Значение_если_истина; Значение_если_ложь)
Первый аргумент функции (Логическое выражение) в нашем случае можно записать так: a15="" ,
т.е. ячейка А15 проверяется на отсутствие информации. Если в этой ячейке ничего нет, то результатом логического выражения будет ИСТИНА, в противном случае – ЛОЖЬ. В зависимости от результата логического выражения функция ЕСЛИ возвращает либо второй аргумент, либо третий свой аргумент. 2.1.3.2. Использование вложенных функций Для изменения написанной нами ранее формулы щелкнем по ячейке В15. В Строке формул отобразится прежняя формула. Надо установить курсор мыши между знаком « = » и словом ПРОСМОТР и впечатать следующий текст: ЕСЛИ(а15="";"";
Далее ( третьим аргументом) будет идти функция ПРОСМОТР. Но в конце согласно правилам следует поставить закрывающую круглую скобку. В итоге имеем: =ЕСЛИ(A15="";"";ПРОСМОТР(A15;Код_т;Наименование))
Такие функции принято называть вложенными, т.е. одна функция является аргументом другой. Если вы сразу предполагаете, что будете использовать вложенность функций, то построение формулы с помощью Мастера функций начните с внешней функции. В нашем случае это функция ЕСЛИ. Построим в ячейке F15, удалив из нее ранее созданную формулу, новую формулу, используя Мастер функций и принципы построения вложенных функций. Вызовем функцию ЕСЛИ, введем в поле Логическое_выражение : А15="" , в поле Значение_если_истина напечатаем : ""(пусто) . Третьим аргументом функции ЕСЛИ должна быть функция ПРОСМОТР. Ее можно вызвать с помощью поля
44
Функция, находящегося слева от Строки формул, щелкнув по раскрывающей стрелке (рис. 15).
Рис. 15. Построение вложенных функций
Если нужной функции в списке не окажется, выберите пункт Другие функции и выберите функцию ПРОСМОТР. Далее процедура уже знакома. Если возникнет необходимость вернуться к функции ЕСЛИ, надо щелкнуть по слову ЕСЛИ в Строке формул. Для редактирования ранее введенной формулы в диалоговом окне Мастера функций надо в Строке формул встать на функцию, которая подлежит изменению, и нажать кнопку Изменить формулу (рис. 16).
Рис. 16. Кнопка со знаком «=» слева от Строки формул – Изменить формулу
Щелкая в Строке формул то на одну функцию, то на другую, вы будете попадать в диалоговые окна каждой функции. Завершив ввод формулы в ячейке F15, построим по такому же принципу формулу в ячейке J15 и добавим проверку с помощью функции ЕСЛИ в ячейку К15. Выделим все формулы по строке 15 и скопируем их до конца табличной части накладной. Теперь все необходимые формулы введены. Можно вводить коды товара в ячейках столбца А, а в соответствии с ними из таблицы Товары будут выбираться наименование товара, единицы измерения, цена. Сумма также будет считаться с помощью формул, надо только ввести количество отпущенного товара. Этап автоматизации с помощью формул мы завершили.
45
Применение элемента управления Поле со списком Работая с таким бланком накладной, надо точно знать код товара или каждый раз возвращаться в Лист Товары, чтобы его посмотреть. Исключить возможные ошибки поможет Элемент управления Поле со списком. Проведем некоторую подготовительную работу. Добавим еще один Лист (Вставка / Лист) и назовем его Выбор. Здесь мы создадим столько элементов Поле со списком, сколько строк имеется в табличной части накладной (в нашем примере – 10). Для удобства выделим все четыре столбца с информацией на листе Товары (A – D) и назовем этот диапазон Список. Откроем панель Элементы управления (рис. 6) с помощью меню Вид / Панели инструментов и щелкнем по кнопке Поле со списком (рис. 17). Нарисуем этот элемент в нужном месте листа Выбор. Пока мы не щелкнули в другом месте
2.1.4.
Рис. 17. Кнопка Поле со списком
Рис. 18. Кнопка включения и отключения режима редактирования
Рис. 19. Кнопка Свойства
Рис. 20. Элемент управления Поле со списком
листа, этот элемент является активным ( или текущим) объектом. Автоматически его имя высвечивается в поле Имя, и данный элемент находится в режиме редактирования. Отключить этот режим можно с помощью кнопки Режим конструктора / Выход из режима конструктора (рис. 18). В режиме редактирования мы имеем возможность переопределить свойства объекта. Для этого надо открыть диалоговое окно Свойства (рис. 7), нажав одноименную кнопку (рис. 19) на Панели инструментов Элементы управления.
46
Таблица 7. Некоторые свойства элемента управления Поле со списком Название свойства Name
Действие
Значение свойства в данном примере Имя объекта (По умолчанию – Com- Товар1 (Имя можно оставить boBox1) по умолчанию) ListFillRange Диапазон, из которого выбирается Список информация для отображения в раскрывающемся списке ColumnCount Количество колонок, которое ото- 4 ( если для выбора товара бражается в раскрывающемся списке важна информация по цене и единицам измерений) 2 ( если два первых столбца однозначно определяют элемент списка) BoundColumn Номер колонки, из которой выбира- 1 (код товара). В других слуется результат чаях можно использовать 2 для записи в ячейку наименования товара ColumnWidths Ширина колонок в раскрывающемся 35 pt;85 pt;35 pt;45 pt списке LinkedCell Адрес ячейки для записи результата Накладная!А14 ListRows Количество строк в выпадающем спи- 8 (по умолчанию) ске. Если массив элементов списка больше, чем это число, то появляется полоса прокрутки ListWidth Ширина выпадающего списка 200 pt TextColumn Номер колонки, из которой берется 2 ( после выбора элемента значение для записи в Поле со спи- списка поле заполнится наском именованием товара) Text Значение, которое заполняет Поле со Заполняется автоматически списком после выбора элемента из списка Value Значение, которое записывается в Заполняется автоматически ячейку, указанную в свойстве LinkedCell Width Ширина элемента Поле со списком. Задается при вырисовывании Она может отличаться от ширины объекта, но значение может раскрывающегося списка быть изменено вводом в это свойство конкретного числа
Элемент Поле со списком дает возможность выбирать из предлагаемого списка какой-либо элемент и записывать результат в заданную ячейку. Нужный элемент Поле со списком (ComboBox) (когда их несколько) можно выбрать в верхнем поле диалогового окна Свойства. В нем отображается имя элемента и указывается, к какому классу относится этот объект. Наиболее необходимые свойства этого элемента (рис. 20) зададим в соответствии с табл. 7.
47
Чтобы не задавать заново свойства нового Элемента управления Поле со списком, скопируем данный объект с именем Товар1 и получим новый объект ComboBox1 почти с такими же свойствами. Отличие будет лишь в свойстве Top, т.к. новый элемент будет расположен вероятнее всего ниже прежнего, и в свойстве Left, если вы выберете месторасположение нового элемента значительно правее или левее первого. Нам следует изменить лишь свойство LinkedCell, а именно: задать адрес ячейки – Накладная!А15. Обращайте при этом особое внимание на правильное написание адреса: адрес ячейки ( буква столбца) обязательно вводится на английском языке. Накопируйте столько элементов Поле со списком, сколько строк в табличной части вашей накладной. Исправьте в каждом элементе свойство LinkedCell. После изменения всех свойств Элемента управления нажмите на кнопку выхода из режима конструктора. Щелкните по раскрывающей стрелке в Поле со списком и выберите любой элемент списка (рис. 20). Проверьте, правильно ли выбрался нужный товар в накладной. •
Подготовка документа к печати После выбора нужных товаров надо задать их количество. Если табличная часть бланка вашей накладной рассчитана на большое количество строк, а в конкретном случае заполнена лишь небольшая часть, пустые строки можно скрыть, щелкнув по заголовку строки правой кнопкой мыши и выбрав в контекстном меню опцию Скрыть. Чтобы эти строки снова открыть, надо выделить две строки, между которыми находятся скрытые строки, и выбрать в контекстном меню опцию Отобразить. Для печати накладной выделите область ячеек, начиная с ячейки В1. Проследите, чтобы в эту область попала вся накладная. В меню Файл выберите опцию Область печати / Задать. После этого в поле Имя появится имя Область_печати. В любой момент теперь, выбрав диапазон Область_печати в раскрывающемся списке поля Имя, можно напечатать заполненный бланк накладной с помощью меню Файл / Печать / Выделенный диапазон. Использование элемента управления Список для выбора группы товаров Предложенные способы автоматизации достаточно понятны обычному пользователю, и нет необходимости применять знания в программировании. Однако для каждого Элемента управления можно создать процедуру обработки, которая позволит расширить рамки возможных действий. Нередко можно встретить списки, позволяющие одновременно выбрать сразу несколько опций. Это можно реализовать, используя Элемент управления Список (ListBox), а точнее, его свойство – MultiSelect, от которого зависит множественный выбор. 2.1.5.
48
Поле со списком (ComboBox) этим свойством не обладает. Итак, на листе Выбор создадим Элемент управления Список (рис. 21), нажав кнопку Список на Па- Рис. 21. Кнопка Список нели инструментов Элементы управления. Зададим для элемента Список следующие свойства: Таблица 8. Name ListFillRange ColumnCount BoundColumn ColumnWidths Width
Некоторые свойства элемента управления Список Spisok Список 4 1 35 pt;95 pt;35 pt;45 pt 210
Перечисленные в табл. 8 свойства аналогичны свойствам элемента Поле со списком (см. табл. 7). Обратимся к одному из свойств Элемента управления Список – MultiSelect, от которого зависит множественный выбор. Это свойство может иметь одно из трех значений: 0 – fmMultiSelectSingle; 1 – fmMultiSelectMulti; 2 – fmMultiSelectExtended. Значение 0 – Single показывает, что из списка можно выбрать единственный элемент. Это значение устанавливается по умолчанию. Два других значе-
Рис. 22. Элемент Список с отмеченной группой товаров и кнопка «выбор»
49
ния устанавливают возможность множественного выбора, разница лишь в том, как выбираются элементы. При значении 1 – Multi щелчком мыши можно выбрать элемент или отменить выбор. Если для выбора используется клавиатура, то клавиши курсора позволяют перемещать фокус (рамку из пунктирной линии), а при нажатии клавиши пробела можно отмечать элемент или отменять выбор. Последнее значение свойства 2 – Extended – расширенный дает возможность быстро выбирать ряд значений. Работая с мышью, нужно щелкнуть по первому элементу группы, а затем, удерживая клавишу <Shift>, щелкнуть по последнему элементу в группе. Все элементы между первым и последним будут выбраны. Если нужно добавить или удалить отдельный элемент, то при щелчке по нему необходимо нажимать клавишу . На рис. 22 показана возможность множественного выбора в элементе Список. •
Получение значений при множественном выборе Элементы списка хранятся в строковом массиве в свойстве List. Cвойство List заполнено значениями из диапазона Список ( табл. 8), который указан в свойстве ListFillRange. При выборе нескольких элементов из Списка нужно иметь возможность получить все выбранные элементы. Иначе говоря, надо просмотреть весь список элементов и проверить, отмечен элемент списка или нет. При множественном выборе за отметку о выборе конкретного элемента списка отвечает свойство Selected. Это свойство представляет собой массив, в котором для каждой опции списка имеется соответствующий элемент. Значение свойства Selected для каждой опции списка равно либо True (если опция выбрана), либо False (если опция не выбрана). Кроме того, для перебора всех элементов списка нужно знать их общее количество. Эту информацию хранит свойство ListCount. Если в свойстве ListFillRange задан диапазон, состоящий из нескольких столбцов, то свойство List будет представлять собой двумерный массив, первым индексом которого будет номер элемента в списке, а второй индекс отождествляется с номером колонки заданного в свойстве ListFillRange диапазона. Напомним, что и в свойстве Selected, и в свойстве List значения индексов начинаются с нуля. Соответствие этих свойств можно представить в виде рисунка, (рис. 23). Каждая строка первой таблицы на рис. 23 представляет собой элемент списка. Если отмечены элементы с кодами 4, 6 и 8, то соответствующие им элементы массива Selected принимают значение True. Если в свойстве List выбрать значение элемента с индексами (8,1) и записать в какую-либо ячейку, то в этой ячейке окажется « Клей обойный», а при выборе List(5,3) этим значением будет число 288. Если второй индекс опустить, например, написать List(3), то результатом будет код товара – 3, т.е. информация из столбца 0, соответствую-
50
щая 4-му элементу списка. Здесь первым элементом списка является строка заголовков полей таблицы. Свойство ListFillRange
Свойство List
Selected
№ Наименование ма- Ед.из Цена п/п териала м. 1
Краска масляная
кг.
35
2
Нитроэмаль
кг.
42
3
Водоэмульс. краска кг.
25
4
Шпатлевка
кг.
32
5
Обои (Германия)
рулон
288
6
Обои (Италия)
рулон
275
7
Обои (Украина)
рулон
157
8
Клей обойный
кг.
18
0
(0,0)
(0,1)
(0,2)
(0,3)
1 2 3 4 5 6 7 8
(1,0) (2,0) (3,0) (4,0) (5,0) (6,0) (7,0) (8,0)
(1,1) (2,1) (3,1) (4,1) (5,1) (6,1) (7,1) (8,1)
(1,2) (2,2) (3,2) (4,2) (5,2) (6,2) (7,2) (8,2)
(1,3) (2,3) (3,3) (4,3) (5,3) (6,3) (7,3) (8,3)
Рис. 23. Графическое представление свойств
Пример, который рассматривался выше (в п.2.3.1), ограничивался 10 (или каким-либо конкретным значением) строк табличной части накладной. Снимем это ограничение. Так как при множественном выборе нам не обойтись без написания программного кода, мы попутно вставим в процедуру обработки множественного выбора блок операторов для увеличения табличной части накладной в зависимости от количества выбранных элементов. Запуск процедуры обработки предоставим командной кнопке « выбор» (рис. 22). Эту кнопку можно создать, нажав на Панели инструментов Элементы управления кнопку Кнопка
. Зададим для этой кнопки свойства Name и Caption – выбор. Совсем не обязательно придавать этим свойствам одно и то же значение. Важно, чтобы свойство Caption отражало действие, возложенное на кнопку, чтобы нажатие на кнопку было интуитивно понятно пользователю. В нашем случае нажатие на кнопку подтверждает выбор отмеченной группы товаров. В табличной части накладной оставим только первые две строчки, т.е. из бланка накладной (рис. 10) удалим строки с 16-й по 23-ю. Перед тем как приступить к созданию процедур обработки, определим и опишем для каждой процедуры спектр действий. Процедура 1:
1) Перед выбором элементов списка очистим весь список от пометок. 2) Отсортируем список по наименованию товара для удобства поиска. 3) Перейдем на лист Выбор для отбора товара.
51
Процедура 2:
Каждый элемент свойства Selected(i) проверяется на наличие отметки о том, что соответствующий ему элемент Списка выбран. 1) Если количество выбранных элементов > 2, необходимо для каждого следующего выбранного элемента вставить строку после строки 15 и скопировать формулы и форматы в добавленную строку из ячеек предыдущей строки. 2) Записать в ячейки столбцов B, F и J добавленной строки реквизиты товара. 3) Пересортировать список товаров по коду товара. 4) Перейти в лист Накладная для ввода количества товара и других недостающих данных. Для создания процедуры обработки события надо перейти в окно Редак-
Рис. 24. Редактор Visual Basic
тора Visual Basic ( рис. 24). Его можно открыть с помощью меню Сервис / Макрос / Редактор Visual Basic, а лучше в режиме редактирования щелкнуть дважды по элементу Список. После этого открывается окно Редактора Visual Basic и автоматически создается процедура « по умолчанию» для обработки данного элемента. Для элемента Список автоматически создается процедура для обработки события Click ( по одному нажатию кнопки мыши), а для элемента Поле со списком (ComboBox) – процедура для обработки события Change. Запуск первой процедуры свяжем с событием двойного нажатия кнопки мыши в области элемента Список, поэтому автоматически созданная процедура нам не подойдет. В окне кода программы (Code) имеются два поля со списком: Object и Procedure, где перечислены все объекты, относящиеся к данному листу, и, в зависимости от типа выбранного объекта, список возможных процедур обработки событий. Если в соответствии с примером вы поменяли свойство Name ( ListBox1) элемента Список на Spisok, то в списке объектов надо
52
выбрать это имя, а в окне справа щелкнуть по DblClick для построения процедуры обработки события двойного нажатия кнопки мыши. Заполнение тела процедуры начинаем с описания типов переменных. Будем использовать переменную numidx для хранения количества элементов списка объекта Spisok. Диапазон Список мы задали в качестве свойства ListFillRange, но этот диапазон имеет большое количество строк, так как задан до конца рабочего поля таблицы. Тип Integer для переменной использовать нельзя, так как количество элементов списка у нас явно больше 32 767, поэтому надо использовать тип Long (длинное целое):
Рис. 25. Интерактивная помощь Dim numidx As Long
При вводе конструкций, предусмотренных языком VBA, можно пользоваться подсказкой, как показано на рис. 25. Далее присваиваем переменной numidx значение свойства ListCount объекта Spisok: numidx = Spisok.ListCount
После этого в цикле каждому элементу массива Selected присвоим значение False, т.е. снимем все предыдущие отметки: For i = 0 To numidx - 1 Spisok.Selected(i) = False Next i
Рис. 26. Панель инструментов Остановить запись
Далее для сортировки товаров по наименованию ( для удобства поиска) необходимо перейти на лист Товары, щелкнуть мышью в области данных и произвести сортировку с помощью меню Данные / Сор-
53
тировка / Выбрать поле Наименование. Все эти действия необходимо представить в виде программного кода. Самый простой вариант – записать макрос. Для этого, находясь в листе Выбор, запустите макрос: Сервис / Макрос / Начать запись. В открывшемся окне можно задать свои параметры для макроса, а можно оставить все как есть и нажать кнопку ОК. Обратите внимание на появившуюся панель инструментов Остановить запись (рис. 26). Пока вы не нажмете на кнопку с синим квадратиком, все ваши действия будут фиксироваться и кодироваться в специальной программе, называемой макросом. Не нажмите по ошибке на кнопку Закрыть ( на крестик). Эта кнопка не остановит запись макроса, а только закроет панель инструментов, и вам придется останавливать макрос через меню. Если панель Остановить запись не появилась, то прекратить запись макроса можно через меню: Сервис / Макрос / Остановить запись. После того как запись макроса запущена, движения должны быть четкими и безошибочными: 4 щелкнем по ярлыку листа Товары; 4 щелкаем по любой ячейке в области данных, например по ячейке В3; 4 в меню Данные / Сортировка в поле Сортировать по следует выбрать Наименование материала и отметить переключатель По возрастанию и ОК; 4 теперь надо перейти на лист Выбор, щелкнув по его ярлыку; 4 нажать кнопку Остановить запись. Если при записи макроса вам придется двигаться с помощью полосы прокрутки, эти действия также запишутся в макросе. Избегайте лишних действий! Теперь надо скопировать программный код из макроса в процедуру обработки события DblClick. По меню Сервис / Макрос / Макросы можно попасть в диалоговое окно Макрос, в котором имеется список макросов, принадлежащих открытым книгам. Щелкните мышкой по записанному вами макросу и нажмите кнопку Изменить. Записанный макрос будет иметь вид: Sub Макрос1() ' ' Макрос1 Макрос ' Макрос записан 15.01.2004 (Автор) ' Sheets("Товары").Select Range("B3").Select Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom Sheets("Выбор").Select End Sub
Код макроса надо скопировать в процедуру Private Sub Spisok_DblClick.
54
Для того, чтобы скопированный код из макроса был безошибочным, надо уточнить, что выбираемый диапазон ( Range) находится на активном ( выбранном) листе (ActiveSheet). Первая процедура после добавления изменений в 8- ю и 9- ю строки кода принимает окончательный вид: Private Sub Spisok_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim numidx As Long numidx = Spisok.ListCount For i = 0 To numidx - 1 Spisok.Selected(i) = False Next i Sheets("Товары").Select ActiveSheet.Range("B3").Select Selection.Sort Key1:=ActiveSheet. Range("B2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom Sheets("Выбор").Select End Sub
Здесь более крупным шрифтом отмечены изменения, внесенные нами «вручную». Для второй процедуры сначала запишем два макроса. Перед записью первого макроса следует встать в любую ячейку листа Выбор и выполнить такие действия: 4 щелкнуть по ярлыку листа Накладная; 4 щелкнуть по ячейке А16; 4 в меню Вставка выбрать опцию Строки; 4 выделить диапазон ячеек В15:L15; 4 протянуть за маркер заполнения выделенный диапазон на одну строку вниз; 4 остановить запись макроса. После того как все выбранные элементы из Списка будут переписаны в накладную, надо вернуть сортировку товаров по полю кода товара, а после этого щелкнуть по ярлыку листа Накладная для просмотра результата. Эти действия надо записать во второй макрос. После создания вспомогательных макросов, переходим к созданию процедуры. Вторая процедура будет вызываться при нажатии кнопки « выбор», поэтому в режиме редактирования надо дважды щелкнуть по этой кнопке, после чего сформируется пустая процедура обработки события Click для кнопки выбор. В нее надо скопировать оба макроса и добавить еще несколько строк программного кода в соответствии с описанием процедуры, представленным выше.
55
Программный код процедуры: Private Sub выбор_Click() ‘Процедура обработки нажатия кнопки «выбор» Dim numidx As Long ‘Переменной присваивается тип «длинное целое» numidx = Spisok.ListCount ‘Количество элементов в списке записывается в ‘numidx J=0 ‘Организация счетчика количества строк табл.части накладной For i = 0 To numidx - 1 If Spisok.Selected(i) Then ‘Если элемент списка отмечен, то выполняется блок ‘ нижеследующих операторов. В противном случае ‘увеличивается счетчик цикла и проверяется сле‘дующий элемент If J > 1 Then ' Если отмеченных элементов в списке больше двух, то 'табличную часть накладной надо увеличивать для каждого ‘следующего элемента Sheets("Накладная").Select ‘Переход на лист Накладная ActiveSheet.Range("A" & (J + 14)).Select ‘Выделение ячеек А16, А17 и ‘ т.д. в цикле на листе Накладная Selection.EntireRow.Insert 'добавление строки ' Выделение ячеек, содержащих формулы и форматы: ActiveSheet.Range("B" & (J + 13) & ":L" & (J + 13)).Select ' Копирование с помощью маркера заполнения выделенных ячеек: Selection.AutoFill Destination:=ActiveSheet.Range("B" & (J + 13) _ & ":L" & (J + 14)), Type:=xlFillDefault End If ' Запись реквизитов товара в очередную строку листа Накладная: Sheets("Накладная").Range("b" & (J + 14)) = Spisok.List(i, 1) ‘Наименование Sheets("Накладная").Range("f" & (J + 14)) = Spisok.List(i, 2) ‘Ед.изм. Sheets("Накладная").Range("j" & (J + 14)) = Spisok.List(i, 3) ‘Цена J=J+1 ‘Увеличение номера строки таблицы End If Next I ‘Переход к проверке следующего элемента списка или конец цикла Sheets("Товары").Select ‘Активизация листа Товары ActiveSheet.Range("B3").Select ‘Переход в ячейку, содержащую данные ' Сортировка списка товаров по коду товара: Selection.Sort Key1:=ActiveSheet.Range("a2"), Order1:=xlAscending, _ Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom Sheets("Накладная").Select ‘Активизация листа Накладная End Sub
Итак, обе процедуры обработки сформированы. Если в списке будет выбрано больше двух элементов, то табличная часть увеличится и использовать « испорченный» бланк будет неудобно. Новую накладную желательно создавать при условии, что в табличной части бланка накладной всего две строки.
56
Чтобы не заниматься каждый раз удалением лишней информации, приведем бланк накладной к первоначальному виду, т.е. оставим две строки в табличной части. Сохраним файл как шаблон. Для этого в меню Файл надо выбрать опцию Сохранить как и в открывшемся диалоговом окне в поле Тип файла выбрать из предлагаемого списка Шаблон (*.xlt). При создании новой накладной надо обратиться к меню Файл / Создать и выбрать созданный шаблон. Сам шаблон будет оставаться неизменным, а на его основе каждый раз будет открываться новая книга. Если потребуется внести изменения в шаблон, его надо открыть как шаблон: Файл / Открыть, в диалоговом окне указать тип – шаблон и найти нужный шаблон. Элемент управления Список можно использовать и без применения программирования, задав все его свойства аналогично свойствам элемента Поле со списком и выбрав в свойстве MultiSelect значение 0 – fmMultiSelectSingle.
2.2. Преобразование суммы цифрами в сумму прописью Если в рассмотренной выше задаче добавить итог по полю Сумма и отвести место, в котором бы располагалась итоговая сумма прописью, возникает естественное желание освободить себя от написания суммы прописью, а возложить эту функцию на нашего старого и доброго помощника. В предыдущей главе при использовании элемента управления Список мы пошли по пути множественного выбора элементов из списка, а для реализации этого метода обойтись без программирования было невозможно. Для реализации преобразования суммы цифрами в сумму прописью также можно было написать небольшую процедуру на Visual Basic. Однако, проанализировав суть проблемы, нетрудно понять, что здесь вполне можно обойтись без написания программного кода, а применить только встроенные функции MS Excel. Решением этой проблемы и займемся в дальнейшем. 2.2.1.
Анализ проблемы и построение алгоритма
Каждое число можно разбить на триады, т.е. тройки цифр, относящихся к миллиардам, миллионам, тысячам и единицам числа: 121121121121 Миллиарды числа
Миллионы числа
Тысячи числа
Единицы числа
Если описать словами каждую триаду, то кроме тысяч все они описываются одинаково, так как миллиарды, миллионы и рубли – мужского рода, а только тысяча – женского рода.
57
В данной задаче мы коснемся преобразования чисел, меньших миллиарда, поскольку преобразование триады цифр, относящихся к миллиардам, аналогично преобразованию миллионов. Рассмотрим таблицу: Сумма цифрами
Сумма прописью
123’456’789 Сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять рублей 1’001’000 Один миллион одна тысяча рублей 14’101 Четырнадцать тысяч сто один рубль 125’122’122 Сто двадцать пять миллионов сто двадцать две тысячи сто двадцать два рубля 2’005’011 Два миллиона пять тысяч одиннадцать рублей
Проанализировав данную таблицу, можно сделать такие обобщения: • описание триады цифр, относящихся к миллионам и единицам рублей, ничем не отличается, так как слова миллион и рубль мужского рода; • числительные сотен и десятков любой триады числа также не отличаются между собой; • если последняя цифра триады больше четырех (или 0) или число десятков равно единице, то слова миллион, тысяча и рубль представляются как «миллионов», «тысяч», «рублей»; • склонение слов «миллион», «тысяча» и «рубль» зависит только от последней цифры триады, если число десятков в триаде не равно единице. Наиболее общее правило можно сформулировать так: если последние две цифры триады образуют число больше девятнадцати, то словесное описание такого двузначного числа подчиняется общему описанию чисел, а именно: оно складывается из описания десятков числа и единиц; числа меньше двадцати можно назвать уникальными, ибо каждое из них описывается вполне определенным числительным, отличным от других.
В числах могут отсутствовать сотни, десятки или единицы триад, поэтому их отсутствие восполним пробелом. Итак, задача состоит в том, чтобы разбить число на триады, а каждую триаду, в свою очередь, представить в виде отдельных цифр, т.е. определить число сотен, десятков и единиц. Затем каждую цифру представить в виде текстовой величины, т.е. описать соответствующим числительным.
58
Разбиение числа на отдельные составляющие Сначала число разбивается на триады, а затем по общему принципу во всех триадах выделяются сотни, десятки и единицы. Для осуществления данной процедуры создадим в MS Excel таблицу (рис. 27). В ячейку А2 будет вводиться любая сумма с копейками. Чтобы выделить целую часть числа, можно с помощью функции ОТБР из категории Математические отбросить копейки. Поэтому в ячейке В2 можно написать следующую формулу: 2.2.2.
=ОТБР(A2)
Для выделения копеек воспользуемся функцией ОСТАТ из той же категории. Для удобства ввода функции обратимся к Мастеру функций, который вызывается кнопкой Вставка функции на Панели инструментов Стандартная (рис. 12).
Рис. 27. Таблица для разбиения числа на отдельные цифры
На первом шаге Мастера функций выбираем категорию Математические и в этой категории из списка функций выбираем функцию ОСТАТ. Для правильного написания формул при ссылке на ячейку лучше щелкать указателем мыши по нужной ячейке, чем писать ее адрес, т.к. адрес ячейки пишется только английскими буквами, а такие буквы, как А,В,С,Е,Н, и некоторые дру-
59
гие имеют одинаковое написание с русскими буквами. При ручном вводе адреса ячейки можно легко допустить ошибку. Остатком от деления числа, находящегося в ячейке А2, на 1 ( единицу) будет дробная часть числа. На рис. 28 Мастер функций не дописал исходное
Рис. 28. Ввод функции ОСТАТ с помощью Мастера функций
число, но значение 0,12 выдает правильное. Данную формулу поместим во вспомогательную ячейку Е2. Умножив дробное число, относящееся к копейкам, на 100, мы получим число копеек. Чтобы это число было целым, округлим его с помощью функции ОКРУГЛ до целых. В ячейку Е6 поместим формулу: =ОКРУГЛ(E2*100;0) В некоторых ситуациях при делении числа на 1 возникает переполнение, поэтому лучше выделение копеек разбить на два этапа: • взять остаток от деления числа на 1000; •
взять остаток от деления предыдущего результата на 1, а затем умножить на 100 с округлением.
Теперь целую часть числа из ячейки В2 разобьем на триады. Чтобы выделить миллионы, разделим целую часть числа на миллион и отбросим дробную часть: =ОТБР(В2/1000000)
Эту формулу поместим в таблицу в ячейку В6. В ячейке D2 помещается формула для выделения шести последних цифр целой части: =ОСТАТ(B2;1000000)
Остаток от деления числа из ячейки В2 на миллион дает нам шесть последних цифр числа. Нетрудно догадаться, что для выделения трех последних цифр числа надо взять остаток от деления этого числа на 1000, а для выделения двух последних цифр в качестве делителя выступает число 100.
60
Рис. 29. Результат разбиения числа на триады
Поэтому в ячейку D6 поместим формулу: =ОСТАТ(D2;1000)
Чтобы выделить тысячи из шестизначного числа, находящегося в ячейке D2, надо разделить это число на тысячу и отбросить дробную часть, поэтому как нельзя лучше нам подойдет формула: =ОТБР(D2/1000)
Итак, на рис. 29 имеем промежуточный результат. Теперь, используя все те же функции ОТБР и ОСТАТ, разобьем каждую триаду из ячеек B6:D6 на составляющие. Для этого в ячейки В7:В10 введем следующие формулы: В7: В8: В9: В10:
=ОТБР(B6/100;0) =ОСТАТ(B6;100) =ОТБР(B8/10) =ОСТАТ(B8;10)
Выделяем сотни числа Выделяем две последние цифры из триады Выделяем десятки числа Выделяем единицы числа
Выделив диапазон ячеек В7:В10 и протянув за маркер заполнения, скопируем его вправо на два столбца. Если вы отформатировали уже таблицу, то такое копирование может испортить плоды вашего труда, поэтому лучше в этом случае воспользоваться следующим приемом. После выделения диапазона нажмите кнопку Копировать, выделите новый диапазон ячеек, куда будет производиться копирование ( в нашем случае
61
это диапазон C7:D10), а затем в меню Правка выберите опцию Специальная вставка и щелкните по переключателю Формулы. В ячейки Е9:Е10 вводятся формулы: =ОТБР(B6/10) =ОСТАТ(B6;10)
В итоге получим таблицу: Таблица с формулами выделения каждой цифры
Рубли и копейки цифрами Миллионы
Тысячи
Единицы
Сотни
123 1
456 4
789 7
Две последние цифры из триады Десятки Единицы
23 2 3
56 5 6
89 8 9
Копейки 12
1 2
Рис. 30. Разбиение числа на части
Словесное описание каждой цифры числа Для дальнейшей работы необходимо в ячейки А12:I31 ввести информацию, как показано на рис. 31. Для удобства копирования формул дадим имена диапазонам ячеек. 2.2.3.
Таблица 9. Имена диапазонов Диапазон A12:A16 A12:A21 A12:A31 B12:B31
Имя диапазона Массив_0_4 Массив_0_9 Массив_0_19 Рубли_прописью
С12:С31
Тысячи_прописью
D12:D21
Десятки
Е12:Е21
Сотни
F12:F16
Миллионы
G12:G16
Тысячи
Примечание Числа от 0 до 4 Числа от 0 до 9 Числа от 0 до 19 Числительные, описывающие единицы миллионов и единицы рублей Числительные, описывающие единицы тысяч (т.к. слово тысяча – женского рода, а миллион – мужского) Числительные, описывающие десятки любой триады числа Числительные, описывающие сотни любой триады числа Слово « миллион» в возможных сочетаниях со словами: один, два и т.д. Слово « тысяча» в возможных сочетаниях со словами: одна, две и т.д.
62
Окончание таблицы 9 Имя диапазона Диапазон Н12:Н16 Рубли I12:I16
Копейки
Примечание Слово « рубль» в возможных сочетаниях со словами: один, два и т.д. Слово « копейка» в возможных сочетаниях со словами: одна, две и т.д.
В ячейках с заливкой (см. рис. 31) для удобства написания формул надо ввести символ пробел или апостроф (‘).
Рис. 31. Дополнительная информация
Далее работа заключается в следующем: • для каждой цифры из диапазона B7:D10 надо подобрать соответствующее ей числительное из диапазона В12:Е31; • для триады цифр, относящихся к миллионам (если они вообще будут), подобрать слово « миллион» в соответствии с правилами русского языка из предлагаемых возможных вариантов, находящихся в диапазоне F12:F16; • аналогично предыдущему пункту подобрать соответствующие слова для тысяч, рублей, копеек. На рис. 32 заливкой отмечены ячейки для ввода формул, результатом которых будет пробел или апостроф (если число – 0) или числительное.
63
В ячейку F7 нам предстоит ввести формулу, которая в зависимости от цифры, находящейся в ячейке В7 ( число сотен миллионов), выдает соответствующее ей числительное. Для этого воспользуемся мастером функций и выберем из категории Ссылки и массивы функцию ПРОСМОТР, а точнее, ее первый вариант со списком аргументов: искомое_значение; вектор_просмотра; вектор_результата.
Искомое_значение – это та цифра, которая олицетворяет в настоящий момент сотни миллионов и находится она в ячейке В7, поэтому в качестве первого аргумента функции мы указываем именно эту ячейку. Вектор_просмотра – это тот диапазон, в котором ищется значение, указанное в первом аргументе, т.е. мы будем искать в указанном диапазоне цифру, которая находится в ячейке В7. Сотен может быть одна, а может быть и девять, а может и вообще не быть (т.е. – 0). Поэтому в качестве вектора просмотра разумно выбрать диапазон с именем Массив_0_9. Вектор_результата – это список всех числительных, которые описывают сотни, он так и называется в нашей задаче – Сотни. Вид формулы: =ПРОСМОТР(B7;Массив_0_9;Сотни)
Если в формуле используется Имя диапазона, то при копировании это Имя играет роль абсолютной ссылки и диапазон ячеек, названный этим именем, никак не изменяется. При копировании этой формулы вправо ( нам надо протянуть ее за маркер заполнения на два столбца вправо) изменения произойдут только в относительной ссылке на ячейку В7, а именно: в формуле Рис. 32. Диапазон ячеек, в которые будут вводиться формулы в ячейке G7 искомым значением ( первым аргументом) будет ячейка С7, а в формуле в ячейке Н7 – ссылка на ячейку D7. При этом два других аргумента не изменятся. Нас это вполне устраивает. Давайте сразу проверим, правильно ли работает наша формула? Для этого в ячейку А2 введем число 12 345 678. В этом числе нет сотен миллионов, поэтому вместо числительного в ячейке F7 отобразится не видимый нашему глазу пробел. Обратите внимание, что при вводе нового числа в ячейку А2 информация в ячейках G7 и H7 также изменилась.
64
Переходим к вводу формулы в ячейку F9. Сейчас полезно вернуться к началу главы и внимательно перечитать рассуждения о том, какие сходства и отличительные особенности таят в себе описания чисел числительными. Условимся, что если в триаде две последние цифры дают число <20, то словесное описание этой пары цифр отдадим ряду ячеек, описывающих последнюю цифру триады. В нашем случае это диапазон ячеек F10:H10. В то же время при выполнении этого условия ячейка, описывающая десятки числа, должна быть пуста. Поэтому, если в ячейке В9 будет 0 или 1, соответствующая ячейка F9 должна быть пустой. Именно поэтому напротив цифр 0 и 1 из столбца А в диапазоне Десятки мы предусмотрительно ввели пробелы. В таком случае формула для описания десятков мало чем отличается от описания сотен, поэтому формулу из ячейки F7 копируем в ячейку F9, заменяем диапазон Сотни на диапазон Десятки и после этого копируем исправленную формулу вправо на два столбца. И, наконец, переходим к описанию единиц триады или двух последних цифр триады в случае, когда количество десятков <2. Если число десятков больше или равно 2, в качестве искомого значения должна выступать ячейка В10, так как в этом случае словесное описание будет состоять из описания десятков числа и единиц. Десятки для этой ситуации будут уже описаны в ячейке F9, поэтому рассматриваться будут только «чистые» единицы числа. В противном случае, когда десятков меньше двух, в качестве искомого значения должны выступать две последние цифры триады, т.е. ячейка В8. Кроме этого, диапазон просмотра чисел не ограничивается цифрой 9, а распространяется до цифры 19. Вектором результата для триады миллионов и триады единиц числа будет диапазон Рубли_прописью (его можно было назвать Миллионы_и_Рубли_прописью, но это слишком длинно), а для триады тысяч – диапазон Тысячи_прописью. Ввод формулы в ячейку F10 несколько усложнится из-за необходимости выбора в качестве искомого значения ячейки В8 или ячейки В10 в зависимости от выполнения условия: Содержимое ячейки В9 <2 ?
Реализацию выбора осуществим с помощью функции ЕСЛИ. Ее синтаксис: =ЕСЛИ(логическое_выражение;значение_если_ИСТИНА;значение_если_ЛОЖЬ)
Логическое выражение – это такое выражение, которое дает результат ИСТИНА или ЛОЖЬ. В качестве логического выражения чаще всего используются выражения, составленные с помощью операторов сравнения: =; > ; < ; >= ; <= ; <> ( не равно). Например: В9<2
65
Если в ячейке В9 находится число 1, то результатом такого выражения будет ИСТИНА, а если в ячейке В9 будет число 2, то результат будет ЛОЖЬ, т.к. число 2 не меньше 2, а равно 2. Значение_если_ИСТИНА — это значение, которое возвращается, если лог_выражение равно ИСТИНА. Значение_если_ЛОЖЬ — это значение, которое возвращается, если лог_выражение равно ЛОЖЬ. В нашем случае функция ЕСЛИ будет выглядеть так: =ЕСЛИ(В9<2;В8;В10),
т.е. при выполнении условия ( число десятков – 0 или 1) выбирается содержимое ячейки В8 (две последние цифры триады с возможными значениями чисел от 0 до 19), а если логическое выражение дает ЛОЖЬ, то в результате выполнения этой функции выбирается содержимое ячейки В10 (последняя цифра триады от 0 до 9). А теперь приступим к построению формулы с вложенными функциями в ячейке F10. Основная функция – функция ПРОСМОТР. Опять воспользуемся Мастером функций и выберем эту знакомую нам функцию. Так как искомым значением в этом случае должно быть значение либо из ячейки В8, либо из ячейки В10, в поле Искомое_значение нам надо ввести функцию ЕСЛИ для возможности такого выбора. Воспользуемся полем Функция, которое в данном случае находится на месте поля Имя, т.е. слева от строки формул. В этом поле отображается функция, которая была использована последней. Щелкнем по стрелке справа от поля Функция и выберем из списка функцию ЕСЛИ. Если ее в списке нет, то надо выбрать пункт Другие функции и из категории Логические выбрать функцию ЕСЛИ. В открывшемся окне функции ЕСЛИ вводим ее аргументы: в поле Логическое_выражение – В9<2; в поле Значение_если_истина – В8; в поле Значение_если_ложь – В10. Не торопитесь нажать кнопку ОК! Пока мы находимся во вложенной функции, а нам надо вернуться в основную функцию ПРОСМОТР, ведь мы задали только первый ее аргумент. Посмотрите на Строку формул, и вы увидите там незаконченную функцию ПРОСМОТР: =ПРОСМОТР(ЕСЛИ(B9<2;B8;B10))
Для возврата в функцию ПРОСМОТР надо щелкнуть по слову «ПРОСМОТР» в Строке формул. Тогда мы перейдем в диалоговое окно построения функции ПРОСМОТР. Зададим два других аргумента этой функции выделением диапазонов Массив_0_19 и Рубли_прописью. После этого можно смело нажимать кнопку ОК. Скопируем формулу из ячейки F10 в ячейки G10 и H10.
66
Обратите внимание на то, что формула в ячейке Н10 нас вполне устраивает, а вот формула в ячейке G10 в некоторых случаях будет давать смешной результат. Например, если в ячейку А2 ввести число 121121, в ячейке H10 будет числительное один, что никак не сочетается со словом тысяча. Поэтому в ячейке Н10 в формуле надо заменить диапазон Рубли_прописью на Тысячи_прописью. А как быть с копейками? Как правило, копейки при описании суммы прописью вписываются в сумму двумя цифрами, например: 1000000,01 121,11
Один миллион рублей 01 копейка Сто двадцать один рубль 11 копеек
Поэтому в ячейке I10 мы должны получить две цифры. Это легко сделать, используя функцию СЦЕПИТЬ, которая «склеит» цифру десятков и цифру единиц копеек как две текстовые величины. И даже если в сумме будет 0 копеек, то этот ноль будет представлен двумя нолями: =СЦЕПИТЬ(E9;E10)
С цифрами разобрались, а вот как « приклеить» к числительным слова «миллион», «тысяча», «рубль», «копейка»? Эти слова только в сочетании с числами 1, 2, 3 и 4 имеют различное написание, например, одна тысяча, две тысячи и т.д., но после пяти они представляют одно и то же слово в родительном падеже множественного числа (например, тысяч). 101 121 11 125
Сто один рубль Сто двадцать один рубль Одиннадцать рублей Сто двадцать пять рублей
Из приведенной таблицы видно, что в первых трех случаях последняя цифра триады – единица, но в первых двух случаях она сочетается со словом рубль, а в последнем случае – со словом рублей. Определим следующее правило: если последняя цифра триады > 4 или число десятков равно 1, то выбираются слова: миллионов, тысяч, рублей, копеек; в противном случае (когда 0, 1, 2, 3 или 4) из диапазонов Миллионы, Тысячи, Рубли, Копейки будут выбираться соответствующие последней цифре триады слова. Но тут надо учесть еще один момент: если миллионов или тысяч в сумме цифрами вообще нет, то в сумме прописью слов «миллионов» или «тысяч» тоже не должно быть. Совсем другое дело с рублями. Слово « рублей» должно присутствовать обязательно, причем если в сумме цифрами нет ни одного руб-
67
ля, например, сумма 0,51, то в сумме прописью прописывается: Ноль рублей 51 копейка. Чтобы не ошибиться и наглядно представить все рассуждения, нарисуем блок-схему для ячейки со словом «миллионы» (F11): Да ЕСЛИ Число миллионов = 0, т.е. сод-е яч.В6=0
Ячейке F11 присваивается значение «пусто» ("")
Нет ЕСЛИ Послед. цифра > 4 ИЛИ Число десятков = 1
Да
В яч. F11 выбирается слово «миллионов» (из яч.F12)
Нет Ставится в соответствии с последней цифрой триады (яч.В10) слово из диапазона Миллионы и записывается в яч. F11
Рис. 33. Графическое представление формулы в ячейке F11
Теперь подробно опишем этот ветвистый путь. Встаем в ячейку F11. С помощью Мастера функций вызываем функцию ЕСЛИ. В поле Лог_выражение вводим выражение: В6=0. В поле Значение_если истина вводим две двойные кавычки. В поле Значение_если_ложь вводим вложенную функцию ЕСЛИ. Для вложенной функции ЕСЛИ задаем аргументы. В качестве первого аргумента надо ввести логическую функцию ИЛИ, аргументами которой будут выражения: В10>4; В9=1. Если хотя бы одно выражение из двух дает значение ИСТИНА, то результатом этой функции будет ИСТИНА. В качестве второго аргумента функции ЕСЛИ должна стоять ссылка на ячейку F12. Третьим аргументом функции ЕСЛИ будет функция ПРОСМОТР, аргументами которой будут: ссылка на ячейку В10; диапазон Массив_0_4;
68
диапазон Миллионы. В результате получим: =ЕСЛИ(B6=0;"";ЕСЛИ(ИЛИ(B10>4;B9=1);F12;ПРОСМОТР(B10;Массив_0_4;Миллионы)))
Скопируем эту формулу на три столбца вправо и изменим некоторые аргументы. В ячейке G11 заменим диапазон Миллионы на Тысячи. В ячейке Н11 заменим диапазон Миллионы на Рубли и в самой первой функции ЕСЛИ заменим в первом аргументе ячейку D6 на ячейку В2 ( целая часть числа), а во втором аргументе между двойными кавычками впишем фразу «Ноль рублей»: =ЕСЛИ(B2=0;"Ноль рублей";ЕСЛИ(ИЛИ(D10>4;D9=1);H12;ПРОСМОТР(D10;Массив_0_4;Рубли)))
В ячейке I11 заменим диапазон Миллионы на Копейки. И здесь не нужна проверка на равенство нулю копеек, потому что даже если их нет, мы запишем 00 копеек. Формула в этой ячейке должна иметь вид: =ЕСЛИ(ИЛИ(E10>4;E9=1);I12;ПРОСМОТР(E10;Массив_0_4;Копейки))
Осталось собрать все текстовые величины, разделив их пробелами и удалив лишние пробелы. Чтобы не нагромождать очень длинных формул, соберем все текстовые величины, относящиеся к миллионам, в ячейку F18: =СЖПРОБЕЛЫ(СЦЕПИТЬ(F7;" ";F9;" ";F10;" ";F11;" "))
Скопируем эту формулу до ячейки I18 и изменим последнюю формулу (в ячейке I18), удалив ссылки на ячейки I7 и I9 вместе с пробелами. Теперь в ячейке F20 соберем все текстовые величины из диапазона F18:I18: =СЖПРОБЕЛЫ(СЦЕПИТЬ(F18;" ";G18;" ";H18;" ";I18))
Все суммы прописью, как правило, начинаются с прописной буквы. Нам предстоит заменить первую букву в ячейке F20 на прописную. Специальной функции для этого нет: функция ПРОПНАЧ заменяет строчные буквы на прописные в каждом слове, а функция ПРОПИСН заменяет все строчные буквы на прописные. Поэтому нам надо разбить текстовую величину из ячейки F20 на две: выделить первую букву и все оставшиеся буквы без первой. Первую букву сделать прописной и «склеить» ее с оставшейся частью. Все формулы по порядку введем в ячейки F22:F26: F22: F23: F24: F25:
=ЛЕВСИМВ(F20) =ПРОПИСН(F22) =ДЛСТР(F20) =ПРАВСИМВ(F20;F24-1)
F26: =F23&F25
Выделение первой буквы Преобразование первой буквы в прописную Вычисление длины строки всей фразы Выделение правых символов из всей фразы без одного символа: F20 – исходная фраза; (F24-1) – количество выбираемых символов Объединение последовательностей символов с помощью знака амперсанта (конкатенация) в одну последовательность
69
Чтобы использовать описанное выше преобразование «суммы цифрами» в «сумму прописью», надо: • скопировать лист Сумма_прописью в файл, в котором понадобилось такое преобразование; • в ячейку А2 Листа Сумма_прописью ввести ссылку на ту ячейку, в которой находится «сумма цифрами». На рис. 34 это ячейка В1, поэтому в данном случае формула в ячейке А2 листа Сумма_прописью должна выглядеть так: =Лист1!B1
• в ячейку, в которую необходимо поместить результат – « сумму прописью», ввести ссылку на ячейку F26 листа Сумма_прописью: =Сумма_прописью!F26
Чтобы обезопасить лист Сумма_прописью от случайных изменений, выделите диапазон ячеек A1:I35 (можно и весь лист), с помощью меню Формат / Ячейки выберите вкладку Защита и установите для выделенных ячеек флажки Защищаемая ячейка и Скрыть формулы ( если вы не хотите, чтобы ваши формулы были видны). Для ячейки А2 наоборот снимите эти флажки. Чтобы защита сработала, надо в меню Сервис выбрать опцию Защита / Защитить лист, ввести пароль, если для вас важно скрыть информацию от других, и нажать кнопку ОК.
Рис. 34. Результат использования преобразования
70
ЗАКЛЮЧЕНИЕ Применение описанных способов автоматизации необычайно широко: везде, где есть необходимость выбора из базы данных то одних, то других данных в какой-либо документ. Например, выписка счетов-фактур, где кроме выбора отпускаемых товаров используется также выбор из базы данных покупателя (наименование организации и ее реквизиты) или составление сметы расходов на какой-либо вид оказываемой услуги. При работе с такими документами важно придерживаться некоторых принципов: • располагать каждую таблицу базы данных на отдельном листе книги; • располагать данные в самом начале листа и для заголовков отводить только одну строку; • при написании процедур вставлять комментарии. Если выбор элементов из базы данных производится по какому-либо принципу, например, надо распечатать список сотрудников конкретного подразделения или занимающих одинаковые должности, то для таких целей лучше использовать метод Слияние в приложении Microsoft Word, а базу данных можно расположить в книге приложения Microsoft Excel. Предложенные выше методы автоматизации помогут пользователю освободить себя от изнурительного впечатывания повторяющихся данных и позволят исключить возможные ошибки в данных.
71
Библиографический список 1. Visual Basic 5. Проектирование приложений для Windows 95 и Windows NT / М.Мак-Келви, Р.Мартинсон, Дж.Веб, Б.Ризельман. – СПб.: BHV, 1998. 2. Биллинг, В.А. VBA и Office 97. Офисное программирование / В.А.Биллинг, М.И.Дехтярь. – М.: Русская редакция, 1998. 3. Гарнаев, А. Использование MS Excel и VBA в экономике и финансах / А.Гарнаев. – СПб.: BHV, 1999. 4. Харитонова, И. Программирование в Access 2000: учеб. курс / И.Харитонова, Н.Вольман. – СПб.: ПИТЕР, 2003. 5. Ильина, О.П. Информационные технологии бухгалтерского учета / О.П.Ильина. – СПб.: Питер, 2001. 6. Информатика: учебник / Н.В.Макарова, Л.А.Матвеев, В.Л.Бройдо, Т.А.Гаврилова и др. – М.: Финансы и статистика, 2001.
72
Методы автоматизации при работе в MS Excel Методические указания Составитель Г.А.Синявская Редактор Л.Ф.Юринова Техн. редактор Н.М.Белохонова
Подписано в печать Формат 60х84/16 Усл. печ. л. 4,65. Уч.-изд. л. 3,46. Тираж 100 экз. Заказ Издательство ДВГТУ, 690950, Владивосток, Пушкинская, 10 Типография издательства ДВГТУ, 690950, Владивосток, Пушкинская, 10
73
74