Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Algoritmizatsia_i_programmirovanie_VBA_polnaya_...doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
12.34 Mб
Скачать
  1. Программирование на vba в microsoft office

4.1 Программирование на vba в Excel

Теоретические сведения

Язык VBA служит мощным инструментом для создания настраиваемых приложений, базирующихся на электронных таблицах и способных выполнять вычисления и форматирование результатов расчетов. При программировании на VBA в Excel следует знать, что Excel — это программа для работы с электронной таблицей, предназначенной для анализа и отображения данных. В Excel можно хранить числовые, текстовые данные, проводить вычисления с данными и создавать диаграммы, основанные на данных, реализовано большое количество специализированных функций для часто используемых вычислений, включая финансовые, статистические и научные. В первом приближении файл Excel можно представить себе как бухгалтерскую книгу, содержащую множество страниц, каждая из которых разграфлена на столбцы и строки.

Эта книга невероятно велика — на каждом листе содержится 1 048 576 строк и 16 384 столбца. Столбцы идентифицируются буквами: первые 26 — от А до Z, следующие 26 — от АА до AZ и так до XFD. Строки идентифицируются числами, начиная с единицы. Количество рабочих листов в книге ограничивается только доступной памятью.

На пересечении строк и столбцов находятся ячейки. Каждая ячейка может содержать число, текст или формулу. Именно возможность размещать в ячейках листа не только данные, но и формулы, составляет основу чрезвычайной эффективности приложения Excel. Формулы позволяют выполнять практически любые типы вычислений на основе данных, содержащихся в других ячейках того же рабочего листа или других рабочих листов той же или другой рабочей книги. Приложение Excel также предоставляет пользователю эффективные средства построения диаграмм для графического представления данных, которое выполняется множеством разнообразных способов. Когда данные на рабочем листе изменяются, результаты вычисления всех формул автоматически пересчитываются и изменяется вид уже созданных диаграмм.

Встроенные функции Excel можно использовать как непосредственно в этом приложении, так и вызывать из среды других программ Microsoft Office или иных приложений, поддерживающих язык VBA, применяя эти формулы как инструмент для численного анализа данных или построения диаграмм.

Объектная структура Excel: в VBA для каждого приложения Office 2007 определено множество объектов, организованных в иерархию, называемую объектной моделью приложения.

Поэтому, работая с языком VBA в среде Excel, для достижения успеха необходимо хорошо понимать, что такое объект, и четко представлять себе объектную модель этого приложения.

Итак, объекты в Excel, как и в других приложениях MS Office 2007, образуют единую иерархию объектов (рисунок 4.1). Как видите, на вершине этой иерархии находится объект Application (Приложение), который содержит все остальные объекты и отвечает за функционирование всей программы Excel в целом. Объект Application выступает хранилищем для свойств и методов, которые не подходят для включения в любой другой объект, но необходимы для программного управления Excel. Например, существуют свойства объекта Application, предназначенные для управления обновлением экрана и включения предупреждений. Существует метод объекта Application, пересчитывающий формулы в открытых книгах.

Рисунок 4.1 − Начальный фрагмент объектной модели приложения Microsoft Excel 2007. Темным выделены только объекты, а светлым — объекты и коллекции. Стрелки указывают на существование подчиненной подсхемы

Когда программа на языке VBA запущена в среде Excel, объект Application этого приложения автоматически становится доступным ей посредством ключевого слова Application.

Более того, объект Application принимается в любой VBA-программе в качестве неявной ссылки, используемой в любых объектных выражениях по умолчанию. Например, при записи Workbooks.Add предполагается вызов метода Add объекта Excel.Application.Workbooks.

Если доступ к приложению Excel осуществляется из среды другого приложения пакета Office, то следует явным образом создать экземпляр приложения Excel и получить ссылку на него для доступа к объекту Excel.Application. Например, чтобы запустить скрытую копию Excel, создать новую рабочую книгу и поместить значение 10 в ячейку А1 рабочего листа List1 из программы, функционирующей в среде любого другого приложения пакета Office, нужно использовать следующий фрагмент кода.

Dim PrExcel As Excel.Application

Set PrExcel = New Excel.Application 'Открытие скрытой копии Excel

PrExcel.Workbooks.Add 'Создание новой рабочей книги

PrExcel.Worksheets("List1").Cells(1,1)>Value=10

Следует отметить, что если приложение Excel запущено программно, в нем по умолчанию новая рабочая книга не открывается — её нужно создавать явным образом, если она требуется (как в приведенном выше фрагменте). Количество листов в новой рабочей книге определяется значением свойства Application.SheetsInNewWorkbook и равно 3 (по умолчанию).

Объект Application предоставляет множество ссылок, которые можно применять для обращения к активным объектам без указания явного имени. Это позволяет использовать в VBA-программе непосредственно те объекты, которые будут активны в момент выполнения ее процедур. Иначе говоря, эти свойства дают возможность создавать универсальный код, который будет работать с объектами одного и того же типа, даже имеющими разные имена. Следующие свойства объекта Application являются глобальными и позволяют ссылаться на активные объекты, которые могут оказаться полезными программисту:

ActiveCell (Активная ячейка) — это свойство содержит ссылку на ячейку активного листа, в которой расположен курсор;

ActiveChart (Активная диаграмма) — это свойство содержит ссылку на выделенную диаграмму из активной книги;

ActivePrinter (Активный принтер) — это свойство содержит ссылку на активный принтер;

ActiveSheet (Активный рабочий лист) — это свойство содержит ссылку на активный лист активной книги;

ActiveWindow (Активное окно) — это свойство содержит ссылку на активное окно Excel;

ActiveWorkbook (Активная рабочая книга) — это свойство содержит ссылку на активную рабочую книгу.

Помимо того, что объект Application имеет множество свойств и методов, предназначенных для установки общих параметров приложения Excel, он также имеет специальные методы, реализующие полезные встроенные функции рабочего листа, — например, вычисление числа π: Application.Pi ().

По умолчанию Excel отображает каждое изменение в рабочей книге, сделанное по ходу выполнения VBA-программы. Можно отключить подобное обновление экрана, что приведет к увеличению скорости работы многих VBA-приложений (свойство ScreenUpdating объекта Application). Для отключения обновления экрана нужно присвоить значение False.

Application.ScreenUpdating = False 

В этом случае изображение в окне приложения будет “заморожено” до установки свойства ScreenUpdating в значение True или до завершения работы процедуры и возврата управления пользовательскому интерфейсу Excel. Необходимо подчеркнуть, что в конце работы VBA-процедуры в свойство ScreenUpdating обязательно следует вновь поместить значение True, т.е. восстановить отображение изменений на экране, иначе пользователь просто не сможет увидеть полученный результат.

Хотя при обращении к свойству ScreenUpdating требуется явно указывать имя объекта Application, тем не менее в большинстве случаев к свойствам объекта Application можно обращаться напрямую. Например, свойство ActiveSheet объекта Application содержит ссылку на рабочий лист, активный в данный момент. Для обращения в программе к активному листу вместо записи Application.ActiveSheet можно использовать упрощенный вариант ActiveSheet.Большая часть действий, которые пользователь (или программа) выполняет в Excel, связана с объектом Range, представляющим выделенный диапазон ячеек (рисунок 4.2).

Рисунок 4.2 − Фрагмент структурной схемы объекта Range

Важнейший элемент объектной модели приложения Excel — объект Worksheet, представляющий один рабочий лист в файле. Каждый объект Worksheet является частью коллекции Worksheets, которая принадлежит объекту Workbook, представляющему файл рабочей книги Excel (в соответствии с рисунком 4.1). Поскольку в приложении Excel одновременно можно открыть несколько рабочих книг, существует также и коллекция Workbooks, содержащая по одному объекту Workbook на каждый открытый файл. Эта коллекция принадлежит объекту Application.

Хотя имя класса Range в объектной модели Excel соответствует имени одного из классов в приложении Word и общий смысл их достаточно схож — обрамление части документа, с которым проводится работа, все же имеются и заметные отличия. Так, в Excel диапазоном может выступать не только отдельная ячейка, но и двухмерный блок ячеек на рабочем листе или трехмерный блок ячеек, охватывающий несколько рабочих листов.

Ещё одной важной составной частью объектной модели Excel является объект Chart. Этот объект создается для каждой диаграммы в рабочей книге, и все они помещаются в коллекцию Charts. Каждому объекту Chart подчинено множество объектов, представляющих составные части диаграммы (рисунок 4.3).

Рисунок 4.3 − Фрагмент структурной схемы объекта Chart приложения Excel.

Объезды Chart представляют собственно диаграммы, обычно расположенные на отдельных рабочих листах. Если диаграмма внедрена на рабочий лист с данными, то представляющий ее объект Chart дополнительно помещается в объект ChartObject представляющий собой специальный контейнер. Сделать активной ту или иную рабочую книгу в окне приложения Excel можно с помощью объектов Window. Объекты Window являются членами коллекции Windows объекта Application. Ссылка на требуемое окно осуществляется указанием при обращении к коллекции Windows в качестве индекса имени файла, содержащего требуемую рабочую книгу, например Windows («Квартальный отчет . xls»). Если для одной рабочей книги открыто несколько окон, необходимо после имени рабочей книги через двоеточие указать номер окна.

Windows("Квартальный отчет.xls:2")

Объект Workbook

В иерархии Excel сразу после объекта Application следует объект Workbook — ра­бочая книга (в соответствии с рисунком 4.1). Каждый объект Workbook в приложении представляет один файл с расширением .XLSX (стандартная рабочая книга) или .XLSM (стандартная рабочая книга с макросами). Когда Excel открывается не из VBA-программы, а как самостоятель­ное приложение, в нем по умолчанию создается новая рабочая книга. При запуске Excel из среды VBA задача создания новых рабочих книг возлагается на программу.

Открытие и создание рабочих книг

Поскольку объекты рабочих книг Workbook входят в коллекцию Workbooks, для создания новой рабочей книги следует использовать метод Add коллекции Workbooks.

Workbooks.Add (шаблон)

Здесь аргумент шаблон представляет собой либо имя файла, который будет использован в качестве шаблона при создании новой рабочей книги, либо одну из предопределенных констант xlWBATemplate. (Полный перечень этих констант можно увидеть в Object Browser, поместив имя xlWBATemplate в поле поиска и щелкнув на кнопку «Найти».) Когда в качестве аргумента задается константа, в новой рабочей книге будет содержаться только один рабочий лист заданного типа.

Если аргумент Template опущен, создается новая рабочая книга, содержащая то количество рабочих листов, которое указано в свойстве SheetsInNewWorkbook объекта Application (по умолчанию — 3). Метод Add возвращает ссылку на новую рабочую книгу, которую можно сохранить в переменной соответствующего типа.

Dim Новая_книга As Excel.Workbook

Set Новая_книга = Workbooks.Add (шаблон)

Открыть рабочую книгу на диске можно с помощью метода Open коллекции Workbooks. Синтаксис вызова этого метода следующий.

Workbooks.Open (Имя_файла)

Здесь обязательный аргумент «Имя_файла» задает путь и имя открываемого файла. Запись этого метода в программном коде может выглядеть следующим образом.

Set Workbookl = Workbooks.Open (FileName:="C:\Data\SalesData1.xls")

Следует также отметить, что возвращаемое значение метода Open можно непосредственно применить для создания объектной переменной с целью обращения к открытой книге в дальнейшем. Метод Open также имеет несколько дополнительных аргументов, сведения о которых при необходимости можно найти в справочной системе приложения Excel.

Сохранение и закрытие рабочих книг

Для сохранения рабочей книги, которой уже было присвоено имя, используется метод Save объекта Workbook.

Этот метод не имеет аргументов. Для первого сохранения новой рабочей книги с присвоением ей имени или для сохранения уже именованной книги под другим именем используется метод SaveAs. Синтаксис его следующий.

Новая_книга.SaveAs (Имя_файла)

Здесь аргумент Имя_файла определяет новое имя файла, включая его путь. Метод SaveAs также имеет несколько необязательных дополнительных аргументов, которые подробно описаны в справочной системе. Чтобы сохранить копию рабочей книги под другим именем, не изменяя при этом имени текущей книги, нужно использовать метод SaveCopyAs.

Новая_книга.SaveCopyAs (Имя_файла)

Перед тем как рабочая книга будет сохранена и ей будет присвоено имя, в свойстве Name объекта Workbook будет содержаться имя, присвоенное ей по умолчанию приложением Excel (Book1, Book2 и т.п.). После того как рабочей книге будет назначено новое имя, оно также будет помещено в свойство Name. Рассмотрим пример добавления книги и сохранения активной книги в рабочем файле.

Application.Workbooks.Add

Call ActiveWorkbook.SaveAs("temp.xls")

В результате работы этого кода создается новый объект Workbook. Ссылка на созданный объект не сохраняется.

Вместо этого для взаимодействия с объектом используется свойство Application.ActiveWorkbook. Однако существуют и другие способы обращения к коллекции для получения конкретного экземпляра класса Workbook или сохранения ссылки на созданный объект.

Ниже приведены примеры реализации этих способов (любая из этих ссылок может использоваться при вызове метода SaveAs).

' Сохранение копии, полученной по номеру из коллекции Workbooks

Application.Workbooks.Add

Call Application.ActiveWorkbook.SaveAs("temp1.xls")

Application.Workbooks("temp1.xls)".SaveAs("copy of temp1.xls")

' Использование сохраненной ссылки на добавленный объект

Dim As Workbook

Set W = Workbooks.Add

Call W.SaveAs("temp1.xls)"

В первом примере показано, как создавать новую книгу и сохранять ее, получая ссылку через свойство ActiveWorkbook. После этого ссылка на книгу извлекается из коллекции по имени книги, и с помощью полученной ссылки создается резервная копия. Во втором примере показано, как сохранять ссылку на созданный экземпляр класса Workbook в объектной переменной и вызывать метод SaveAs этого экземпляра. Обе операции приводят к одному и тому же результату. Важно обратить внимание на то, что существует различие между операциями над объектом коллекции Workbooks и отдельным объектом Workbook. Можно заметить, что в приведенных выше примерах (как в первом, так и во втором) используется метод Add коллекции Workbooks и метод SaveAs отдельного объекта Workbook. Следовательно, можно сказать, что коллекция поддерживает метод Add и обращение к элементам коллекции, а объект Workbook поддерживает метод SaveAs.

Значение свойства Name объекта Workbook нельзя изменить напрямую. Это можно сделать только с помощью метода SaveAs. Объект Workbook содержит еще два свойства, которые также связаны с его именем. Как только рабочая книга будет сохранена, свойство FullName будет содержать полное имя файла (вместе с путем), а свойство Path — только путь. Для закрытия рабочей книги используется метод Close объекта Workbook.

Новая_книга.Close (SaveChanges, FileName, RouteWorkbook)

Здесь все три аргумента необязательны.

■ Аргумент SaveChanges задает вариант действий для случая, когда рабочая книга содержит несохраненные изменения. Возможные значения: True (для сохранения изменений) и False (для игнорирования изменений). Если этот аргумент опущен, пользователю будет предложено сохранить изменения.

■ Аргумент Fi1eName — это имя файла, в котором сохраняется рабочая книга. Если этот аргумент опущен, используется текущее имя. Если такового не существует, пользователю будет предложено его ввести. 

■ Аргумент RouteWorkbook относится только к тем рабочим книгам, которые имеют список распространения (routing slip) и еще не были распространены. Устанавливается значение True, если требуется отправить рабочую книгу следующему получателю, в противном случае устанавливается False. Если этот аргумент опущен, пользователю выводится соответствующий запрос.

Рассмотрим пример использования метода Close объекта Workbook.

Sub CloseWorkbook()

Dim Workbook1 As Workbook

Set Workbook1 = Workbooks.Open(Filename:=ThisWorkbook.Path&"\Temp.xls")

Range("A1").Value = Format(Date, "ddd mmm dd, yyyy")

Range("A1").EntireColumn.AutoFit

Workbookl.Close SaveChanges:=True

EndSub

Иногда возникает необходимость оставить измененную книгу открытой для просмотра, не сохранять внесенные изменения и не получать запросов на сохранение при закрытии книги. Для этого нужно установить свойство Saved объекта книги в значение True. Excel посчитает, что книга не содержит изменений, которые необходимо сохранять. Однако перед использованием следующей строки в своей программе еще раз все взвесьте и удостоверьтесь, что это действительно то, что нужно.

ActiveWorkbook.Saved = True

Вывод на печать содержимого рабочей книги

Большинство рабочих листов, создаваемых в Excel, сразу же проектируется для последующей печати в виде отчета. Выводить документы Excel на печать очень просто, поскольку приложение осуществляет полное управление печатью рабочих книг. С помощью метода Printout, предназначенного для вывода рабочей книги на печать, доступны следующие объекты и коллекции:

Chart (диаграмма);

Charts (коллекция диаграмм);

Range (диапазон);

Sheets (коллекция таблиц);

Window (окно);

Workbook(рабочая книга);

Worksheet (рабочий лист);

Worksheets (коллекция рабочих листов).

Синтаксис метода PrintOut следующий.

Object.Printout

(From, То, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName)

Здесь все аргументы необязательны. Если метод PrintOut вызывается без аргументов, он печатает одну копию всего содержимого заданного объекта на принтере, который используется по умолчанию. Необязательные аргументы имеют следующие значения.

■ Аргументы From и То задают первую и последнюю страницы для печати. Значением по умолчанию являются первая и последняя страницы объекта.

■ Аргумент Copies задает количество печатаемых копий. По умолчанию печатается одна копия.

■ Аргумент Preview может принимать значения True или False, в зависимости от того, требуется ли при печати открывать окно предварительного просмотра. Значение по умолчанию — False.

■ Аргумент ActivePrinter задает имя используемого принтера. Если этот аргумент опущен, выбирается тот принтер, который задан в Windows для использования по умолчанию.

■ Аргумент PrintToFile принимает значения True или False, в зависимости от того, следует ли вместо устройства печати перенаправить вывод в файл. Значение по умолчанию — False.

■ Аргумент Collate принимает значения True или False, в зависимости от того, следует ли разложить страницы по копиям при печати. Значение, принятое по умолчанию, — True.

■ Аргумент PrToFileName задает имя файла, в который будет направлен вывод, если аргумент PrintToFile имеет значение True. Если этот параметр опущен, у пользователя запрашивается имя файла.

Объект Worksheet

Большая часть работы, которая выполняется программами в среде Excel, связана непосредственно с рабочими листами, представленными объектами Worksheet в коллекции Worksheets. Как уже упоминалось выше, в иерархии объектов Excel класс объектов Worksheet следует непосредственно после объекта Workbook, который является родительским для коллекции Worksheets (в соответствии с рисунком 4.1).

Для доступа к объектам Worksheet коллекции Worksheets можно воспользоваться свойством Item. В качестве параметра свойства Item используется имя листа или номер, описывающий положение листа в коллекции (нумерация выполняется слева направо). Объект Worksheet предоставляет доступ ко всем атрибутам листа в Excel. Это касается как форматирования листа, так и других его свойств. Кроме того, объект Worksheet предоставляет события, которые могут обрабатываться программно. Для добавления нового рабочего листа в коллекцию Worksheets используется ее метод Add.

Dim Новый_лист As Excel.Worksheet

Set Новый_лист = Worksheets.Add (Before, After, Count)

Здесь все аргументы являются необязательными, и если они опущены, то сразу после активного создается один рабочий лист. Аргументы Before и After используются для указания уже существующего рабочего листа, до (или после) которого следует вставить новый рабочий лист. Для того чтобы добавить еще несколько рабочих листов, необходимое их количество задается в аргументе Count. Если этот аргумент больше единицы, метод Add возвращает ссылку на последний из добавленных рабочих листов. Полезно сразу же после создания назначить новым рабочим листам имена, чтобы впоследствии по этим именам можно было обращаться к листам в программе.

Новый_лист.Nаmе="Объемы_продаж"

К листу можно обращаться как по имени, так и по порядковому номеру в коллекции Worksheets. Если известно имя листа, то его можно использовать для выбора листа из коллекции Worksheets. Если необходимо отобразить все элементы коллекции Work-sheets, например, в цикле For...Next, на каждый лист можно ссылаться по порядковому номеру. В приделах книги на лист Sheet 1 можно ссылаться с помощью следующих конструкций.

ActiveWorkbook.Worksheets("Лист1")

ActiveWorkbook.Worksheets(1)

Для удаления рабочего листа используется метод Delete объекта Worksheet.

ActiveWorkbook.Worksheets(Имя_листа) .Delete

Здесь аргумент Имя_листа — это имя удаляемого рабочего листа. Обычно, когда пользователь делает попытку удалить рабочий лист в окне программы, Excel автоматически выводит окно запроса для подтверждения операции удаления. Для того чтобы при удалении листа из программы этот запрос не выводился, необходимо присвоить свойству DisplayAlerts объекта Application значение False. Однако, после того как ненужный или временно используемый в программе рабочий лист будет удален, обязательно вновь поместите в это свойство значение True.

Application.DisplayAlerts = False

ActiveWorkbook.Worksheets("Объемы_продаж ").Delete

Application.DisplayAlerts = True

Копирование и перемещение рабочих листов

Методы Сору и Move объекта Worksheet позволяют копировать и перемещать один или несколько листов в результате выполнения одной операции. Копировать и перемещать рабочие листы можно как в пределах одной рабочей книги, так и между несколькими книгами. Чтобы копировать рабочий лист в пределах одной рабочей книги или в другую книгу, используется следующий синтаксис.

Лист.Copy(Before, After)

Здесь параметр Лист задает ссылку на копируемый рабочий лист. Если нужно скопировать рабочий лист в ту же рабочую книгу, используются аргументы Before или After для указания того уже существующего рабочего листа, до (или после) которого требуется поместить копию данного.

Если эти аргументы опущены, рабочие листы копируются в новую книгу. Например, рабочий лист Объемы продаж копируется в последнюю позицию текущей рабочей книги.

Worksheets("Объемы_продаж ").Сору

After:=Worksheets(Worksheets.Count)

Для перемещения рабочего листа нужно использовать метод Move. Его синтаксис такой же, как и метода Сору. Например, для перемещения рабочего листа Объемы_продаж в позицию непосредственно перед рабочим листом с именем Проекты нужно выполнить следующее.

Worksheets("Объемы_продаж ").Move Before:="Проекты"

Следует отметить, что оба метода не возвращают значение или ссылку, поэтому для создания объектной переменной, которая ссылается на перемещенный или скопированный лист, придется воспользоваться другими методами. Обычно это не проблема, так как первый лист, полученный в результате работы метода Сору, или первый лист, полученный в результате перемещения группы листов, становится активным сразу после завершения операции.

Объект Range

Объект Range является одним из ключевых объектов VBA и в иерархии Excel следует сразу после объекта Worksheet.

В Excel объект Range (в соответствии с рисунком 4.2) может представлять одну ячейку, целую строку или столбец рабочего листа и даже произвольный двух- или трехмерный блок ячеек рабочей книги. VBA-программа может ссылаться на любое необходимое ей количество объектов Range, и доступные для программы элементы рабочей книги не ограничиваются выделением, выполненным пользователем в данный момент. Иначе говоря, для воздействия программы на какую-либо область рабочей книги ее не требуется вручную выделять на экране.

Объект Range является свойством объекта Worksheet и представляет собой средство обращения к некоторому диапазону ячеек. Диапазон определяется указанием адресов первой и последней входящих в него ячеек. Использование объекта Range позволяет создавать более эффективный код за счет упрощенного способа обращения к требуемым элементам рабочих листов Excel.

Определение объекта Range

В Excel доступно несколько способов идентификации диапазона (из одной или нескольких ячеек), на который должен воздействовать программный код.

1. Стандартная ссылка на ячейку. Так называемый А1-стиль ссылки на ячейку является, пожалуй, самым простым способом работы с объектами Range. Для определения диапазона необходимо заключить ссылку в кавычки и указать ее в скобках непосредственно после ключевого слова Range, как показано ниже.

ActiveSheet.Range("ВЗ")

Worksheets("Лист2").Range("М5:S20")

2. Именованные диапазоны. Если рабочий лист содержит именованные диапазоны, для обращения к подобным объектам Range их имена могут использоваться вместо указания конкретных ссылок. Для присвоения диапазону имени соответствующее значение должно быть помещено в свойство Name объекта Range.

Worksheets("Финансовыйотчёт").Range("АЗ:В4").Name = "Выплата_процентов"

Range("Выплата_процентов").Cells.Interior.Colorlndex = 8

3. Сокращенная запись. Поскольку объекты Range используются в программном коде очень часто, Excel позволяет опускать ключевое слово Range при указании диапазона в А1-стиле или при обращении к нему по имени. В этом случае ссылка на ячейки или имя диапазона заключается в квадратные скобки, как показано в приведенном ниже примере.

ActiveSheet [A1:Z26] ' Обращение к явно заданному диапазону ячеек

[Квартальный_отчет] ' Обращение к поименованному объекту Range

4. Свойство Cells объекта Worksheets. Этот способ особенно удобен при написании сложных VBA-программ, так как позволяет определять диапазон не путем явного указания фиксированных адресов ячеек, а посредством использования для его задания содержимого переменных. Основная идея состоит в подготовке числовых значений координат строк и столбцов требуемого диапазона, сохраняемых в переменных, имена которых и указываются при обращении к данному свойству. Подробнее об этом речь пойдет ниже, в разделе “Использование свойства Cells для определения диапазона” данной главы.

5. Свойство Selection. Когда программа должна работать с диапазоном, который в данный момент выделен пользователем в окне приложения, используется свойство Selection объектов Application или Window. Подробнее об этом речь пойдет ниже, в разделе “Работа с выделением” данной главы.

6. Свойство ActiveCell. Свойство ActiveCell (Активная ячейка) используется для доступа к диапазону, представляющему активную ячейку указанного окна. При опускании спецификатора объекта окна (что означает обращение к объекту Application) свойство ActiveCell ссылается на текущее активное окно.

Значение_ячейки = ActiveCell.Value ' Чтение значения ячейки

7. Свойства Rows или Columns объекта Worksheet.Доступ к диапазону, включающему всю строку или весь столбец, осуществляется с помощью свойств Rows и Columns объекта рабочего листа соответственно. В операторе указывается номер требуемого столбца или строки — нельзя адресовать столбец, указав его буквенное обозначение, отображаемое на экране в заголовке этого столбца. Так, в следующем примере определяется диапазон, включающий столбец G, т.е. седьмой столбец.

Workbooks("Отчет.xls").Worksheets("Своднаяведомость").Columns(7)

8. Именованные ссылки на объекты. Поскольку диапазон является объектом, в программе можно создать именованную объектную ссылку на него, после чего доступ к данному диапазону будет выполняться с помощью указания имени ссылки. Такой подход проще и надежнее, чем многократное указание требуемого диапазона. Ниже, после помещения ссылки на обрабатываемый диапазон в объектную переменную Диапазон1, ее значение используется для доступа к свойствам этого диапазона.

Dim Диапазон1 As Range

Set Диапазон1 = Worksheets ("Лист1") .Range ("В12 :В12")

К1 = Диапазон1.Value ' Выборка значения коэффициента

Поскольку непосредственно проверить работу приведенных выше фрагментов кода затруднительно, в листинге программы 4.1 приведен развёрнутый пример, в котором используются все приведенные выше варианты задания диапазона обрабатываемых ячеек. Для наглядности ячейкам в задаваемых диапазонах присваивается определённый цвет фона (свойство Cells.Interior.ColorIndex), а значение активной ячейки выводится в окне сообщений (рисунок 4.4).

Пример №1

Листинг программы 4.1

Пример использования различных способов задания диапазона обрабатываемых ячеек.

PublicSubProba () ' Изменение цвета фона указанной ячейки

Dim n As Integer ' Целое число

Dim a As Range ' Объектная переменная класса Range

' Стандартная ссылка на ячейкуцвет желтый

Worksheets("Лист1").Range("A2:B5").Cells.Interior.ColorIndex = 6

' Именованные диапазоныцвет голубой

Worksheets("Лист1").Range("B4:B9").Name = "Выплата_процентов"

Range("Выплата_процентов").Cells.Interior.ColorIndex = 8

' Сокращенная запись цвет бежевый и синий

ActiveSheet.(“С6:E8”).Cells.Interior.ColorIndex = 12

[Проценты].Cells.Interior.ColorIndex = 25

' Свойства Rows или Columns объекта Worksheet цвет бирюзовый

ActiveSheet.Columns (7).Cells.Interior.ColorIndex = 14

' Именованные ссылки на объектцвет фиолетовый

Set a = Worksheets("Лист1").Range("D10:H16")

a.Cells.Interior.ColorIndex = 21

' Свойство ActiveCell – отображение значения в активной ячейке E2

n = ActiveCell.Value ' Чтение значения активной ячейки

MsgBox n

End Sub

Рисунок 4.4 − Результат работы примеры из листинга программы 4.1

Использование свойства Cells для определения диапазона

При использовании в выражении без указания координат свойство Cells объекта Worksheets определяет диапазон, включающий все ячейки данного рабочего листа. Аналогично свойство Cells объекта Application содержит ссылку на все ячейки листа, активного в данный момент (в этом случае свойство Cells может использоваться само по себе, без указания в явном виде объекта Application, т.е. Application .Cells эквивалентно Cells).

Если обрабатывается диапазон, включающий лишь часть ячеек рабочего листа, при обращении к свойству Cells потребуется указать числовые координаты строк и столбцов (буквенное указание столбцов не допускается). В следующем примере определяется диапазон, включающий только ячейку Е3.

Worksheets("Предыдущий отчет") .Cells (3,5)

Обратите внимание на то, что в данном случае сначала указывается координата строки (3), а затем столбца (5) — прямо противоположно записи в А1-стиле. В приведенном выше примере второе значение в ссылке на ячейку равно 5, т.е. указывает на пятый столбец — Е. Следует отметить, что такая система записи довольно трудна для понимания и главное ее преимущество состоит в том, что обе координаты являются числами, а значит, их можно указывать как значения переменных. Использование переменных для хранения координат позволяет динамически, непосредственно при выполнении программы, определять, где находится требуемый диапазон, — на основе введенных пользователем данных, исходя из результатов вычислений и т.д. В приведенном ниже примере строка таблицы выбирается в зависимости от текущего месяца года.

Месяц = Month(Now ())

Показатель = Worksheets("Годовой отчет").Cells(Месяц, 8)

Для определения диапазона на неактивном листе необходимо совместно использовать свойства Range и Cells этого листа. Следующее выражение определяет диапазон E3:F4 на рабочем листе с именем «Лист2».

Worksheets("Лист2").Range(Worksheets("Лист2").Cells(3,5), -

Worksheets("Лист2").Cells(4,6))

Приведенный выше пример выглядит весьма громоздко, однако его можно упростить за счет использования оператора With, позволяющего избежать повторных ссылок на рабочий лист. В следующем примере к содержимому того же диапазона применяется полужирное форматирование.

With Worksheets ("Лист 2")

.Range(.Cells(3,5), .Cells (4,6)) .Font.Bold = True

EndWith

Обратите внимание: в данном случае наличие точки перед каждым обращением к свойству Cells является обязательным. Именно точка указывает на принадлежность свойства Cells тому рабочему листу, который выше в коде был задан оператором With. При отсутствии точки свойство Cells будет воспринято как принадлежащее активному листу, что приведет к возникновению конфликта при определении ссылки для свойства Range.

Для получения ссылки на конкретную ячейку в пределах текущего значения диапазона, заданного в объекте Range, можно воспользоваться свойством Item объекта Range и в качестве параметров передать относительные координаты строки и столбца. Параметр строки всегда является числовым. Параметр столбца может быть числовым или строковым (содержать букву столбца). Следующие строки кода возвращают ссылку на одну и ту же ячейку, расположенную на пересечении второй строки и второго столбца в пределах диапазона, определенного в данный момент в объекте Range на активном листе.

Cells.Item(2, 2)

Cells.Item(2, "В")

Свойство Item является принятым по умолчанию свойством объекта Range, поэтому обращение к свойству можно опустить.

Cells (2, 2)

Cells (2, "В")

Учтите, что в данном случае столбцы (и их буквы) отсчитываются от столбца начала диапазона, а не от начала рабочего листа. Чтобы было понятнее, в листинге программы 4.2 показан пример подобного обращения к ячейкам, а на рисунке 4.5 – вид рабочего листа после выполнения этого примера.

Пример №2

Листинг программы 4.2

Обращение к ячейкам в пределах диапазона, который задан объектом Range.

PublicSubProba1 () ' Изменение цвета заданной ячейки

Dim a AsRange ' Объектная переменная класса Range

' Определение именованного диапазона

Worksheets("Лист1").Range("D2:E14").Name = "Выплата_процентов"

' Обращение к ячейкам в пределах диапазона

[Выплата_процентов].Cells.Item(4, 4).Interior.ColorIndex = 6 ' Цвет жёлтый

Set a = [Выплата_процентов].Cells.Item(2, 2)' Использование переменной

a.Interior.ColorIndex = 4' Цвет зелёный

[Выплата_процентов].Cells.Item(3, "B").Interior.ColorIndex = 25 ' Цвет синий

End Sub

Рисунок 4.5 − Вид диапазона, заданного объектом Range (для наглядности выделен), после выполнения примера из листинга программы 4.2

Пример №3

Листинг программы 4.3

Циклический перебор строк и столбцов в пределах диапазона с использованием объекта Range.

PublicSubFillCells()

Dim j As Integer

DimiAsInteger

' Определение именованного диапазона

Worksheets("Лист1").Range("B3:G14").Name = "Диапазон"

For i = 1 To 10

For j = 1 To 5

[Диапазон].Cells(i, j).Value = i * j

Next j

Next i

End Sub

Рисунок 4.6 − Циклический перебор строк и столбцов в пределах диапазона, заданного объектом Range (для наглядности выделен)

Выполнение операций над диапазоном ячеек

С помощью свойств диапазона можно одним действием изменять характеристики всех ячеек, входящих в данный диапазон. Например, следующий оператор изменяет размер шрифта для всех ячеек указанного диапазона.

Worksheets("Лист1").Range("В12:Н13").Font.Size = 14

В подобных случаях полезно использовать конструкцию With (особенно если необходимо обратиться к нескольким свойствам или методам диапазона), как показано в листинге программы 4.4 (рисунок 4.7).

Пример №4

Листинг программы 4.4

Циклический перебор строк и столбцов в пределах диапазона с использованием объекта Range.

PublicSubFormatCells ()

Dim Диапазон1 As Range

Dim nmДиапазон1 As String

Set Диапазон1 = Worksheets("лист1").Range("B3:C11")

WithДиапазон1' Определённая ранее объектная ссылка

.Value = 20' Значение всех ячеек устанавливается равным 20

.Font.Name = "ArialCyr"' Используемый шрифт

.Font.Italic = True ' Начертание курсивное

.Name = "Базовая_таблица"' Присвоение имени диапазону

nmдиапазон1 = .Name ' Сохранение имени в переменной

EndWith

MsgBox (nmДиапазон1) ' Отображение значения переменной

EndSub

Рисунок 4.7 − Форматирование ячеек с помощью объекта Range

Работа с отдельными ячейками диапазона

Как было показано в предыдущем примере, с помощью одного оператора можно поместить одно и то же значение во все ячейки диапазона. Однако в Excel нет метода, позволяющего с помощью единственного оператора изменять текущие значения ячеек диапазона. Оператор, подобный приведенному ниже, в Excel является недопустимым.

Диапазон.Value = Диапазон.Value + 10

Вместо этого потребуется выполнить циклический перебор всех ячеек диапазона — например, с помощью цикла For Each. ..Next.

Этот цикл удобен тем, что при его использовании не требуется знание общего количества ячеек, входящих в диапазон. Вот правильный способ реализации требуемого действия.

ForEachaCellInДиапазон

aCell.Value = aCell.Value + 10

Next

Здесь переменная aCell должна быть объявлена с типом Range, а в качестве параметра Диапазон можно указать системный объект Selection (текущие выделенные ячейки на рабочем листе; подробнее ниже) либо желаемый диапазон ячеек, заданный с помощью объекта Range.

Часто перед тем, как принять решение о необходимости выполнения того или иного действия над отдельной ячейкой, требуется проверить ее содержимое. Например, в зависимости от текущего значения ячейки программа может принять решение отформатировать, изменить или же использовать ее значение для выполнения некоторых вычислений.

В подобных случаях также используется цикл For Each. ..Next (листинг программы 4.5).

Пример №5

Листинг программы 4.5

Форматирование ячеек диапазона в зависимости от текущего значения.

Public Sub AnalisCells ()

Dim I As Integer

Dim J As Integer

Dim aCell As Range

' Определение именованного диапазона

Worksheets("Лист1").Range("B3:G14").Name = "Диапазон"

' Заполнение ячеек произведением номера столбца и номера строки

For I = 1 To 10

For J = 1 To 5

[Диапазон].Cells(I, J).Value = I * J

NextJ

NextI

' Определение значения в ячейке и форматирование чисел

For Each aCell In Worksheets("Лист1").Range("A5:D14")

If Is Numeric(aCell) Then ' В ячейке числовое значение

Select Case aCell

Case 5 To 10' Подчеркнуть значение

aCell.Font.Underline = xlUnderlineStyleSingle

Case 10 To 20 ' Выделить значение курсивом

aCell.Font.Italic = True

CaseIs> 20 ' Выделить значение полужирным

aCell.Font.Bold = True

End Select

End If

Next

End Sub

Рисунок 4.8 − Форматирование ячеек в зависимости от их текущих значений в пределах диапазона, заданного объектом Range

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]