Содержание
- Application.Interactive property (Excel)
- Syntax
- Remarks
- Example
- Support and feedback
- VBA в Excel Объект Excel.Application, его свойства, методы и события
- 10.3 Свойства и методы объекта Application
Application.Interactive property (Excel)
True if Microsoft Excel is in interactive mode; this property is usually True. If you set this property to False, Excel blocks all input from the keyboard and mouse (except input to dialog boxes that are displayed by your code). Read/write Boolean.
Syntax
expression.Interactive
expression A variable that represents an Application object.
Blocking user input prevents the user from interfering with the macro as it moves or activates Excel objects.
This property is useful if you are using DDE or OLE Automation to communicate with Excel from another application.
If you set this property to False, don’t forget to set it back to True. Excel won’t automatically set this property back to True when your macro stops running.
Example
This example sets the Interactive property to False while it’s using DDE in Windows and then sets this property back to True when it’s finished. This prevents the user from interfering with the macro.
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Источник
VBA в Excel Объект Excel.Application, его свойства, методы и события
10.3 Свойства и методы объекта Application
Объект Excel.Application, свойства, методы и события
Многие свойства, методы и события объекта Excel.Application совпадают с аналогичными в Word.Application. Однако поскольку информация приводится здесь для справки для тех пользователей, которым трудно свободно читать по английски, здесь будут приведены наиболее часто используемые свойства и метода объекта Application в Excel, вне зависимости от того, встречались ли они нам в Word, или нет.
Вначале — о свойствах объекта Application:
- свойства Active… возвращают соответственно активную ячейку (ту, на которую указывает курсор ввода данных), активную диаграмму, активный лист, активную книгу, активное окно. Все эти свойства доступны только для чтения. Собственно говоря, использовать их для создания объектов совсем не обязательно — объекты ActiveCell, ActiveSheet и т.п. создаются автоматически во время работы приложения и доступны всегда. Немного отличается свойство ActivePrinter — оно позволяет не только вернуть, но и установить активный принтер.
- свойство AddIns возвращает одноименную коллекцию надстроек (объектов AddIn). В отличие от Word, где в большинстве случаев применение надстроек предназначено для профессиональных программистов, в Excel работа с этим объектом имеет практическое значение для многих пользователей. Вместе с Excel поставляется несколько очень полезных надстроек (на графическом экране в Excel они доступны через меню Сервис ->Надстройки), например, Мастер подстановок, Пакет анализа, Поиск решения и т.п. При помощи этой коллекции можно проверять, подключена ли пользователем нужная надстройка (если она нужна вашей программе) и в случае необходимости автоматически ее подключить.
- AutoRecover — возвращает одноименный объект, который позволяет определить параметры автосохранения Excel. Например, чтобы открытые документы Excel автосохранялись каждые 5 минут, можно использовать код
Время указывается в минутах, можно использовать значения в интервале от 1 до 120. На графическом экране тоже самое можно сделать при помощи меню Сервис -> Параметры -> вкладка Сохранение.
- свойство Calculation позволяет определить или узнать режим пересчета рабочей книги (по умолчанию — автоматически, можно также использовать ручной пересчет или полуавтоматический, когда автоматически пересчитывается все, кроме таблиц). Есть смысл отключать автоматический пересчет тогда, когда пересчет значений после каждого изменения ячейки занимает много времени и мешает вводу данных. То же самое на графическом экране можно настроить при помощи меню Сервис ->Параметры -> вкладка Вычисления (явно дать команду на пересчет можно клавишей ).
- свойство CalculationState позволяет проверять, занимается ли Excel пересчетом данных или пересчет уже завершен.
- Cells — одно из самых важных свойств объекта Application. Оно возвращает объект Range, представляющий все ячейки в активном листе активной книги. Поскольку свойство по умолчанию для объекта Range — это свойство Item, то обращение к ячейкам активного листа может выглядеть так:
В данном случае мы выделили полужирным ячейку на пересечении первой строки и второго столбца.
- Очень похоже действуют свойства Columns и Rows. Например, чтобы проделать подобную операцию с целым столбцом (вторым), можно использовать команду вида
а для строки (второй) можно воспользоваться очень похожей командой
Еще раз отметим, что свойства Cells, Columns и Rows возвращают вовсе не наборы объектов Cell, Column и Row, как считают многие пользователи, а наборы объектов Range. На использовании объекта Range построена в Excel почти вся работа с ячейками и их значениями. Ниже в этой главе объекту Range будет посвящен отдельный раздел.
- Cursor — это свойство позволяет поменять внешний вид указателя мыши в Excel (у объекта Application в Word этого свойства почему-то нет). Обычно перед выполнением длинной расчетной операции курсору придают вид песочных часов ( xlWait), а потом возвращают обратно. Автоматически по завершению работы макроса курсор не возвращается к нормальному виду — нужно предусмотреть соответствующий код.
- DataEntryMode — очень интересное свойство, которое может уберечь пользователя от множества ошибок. Оно позволяет перейти в режим ввода данных — data entry mode, когда пользователю разрешается только вводить данные в разблокированные ячейки выбранного диапазона. Всего в вашем распоряжении три варианта: xlOn — включить этот режим, xlStrict — включить плюс сделать так, чтобы пользователь не мог из него выйти при помощи клавиши , xlOff — режим отключить.
- свойства DecimalSeparator и ThousandsSeparator позволяют не полагаться на региональные настройки на компьютере пользователя, а явно назначить символы, которые будут отделять дробную часть от целой и тысячи друг от друга. При использовании этих свойств рекомендуется также отключить использование системных установок при помощи свойства UseSystemSeparators:
- свойство Dialogs возвращает одноименную коллекцию Dialog, которую можно использовать для отображения диалоговых окон Excel (их предусмотрено несколько сотен) и определять реакцию на действия в них пользователей. Фактически поднабором для этого объекта является объект FileDialog, представляющий окна, предназначенные только для работы с файлами (например, окно открытия файла). Работа с ними выглядит точно так же, как в Word.
- DisplayAlerts — свойство, про которое мы уже говорили в модуле про Word, но по причине его большой важности повторим еще раз. Это свойство позволяет отключить показ различных предупреждений, которые пользователю обычно в ходе работы приложения показывать не надо (например, подавить предупреждение при закрытии ненужного файла, в котором не были сохранены изменения).
- EnableEvents — возможность на время отключить события для объекта Application, так что они срабатывать не будут (обычно перед выполнением какого-то действия — открытия файла, сохранения и т.п.).
- ErrorCheckingOptions — возможность получить ссылку на одноименный объект, при помощи свойств которого можно настроить параметры автопроверки Excel (сообщать ли пользователю о синтаксически неверных формулах, ссылках на пустые ячейки и т.п.). По умолчанию большинство проверок включено, поэтому к этому объекту есть смысл обращаться только тогда, когда вы хотите их отменить.
- FileDialog — возможность обратиться к диалоговым окнам открытия и сохранения файлов (то же самое можно сделать при помощи более общего свойства Dialogs). Например, чтобы предоставить пользователю выбрать единственный файл в окне открытия (и получить полный путь к нему), можно воспользоваться кодом
Похожий пример с возможностью выбрать сразу несколько файлов приведен в справке по этому свойству.
- FileSearch — это свойство позволяет провести поиск по указанному вами каталогу и вывести результаты.
- Interactive — это свойство позволяет полностью заблокировать ввод в приложение Excel со стороны пользователя (как клавиатуру, так и мышь). Обычно используется, чтобы пользователь не смог помешать работе приложения, например, сбить выделение. Можно также использовать, если ввод пользователя производится из другого приложения, взаимодействующего с Excel.
- свойства International и LanguageSettings работают точно так же, как и в Word.
- свойство LibraryPath возвращает путь к каталогу, где лежат файлы надстроек Excel — XLA. По умолчанию — Office11Library.
- свойство MoveAfterReturn позволяет включить/отключить переход на следующую ячейку после завершения ввода данных и нажатия на (по умолчанию — включено), а свойство MoveAfterReturnDirection позволяет определить направление перехода. В некоторых ситуациях это может сильно упростить ввод данных пользователем. Например, чтобы переход происходил на ячейку справа, можно использовать команду
- свойство Names позволяет вернуть коллекцию Names, представляющую все именованные диапазоны в активной рабочей книге. При помощи метода Add() коллекции Names вы можете также сами определять в рабочей книге свои именованные диапазоны. На практике именованные диапазоны работают примерно так же, как закладки в Word — при помощи их очень удобно определять наборы данных в сложных таблицах Excel. На графическом экране в Excel определить именованные диапазоны можно при помощи меню Вставка ->Имя.
- свойства ODBCErrors и OLEDBErrors позволяют получать информацию о возникших ошибках при подключении к базам данных ODBC и OLEDB соответственно. Реально они возвращают одноименные коллекции, которые состоят из объектов ODBCError и OLEDBError соответственно, их которых и можно получить информацию об ошибке.
- OnWindow — это свойство больше похоже на событие. В качестве его значения указывается имя процедуры, которая должна находиться в модуле уровня книги (по умолчанию такой модуль не создается — его нужно создать вручную). Эта процедура будет вызываться всякий раз, когда пользователь переключился в окно Excel (не важно, какой книги и какого листа). Вместо этого свойства можно использовать макросы со специальными именами Auto_Activate и Auto_Deactivate (они будут срабатывать после выполнения процедуры, определенной в OnWindow).
- Range — очень важное свойство. Возвращает объект Range, который представляет собой диапазон ячеек и используется в Excel практически для любых операций с ячейками.
- ReferenceStyle — возможность переключить режим отображения ячеек между A1 (буквы — столбцы, цифры — строки) и R1C1 (когда и строки, и столбцы указываются цифрами). На графическом экране это можно сделать через меню Сервис ->Параметры -> вкладка Общие, флажок стиль ссылок R1C1. На практике пользователям ближе стиль вида A1, а программистам, конечно, R1C1 (особенно в тех ситуациях, когда столбцов очень много и приходится использовать столбцы AA, AB и т.п.). Во многих ситуациях удобно бывает перед выполнением какой-то программной операции вначале перевести режим отображения в R1C1, а после окончания на радость пользователям вернуть обратно. Можно этим и не заниматься, а использовать другие способы для отсчета определенного количества столбцов.
- Selection — как несложно догадаться, это свойство возвращает то, что в настоящий момент выбрал пользователь. Если он выбрал обычные ячейки в таблице, то вернется объект Range. Если же пользователь выбрал что-то на диаграмме, то может вернуться объект осей, легенды и т.п. — в зависимости от того, что было выбрано. В отличие от Word, объект Selection в Excel используется очень редко.
- Sheets — это свойство мы будем подробнее разбирать в разделе, посвященном книгам Excel. Оно возвращает коллекцию Sheets — набор листов книги (если вызывается для приложения, то для активной книги) и набор диаграмм, которые находятся на отдельных листах. Если используется свойство Worksheets, то вернется та же коллекция Sheets, но уже состоящая только из объектов Worksheet — обычных листов (без диаграмм).
- TemplatesPath — свойство для чтения, при помощи которого можно вернуть информацию о каталоге с шаблонами Excel (например, для размещения собственного шаблона или открытия шаблона из этого каталога). По умолчанию используется каталог Application DataMicrosoftTemplates в профиле пользователя.
- ThisCell и ThisWorkbook — очень удобные свойства, которые позволяют обращаться к текущей ячейке и текущей книге, не обременяя себя созданием объектных переменных. Эти объекты создавать не нужно — они и так изначально существуют в работающем Excel.
- Свойства Windows, Workbooks и Sheets возвращают, соответственно, все открытые окна, книги и листы Excel. Про объекты рабочей книги и листа мы будем говорить ниже.
- Свойство WorkSheetFunction позволяет использовать в программе на VBA функции Excel напрямую, без необходимости прописывать их в какую-либо ячейку.
Самые важные методы объекта Excel.Application перечислены ниже:
- ActivateMicrosoftApp() — специальный метод, который предназначен для запуска и активизации (или просто активизации, если приложение уже запущено) приложений Office (Word, Access, PowerPoint) и некоторых других (Project, FoxPro, Schedule Plus).
- AddCustomList() — возможность создать новый пользовательский список. В качестве параметра принимает либо объект Range (элементами списка станут те значения, которые есть в диапазоне), либо просто стандартный объект Array. Удалить можно при помощи метода DeleteCustomList().
- методы, которые начинаются на Calculate…, позволяют пересчитать значения в ячейках. Просто Calculate() — обычный пересчет значений (чаще всего нужен, если автопересчет отключен), CalculateFull() — пересчитать значения во всех открытых книга, CalculateFullRebuild() — еще и произвести перестроение формул (аналогично занесению всех формул заново). Остановить пересчет можно при помощи метода CheckAbort().
- ConvertFormula() — возможность преобразовать формулу двумя способами: либо перевести адресацию ячеек в другой режим (например, вместо A1 в R1C1), либо поменять абсолютные ссылки на относительные и наоборот. В качестве параметра принимает строковую переменную с текстом формулы (должна начинаться с символа =) и флаги конвертации.
- DoubleClick() — эквивалентно двойному щелчку мышью по активной ячейки, то есть переход в режим ввода данных в эту ячейку.
- Evaluate() — очень полезный и часто используемый метод. Позволяет по имени найти объект книги Excel и преобразовать его в объект или значения для дальнейшего использования. В качестве имен этот метод принимает:
- имена ячеек в стиле A1 (возвращается объект Cell)
- имена диапазонов (возвращается объект Range)
- имена, определенные в макросе (чаще всего — названия переменных)
- ссылки на внешние книги (например, Evaluate(«[Book1.xls]Sheet1!A5»))
Эту функцию можно вызвать и неявно — просто заключив имя объекта в квадратные скобки. Например, такие строки будут абсолютно одинаковыми по значению:
Поскольку синтаксис с квадратными скобками короче, чаще всего используется именно он.
Таким образом, метод Evaluate() — это самый простой и естественный метод обратиться к ячейке или диапазону в своей или чужой книге Excel.
- GetOpenFilename() — это упрощенный способ работы с окном открытия файлов. Самый простой способ открыть диалоговое окно Open и получить информацию о том, что выбрал пользователь (в виде строковой переменной с информацией о имени файла с полным путем), выглядит так:
If Filename <> False Then
- GetSaveAsFilename() — такой же по функциональности способ, который работает с окном Save As.
- GoTo() — важный и часто используемый метод. Принимает в качестве параметра объект Range, строку со ссылкой на ячейку (в формате R1C1) или имя процедуры VBA и выделяет и активизирует диапазон/ячейку или запускает на выполнение (если передается имя процедуры). В отличие от метода Select(), этот метод еще и автоматически активизирует лист, на котором расположен диапазон или ячейка.
- Help() — этот метод позволяет открыть и показать информацию из файла справки (в том числе пользовательского). В качестве параметра принимает имя файла справки и метку темы в нем.
- метод Intersect() возвращает диапазон, который представляет область пересечения двух других (или более) диапазонов. Если передаваемые в качестве параметров диапазоны не пересекаются, возвращается Nothing.
- OnKey() — этот метод позволяет «посадить» процедуру VBA на определенную клавиатурную комбинацию. Например, чтобы назначить процедуру Msg() из модуля Лист1 клавиатурной комбинации + , можно воспользоваться командой
- OnRepeat() — возможность назначить процедуру, которая будет выполняться при использовании команды Повторить в меню Правка. Назначение процедуры команде Отменить в том же меню производится при помощи метода OnUndo().
- RegisterXLL() — возможность подключить файл надстройки Excel с расширением XLL и зарегистрировать его функции и процедуры. Этот метод используется при установке собственного приложения.
- метод Repeat() позволяет просто повторить действие, которое было выполнено последним пользователем (не программным способом). Аналогично команде Повторить в меню Правка. Отменить действие пользователя можно при помощи метода Undo().
- метод Run() позволяет выполнить: процедуру или функцию VBA, макрос Excel или процедуру или функцию в модуле XLL (и передать ей до 30 параметров).
- метод SendKeys() позволяет эмулировать нажатия клавиш и передать их в активное окно приложения. Обычно используется, если нужно что-то продемонстрировать пользователю (в этом случае используются паузы) или нужно что-то сделать через меню (например, не удалось найти, как это можно сделать через код).
- Union() — это важный метод позволяет объединить два или более диапазонов.
- Volatile() — этот хитрый метод должен вызываться только из пользовательской функции, которая вычисляет значение ячейки. Если он вызван и ему передано значение True, то данная ячейка становится чувствительной (volatile) и она будет пересчитываться при любом изменении значений в листе, даже том, которое ее не касается.
- Wait() — это метод позволяет приостановить работу Excel на указанное вами время, сняв нагрузку с процессора. Используется для демонстраций — чтобы пользователь успел увидеть, что происходит, для ожидания завершения выполнения какой-либо внешней операции и т.п. При этом ввод пользователя блокируется, а указатель мыши приобретает вид песочных часов. Однако некоторые фоновые операции Excel, такие, как печать и пересчет значений, продолжают выполняться. Например, чтобы взять паузу на пять секунд, можно воспользоваться кодом
If Application.Wait(Now + TimeValue(«0:00:5»)) Then
MsgBox «Пять секунд прошло»
- Методы Quit(), OnTime(), FindFile() делают то же самое, что и в Word.
Источник
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Application.Interactive property (Excel) |
vbaxl10.chm133150 |
vbaxl10.chm133150 |
excel |
Excel.Application.Interactive |
fe69429e-8715-770c-3e7a-c06a10a8e850 |
04/05/2019 |
medium |
Application.Interactive property (Excel)
True if Microsoft Excel is in interactive mode; this property is usually True. If you set this property to False, Excel blocks all input from the keyboard and mouse (except input to dialog boxes that are displayed by your code). Read/write Boolean.
Syntax
expression.Interactive
expression A variable that represents an Application object.
Remarks
Blocking user input prevents the user from interfering with the macro as it moves or activates Excel objects.
This property is useful if you are using DDE or OLE Automation to communicate with Excel from another application.
If you set this property to False, don’t forget to set it back to True. Excel won’t automatically set this property back to True when your macro stops running.
Example
This example sets the Interactive property to False while it’s using DDE in Windows and then sets this property back to True when it’s finished. This prevents the user from interfering with the macro.
Application.Interactive = False Application.DisplayAlerts = False channelNumber = Application.DDEInitiate( _ app:="WinWord", _ topic:="C:WINWORDFORMLETR.DOC") Application.DDEExecute channelNumber, "[FILEPRINT]" Application.DDETerminate channelNumber Application.DisplayAlerts = True Application.Interactive = True
[!includeSupport and feedback]
ГЛАВА 1 1
11.1. Зачем программировать в Excel
Excel — это наиболее часто используемое с точки зрения программирования приложение Office. По моему опыту преподавания курсов по программированию в Office, в подавляющем большинстве случаев сотрудников предприятий интересует, как автоматизировать выполнение операций именно в Excel. Чаще всего на предприятиях встречаются следующие ситуации:
необходимо автоматизировать загрузку данных в таблицу Excel из базы данных, а затем в автоматическом режиме произвести обработку этой таблицы (расчеты, моделирование и т. п.) и представить эту информацию в стандартном виде. На практике, конечно, намного правильнее было бы перенести выполнение расчетов (группировку, вычисление итогов по группам и т. п.) на сервер баз данных, но обычно у пользователей для этого нет ни необходимых знаний, ни прав для работы с сервером баз данных. Поэтому Excel в таких ситуациях остается незаменимым средством;
вариант первой ситуации — приложение, работающее с базой данных, уже умеет генерировать отчеты в формате файлов Excel. Но со временем потребности в отчетах изменяются, появляется необходимость в новых отчетах или в изменении старых. Чаще всего в этом случае пользователи самостоятельно создают новые отчеты, используя данные из старых. Повторяющихся действий очень много, поэтому автоматизация таких операций бывает просто необходима;
очень часто пользователи, не имея возможности обратиться к профессиональным программистам, самостоятельно реализуют нужные им приложения в таблицах Excel. Во множестве организаций, например, финансовое планирование или составление смет ведется просто в виде множества
файлов Excel (часто связанных между собой). Excel выполняет и роль базы данных, и роль клиентского приложения, и генератора отчетов. В таких ситуациях, конечно, опять-таки вопросы автоматизации стоят очень остро;
формат файлов Excel удобен не только для вывода информации из базы данных, но и для загрузки введенной вручную информации в базу данных. Часто на предприятиях информация из филиалов, подразделений, от сотрудников и т. п. собирается в формате Excel. В результате со временем возникает вопрос — как автоматизировать процесс загрузки информации из Excel в базу данных;
по моему опыту, на предприятиях часто возникает потребность в синхронизации информации между файлами Excel и базами данных (или другими файлами Excel, или файлами DBF и т. п.). Например, нужно сделать так, чтобы при занесении пользователем информации в файл Excel она сразу же добавлялась в базу данных.
Приемы, необходимые для решения подобных задач, рассматриваются в данной главе. Надеемся, что после ее изучения у вас не возникнет проблем с тем, как их решать.
С программной точки зрения Excel, в отличие от Word, чаще всего используется не для вывода и редактирования данных, а для выполнения различных расчетов и отображения их в специальных форматах (график, сводная таблица и т. п.). Если же объем данных большой (например, нужно хранить информацию по заказчикам, договорам или поставкам, то имеет смысл подумать о связке Excel плюс база данных (такая связка может быть очень удобной и производительной).
По сравнению с программным перемещением по документам Word навигацию по книгам и листам Excel производить намного удобнее, поскольку у каждой ячейки есть свой адрес (и даже два адреса — в формате A1 и в формате R1C1). Кроме того, в Excel есть возможность присваивать имена диапазонам ячеек, что также очень удобно.
Иерархия стандартных объектов в Excel немного больше. Если в Word все построено вокруг трех объектов: Application — Document — Range, то в Excel появляется новый элемент — лист, поэтому главная его иерархия выглядит следующим образом: Application — Workbook (книга) — Worksheet (лист) —
Range (диапазон).
В Excel предусмотрена очень богатая библиотека встроенных функций (статистических, финансовых, математических и т. п.), которые можно использовать в приложениях. Часто именно наличие такой библиотеки функций оказывается решающим при выборе Excel в качестве платформы для построения приложения.
Программирование в Excel |
241 |
В Excel встроено несколько фактически внешних приложений, использование которых может быть очень удобным. Например, сводная таблица (объект PivotTable) — интегрированный в Excel OLAP-клиент приобретенной
Microsoft фирмы Panorama Software, QueryTable — специальный объект для работы с информацией из базы данных, объект Chart — средство работы с диаграммами и т. п.
11.2. Объект Application
Как и в Word, объект Application в Microsoft Excel представляет все приложение Excel и находится на самом верхнем уровне объектной модели Excel. Если вам потребуется вызвать Excel из другого приложения, вам нужно будет создать объект Excel.Application (не забудьте при этом при помощи меню Tools | References добавить ссылку на библиотеку Microsoft Excel 11.0 Object Library). Создание этого объекта может выглядеть так:
Dim oExcel As New Excel.Application oExcel.Workbooks.Add oExcel.Visible = True
Точно так же, как и в Word, если вы работаете из уже запущенного Excel, создавать объект Application вам не потребуется. Он будет доступен всегда. Если вы обращаетесь к какому-либо свойству без указания вышестоящего объекта, то редактор Visual Basic в Excel будет считать, что вы обращаетесь к свойству объекта Application. Поэтому эти две строки кода в Excel равнозначны:
Application.Workbooks.Add
и
Workbooks.Add
Вообще объекты Application в большинстве приложений Office очень похожи между собой, и к ним применяются те же соображения, что и для объекта Word.Application. Точно так же многие разработчики считают, что удобнее и надежнее работать со скрытым окном Excel, что открывать новый экземпляр Excel удобнее, чем разыскивать уже открытый пользователем. Для того чтобы в окне редактора кода для форм появился объект Application, точно так же необходимо в разделе Declarations кода формы объявить объект Application с ключевым словом WithEvents, например, так:
Public WithEvents App As Excel.Application
В этом случае в окне редактора кода для форм у вас появится новый объект App, и вы сможете использовать событийные процедуры объекта Application
(рис. 11.1).
242 |
Глава 11 |
||
Рис. 11.1. В списке объектов появился новый объект App со своим набором событий
11.3. Свойства и методы объекта Application
Многие свойства, методы и события объекта Excel.Application совпадают с Word.Application. Однако т. к. здесь информация приводится для справки для тех пользователей, которым трудно читать по-английски, приведу наиболее часто используемые свойства и методы объекта Application в Excel, вне зависимости от того, встречались ли они нам в Word или нет.
Вначале о свойствах объекта Application.
Свойства с префиксом Active… — возвращают активную ячейку (ту, на которую указывает курсор ввода данных), активную диаграмму, активный лист, активную книгу или активное окно. Все эти свойства доступны только для чтения. Собственно говоря, использовать их для создания объектов совсем не обязательно — объекты ActiveCell, ActiveSheet и т. п. создаются автоматически во время работы приложения и доступны всегда. Немного отличается свойство ActivePrinter — оно позволяет не только вернуть, но и установить активный принтер.
AddIns — возвращает одноименную коллекцию надстроек (объектов AddIn). В отличие от Word, где в большинстве случаев применение надстроек предназначено для профессиональных программистов, в Excel работа с этим объектом имеет практическое значение для многих пользователей. Вместе с Excel поставляется несколько очень полезных надстроек (на графическом экране они доступны через меню Сервис | Надстройки),
например, Мастер подстановок, Пакет анализа, Поиск решения и т. п.
При помощи этой коллекции можно проверить, подключена ли пользова-
Программирование в Excel |
243 |
телем нужная надстройка (если она нужна в вашей программе) и в случае необходимости подключить ее автоматически.
AutoRecover — возвращает одноименный объект, который позволяет определить параметры автосохранения Excel. Например, чтобы открытые документы Excel автоматически сохранялись каждые 5 минут, можно использовать код:
Application.AutoRecover.Time = 5
Время указывается в минутах, можно использовать значения в интервале от 1 до 120. На графическом экране то же самое можно сделать при помо-
щи меню Сервис | Параметры на вкладке Сохранение окна Параметры.
Calculation — позволяет узнать или настроить режим пересчета рабочей книги (по умолчанию установлен автоматический режим, можно также использовать ручной пересчет или полуавтоматический, когда автоматически пересчитывается все, кроме таблиц). Есть смысл отключать автоматический пересчет тогда, когда пересчет значений после каждого изменения ячейки занимает много времени и мешает вводу данных. То же самое на графическом экране можно настроить при помощи меню Сервис | Параметры, вкладка Вычисления окна Параметры (явно дать команду на пересчет можно клавишей <F9>).
CalculationState — позволяет проверить, занимается ли Excel пересчетом данных или пересчет уже завершен.
Cells — одно из самых важных свойств объекта Application. Оно возвращает объект Range, представляющий собой все ячейки в активном листе активной книги. Поскольку свойство по умолчанию (т. е. свойство, название которого можно опускать) для объекта Range — это свойство Item, то обращение к ячейкам активного листа может выглядеть так:
Application.Cells(1, 2).Font.Bold = True
В данном случае мы выделили полужирным ячейку на пересечении первой строки и второго столбца.
Очень похоже действуют свойства Columns и Rows. Например, чтобы проделать подобную операцию со всем вторым столбцом, можно использовать команду вида:
Application.Columns(2).Font.Bold = True
а для второй строки можно воспользоваться похожей командой:
Application.Rows(2).Font.Bold = True
Еще раз отметим, что свойства Cells, Columns и Rows возвращают вовсе не наборы объектов Cell, Column и Row, как считают многие пользователи, а
наборы объектов Range. На использовании объекта Range построена в Excel почти вся работа с ячейками и их значениями. Далее в этой главе объекту Range будет посвящен отдельный разд. 11.6.
Cursor — это свойство позволяет поменять внешний вид указателя мыши в Excel (у объекта Application в Word этого свойства почему-то нет). Обычно перед выполнением длинной расчетной операции курсору придают вид песочных часов (xlWait), а потом возвращают обратно. Автоматически по завершению работы макроса курсор не возвращается к нормальному виду, поэтому нужно предусмотреть соответствующий код.
DataEntryMode — очень интересное свойство, которое может уберечь пользователя от множества ошибок. Оно позволяет перейти в режим ввода данных (data entry mode), когда пользователю разрешается только вводить данные в разблокированные ячейки выбранного диапазона. Всего в вашем распоряжении три варианта: xlOn — включить этот режим, xlStrict — включить и сделать так, чтобы пользователь не мог из него выйти при помощи клавиши <Esc>, xlOff — отключить режим.
DecimalSeparator и ThousandsSeparator — эти свойства позволяют не пола-
гаться на региональные настройки на компьютере пользователя, а явно назначить символы, которые будут отделять дробную часть числа от целой и тысячи друг от друга. При использовании этих свойств рекомендуется также отключить использование системных установок при помощи свой-
ства UseSystemSeparators:
Application.UseSystemSeparators = False
Dialogs — возвращает одноименную коллекцию Dialog, которую можно использовать для отображения диалоговых окон Excel (их предусмотрено несколько сотен) и определять реакцию на действия в них пользователей. На этот объект очень похож объект FileDialog, представляющий окна, предназначенные только для работы с файлами (например, окно открытия файла). Работа с ними выглядит точно так же, как в Word.
DisplayAlerts — свойство, про которое мы уже говорили в модуле про Word, но по причине его большой важности повторим еще раз. Это свойство позволяет отключить показ различных предупреждений, которые пользователю обычно в ходе работы приложения показывать не надо (например, подавить предупреждение при закрытии ненужного файла, в котором не были сохранены изменения).
EnableEvents — позволяет на время отключить события для объекта Application, чтобы они не срабатывали (обычно перед выполнением како- го-то действия — открытия файла, сохранения и т. п.).
Программирование в Excel |
245 |
ErrorCheckingOptions — возвращает ссылку на одноименный объект, при помощи свойств которого можно настроить параметры автопроверки Excel (сообщать ли пользователю о синтаксически неверных формулах, ссылках на пустые ячейки и т. п.). По умолчанию большинство проверок включено, и к этому объекту есть смысл обращаться только тогда, когда вы хотите их отменить.
FileDialog — позволяет обратиться к диалоговым окнам открытия и сохранения файлов (то же самое можно сделать при помощи более общего свойства Dialogs). Например, чтобы предоставить пользователю выбрать единственный файл в окне открытия и получить полный путь к нему, можно воспользоваться кодом:
Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False
Application.FileDialog(msoFileDialogOpen).Show
Debug.Print Application.FileDialog(msoFileDialogOpen).SelectedItems(1)
Похожий пример с возможностью выбора сразу нескольких файлов приведен в справке по этому свойству.
FileSearch — это свойство позволяет провести поиск по указанному вами каталогу и вывести результат.
Interactive — позволяет полностью заблокировать ввод в приложение Excel со стороны пользователя (как клавиатуру, так и мышь). Обычно используется, чтобы пользователь не смог помешать работе приложения, например, сбить выделение. Это свойство можно также использовать, если ввод пользователя производится из другого приложения, взаимодействующего с Excel.
International и LanguageSettings — работают точно так же, как и в Word.
LibraryPath — возвращает путь к каталогу, где лежат файлы надстроек
Excel с расширением xla. По умолчанию Office11Library.
MoveAfterReturn — позволяет включить или отключить переход на следующую ячейку после завершения ввода данных и нажатия <Enter> (по умолчанию включен), а свойство MoveAfterReturnDirection позволяет определить направление перехода. В некоторых ситуациях это может сильно упростить ввод данных пользователем. Например, чтобы переход происходил на ячейку справа, можно использовать команду:
Application.MoveAfterReturnDirection = xlToRight
Names — возвращает коллекцию Names, представляющую собой все именованные диапазоны в активной рабочей книге. При помощи метода Add() коллекции Names вы можете также сами определять в рабочей книге свои именованные диапазоны. На практике именованные диапазоны работают
примерно так же, как закладки в Word — с их помощью очень удобно определять наборы данных в сложных таблицах Excel. На графическом экране в Excel определить именованные диапазоны можно при помощи меню
Вставка | Имя.
ODBCErrors и OLEDBErrors — позволяют получить информацию о возникших ошибках при подключении к базам данных ODBC и OLE DB соответственно. Они возвращают одноименные коллекции, которые состоят из объектов ODBCError и OLEDBError соответственно, которые и содержат информацию об ошибке.
OnWindow — это свойство больше похоже на событие. В качестве его значения указывается имя процедуры, которая должна находиться в модуле уровня книги (по умолчанию такой модуль не создается, его нужно создать вручную). Эта процедура будет вызываться всякий раз, когда пользователь переключился в окно Excel (не важно какой книги и какого листа). Вместо этого свойства можно использовать макросы со специальными именами Auto_Activate и Auto_Deactivate (если вы определили и то, и другое, первой отработает процедура, определенная при помощи свойства
OnWindow).
Range — очень важное свойство. Возвращает объект Range, который представляет собой диапазон ячеек и используется в Excel практически для любых операций с ячейками.
ReferenceStyle — позволяет переключать режим отображения ячеек между A1 (буквы — столбцы, цифры — строки) и R1C1 (когда и строки, и столбцы обозначаются цифрами). На графическом экране это можно сде-
лать через меню Сервис | Параметры на вкладке Общие окна Парамет-
ры, установив или сбросив флажок Стиль ссылок R1C1. На практике пользователям ближе стиль вида A1, а программистам, конечно, R1C1 (особенно в тех ситуациях, когда столбцов очень много и приходится использовать столбцы AA, AB и т. п.). Во многих ситуациях перед выполнением какой-то программной операции бывает удобно вначале перевести режим отображения в R1C1, а после окончания на радость пользователям вернуть его обратно. Можно этим и не заниматься, а использовать другие способы для отсчета определенного количества столбцов.
Selection — как несложно догадаться, это свойство возвращает то, что в настоящий момент выбрал пользователь. Если он выбрал обычные ячейки в таблице, то вернется объект Range. Если же пользователь выбрал что-то на диаграмме, то может вернуться объект осей, легенды и т. п., в зависимости от того, что было выбрано.
Sheets — это свойство мы будем подробнее разбирать в разд. 11.5, посвященном книгам Excel. Оно возвращает коллекцию Sheets — набор листов
Программирование в Excel |
247 |
книги и набор диаграмм, которые находятся на отдельных листах. Если используется свойство Worksheets, то вернется та же коллекция Sheets, но уже состоящая только из объектов Worksheet — обычных листов (без диаграмм).
TemplatesPath — свойство для чтения, при помощи которого можно получить информацию о каталоге с шаблонами Excel (например, для размещения собственного шаблона или открытия шаблона из этого каталога). По умолчанию используется каталог Application DataMicrosoftTemplates в
профиле пользователя.
ThisCell и ThisWorkbook — очень удобные свойства, которые позволяют обращаться к текущей ячейке и к текущей книге, не обременяя себя созданием объектных переменных. Эти объекты создавать не нужно — они и так изначально существуют в работающем Excel.
Windows, Workbooks и Sheets — возвращают, соответственно, все открытые окна, книги и листы Excel. Про объекты рабочей книги и листа мы будем говорить в разд. 11.5.
WorkSheetFunction — позволяет использовать в программе на VBA функции Excel напрямую, без необходимости прописывать их в какую-либо ячейку.
Самые важные методы объекта Excel.Application перечислены далее.
ActivateMicrosoftApp() — специальный метод, который предназначен для запуска и активизации (или просто активизации, если приложение уже было запущено) приложений Office (Word, Access, PowerPoint) и некоторых других (Project, FoxPro, Schedule Plus).
AddCustomList() — создает новый пользовательский список. В качестве параметра принимает либо объект Range (элементами списка станут те значения, которые есть в диапазоне), либо стандартный объект Array. Удалить список можно при помощи метода DeleteCustomList().
Методы с префиксом Calculate… — позволяют пересчитать значения в ячейках. Простой метод Calculate() — это обычный пересчет значений (чаще всего нужен, если автопересчет отключен), CalculateFull() пересчитывает значения во всех открытых книгах, CalculateFullRebuild() — еще и производит перестроение формул (аналогично занесению всех формул заново). Остановить пересчет можно при помощи метода CheckAbort().
ConvertFormula() — преобразовывает формулу двумя способами: либо переводит адресацию ячеек в другой режим (например, вместо A1 в R1C1), либо меняет абсолютные ссылки на относительные и наоборот. В качестве параметра принимает строковую переменную с текстом формулы (должна начинаться с символа ‘=’) и флаги конвертации.
DoubleClick() — этот метод эквивалентен двойному щелчку мышью на активной ячейке, т. е. переход в режим ввода данных в эту ячейку.
Evaluate() — очень полезный и часто используемый метод. Позволяет по имени найти объект книги Excel и преобразовать его в объект или значения для дальнейшего использования. В качестве имен этот метод может принимать:
•имена ячеек в стиле A1 (возвращается объект Cell);
•имена диапазонов (возвращается объект Range);
•имена, определенные в макросе (чаще всего названия переменных);
•ссылки на внешние книги, например:
Evaluate(«[Book1.xls]Sheet1!A5»))
Этот метод можно вызвать и неявно, просто заключив имя объекта в квадратные скобки. Например, такие строки будут абсолютно одинаковыми по значению:
[a1].Value = 25 Evaluate(«A1»).Value = 25
Поскольку синтаксис с квадратными скобками короче, чаще всего используется именно он.
Таким образом, метод Evaluate() — это самый простой и естественный метод обратиться к ячейке или диапазону в своей или чужой книге Excel.
GetOpenFilename() — это упрощенный способ работы с окном открытия файлов. Чтобы открыть диалоговое окно и получить информацию о том, что выбрал пользователь (в виде строковой переменной с информацией о имени файла с полным путем), можно использовать такой код:
Filename = Application.GetOpenFilename()
If Filename <> False Then
Debug.Print Filename
End If
GetSaveAsFilename() — такой же по функциональности способ, который работает с окном Сохранить как.
GoTo() — важный и часто используемый метод. Принимает в качестве параметра объект Range, строку со ссылкой на ячейку (в формате R1C1) или имя процедуры VBA, выделяет и активизирует диапазон или ячейку или запускает на выполнение процедуру. В отличие от Select(), этот метод еще и автоматически активизирует лист, на котором расположены диапазон или ячейка.
Программирование в Excel |
249 |
Help() — позволяет открыть и показать информацию из файла справки (в том числе пользовательского). В качестве параметра принимает имя файла справки и метку темы в нем.
Intersect() — возвращает диапазон, который представляет собой область пересечения двух или более диапазонов. Если передаваемые в качестве параметров диапазоны не пересекаются, возвращается Nothing.
OnKey() — этот метод позволяет «посадить» процедуру VBA на определенную клавиатурную комбинацию. Например, чтобы назначить процедуру Msg() из модуля Лист1 клавиатурной комбинации <Alt>+<M>, можно воспользоваться командой:
Application.OnKey «%{m}», «Лист1.Msg»
OnRepeat() — позволяет назначить процедуру, которая будет выполняться при использовании команды Повторить в меню Правка. Назначение процедуры команде Отменить в том же меню производится при помощи метода OnUndo().
RegisterXLL() — подключает файл надстройки Excel с расширением xll и регистрирует его функции и процедуры. Этот метод используется при установке собственного приложения.
Repeat() — позволяет просто повторить последнее действие, которое было выполнено пользователем (не программным способом). Аналогично команде Повторить в меню Правка. Отменить действие пользователя можно при помощи метода Undo().
Run() — позволяет выполнить процедуру или функцию VBA, макрос Excel или процедуру или функцию в XLL-модуле (и передать до 30 параметров).
SendKeys() — позволяет эмулировать нажатия клавиш и передать их в активное окно приложения. Обычно используется, если нужно что-то продемонстрировать пользователю или что-то сделать через меню (например, не удалось найти, как это можно выполнить с помощью кода).
Union() — позволяет объединить два или более диапазонов.
Volatile() — этот хитрый метод должен вызываться только из пользовательской функции, которая вычисляет значение ячейки. Если он вызван и ему передано значение True, то данная ячейка становится чувствительной (volatile) и будет пересчитываться при любом изменении значений в листе, даже том, которое ее не касается.
Wait() — этот метод позволяет приостановить работу Excel на указанное вами время, сняв нагрузку с процессора. Используется для демонстраций, чтобы пользователь успел увидеть, что происходит, для ожидания завершения выполнения какой-либо внешней операции и т. п. При этом ввод
2006 г.
Excel.Application
- Как загрузить новый экземпляр Excel или подключиться к запущенному экземпляру EXCEL.EXE? Как отсоединиться от Excel и закрыть его экземпляр?
- Как запустить Excel из консольного приложения или в отдельном потоке (TThread)
- Как получить и настроить папки Excel по умолчанию?
- Чем отличается TExcelApplication от ExcelApplication, TExcelWorkbook от ExcelWorkbook?
- Как узнать локализацию Excel (русская версия или нет)?
- Как сделать, чтобы Excel работал быстрее?
- Как вывести приложение Excel на передний план?
- Как сделать так, чтоб работали английские формулы и форматы чисел в ячейках?
- Что такое Selection?
- Почему не нужно использовать ExcelApplication.Range, а следует ExcelWorksheet.Range?
- Если приложение Excel работает и пользователь выполняет в Excel, одновременно, какие либо действия, то попытка подключится к Excel и вносить в него данные, вызывает ошибку. Как этого избежать?
- Экспорт в Excel длится довольно долго. Как можно уведомлять пользователя о ходе выполнения работы?
- Переношу записанный VBA макрос рисования границы в Excel, но Delphi не знает что такое xlContinuous. Где взять значение этой константы?
- Почему я не могу найти описание компонентов палитры Delphi «Servers» в Help? Где найти документацию по работе с Excel?
- Полезные ссылки
Excel.Application
Excel Range Object
Как загрузить новый экземпляр Excel или подключиться к запущенному экземпляру EXCEL.EXE? Как отсоединиться от Excel и закрыть его экземпляр?
Для определения, будет ли запущен новый экземпляр Excel.Application или присоединение к уже запущенному, используется свойство TExcelApplication.ConnectKind. По умолчанию это свойство имеет значение ckRunningOrNew (константы определены в unit OleServer). Однако рекомендуется, если нет на то особой надобности, всегда запускать новый экземпляр Excel.Application во избежание конфликтов с запущенным раннее экземпляром Excel.Application. Свойство TExcelApplication.AutoQuit в конструкторе устанавливается по умолчанию в False (только в модуле ExcelXP в True) — это значит, что если вы хотите при отсоединении завершить работу Excel (закрыть), то нужно вызвать метод TExcelApplication.Quit или установить свойство TExcelApplication.AutoQuit равным True.
Delphi:
var XL: TExcelApplication; begin // запускаем новый экземпляр Excel'я XL := TExcelApplication.Create(nil); try XL.ConnectKind := ckNewInstance; XL.Connect; // подключение XL.AutoQuit := False; // по умолчанию это свойство True только в unit ExcelXP XL.Visible[lcid] := True; // здесь работаем с Excel'ем finally // отсоединяемся XL.UserControl := True; // отдадим управление пользователю XL.Quit; // закрыть Excel XL.Disconnect; FreeAndNil(XL); end;
C#:
private Excel.Application StartExcel(bool asNewInstance) { Excel.Application XL = null; if (!(asNewInstance)) { try { XL = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application; } catch { // XL = null; } } if (XL == null) XL = new Excel.Application(); if (XL.Workbooks.Count == 0) XL.Workbooks.Add(Type.Missing); XL.Visible = true; return XL; } private void FinishExcel(Excel.Application XL) { if (XL != null) { XL.ScreenUpdating = true; if (! XL.Interactive) XL.Interactive = true; XL.UserControl = true; if (XL.Workbooks.Count == 0) { XL.Quit(); } else { if (! XL.Visible) XL.Visible = true; XL.ActiveWorkbook.Saved = true; } // System.Runtime.InteropServices.Marshal.ReleaseComObject(XL); XL = null; GC.GetTotalMemory(true); // вызов сборщика мусора // Пока не закрыть приложение EXCEL.EXE будет висеть в процессах } }
How to automate Microsoft Excel from Microsoft Visual C# .NET
How to use Visual C# to automate a running instance of an Office program
GC.GetTotalMemory Method
GC Class
Как запустить Excel из консольного приложения или в отдельном потоке (TThread)
Консольное приложение и дочерний поток (класс TThread) не предполагают работу с COM сервером, как это сделано в главном потоке для Application в VCL. Для того чтобы все работало, необходим вызов функции WinAPI CoInitialize.
{$APPTYPE CONSOLE} // для консольного приложения var NeedToUninitialize: Boolean; … begin // NeedToUninitialize := Succeeded(CoInitialize(nil)); NeedToUninitialize := Succeeded(CoInitializeEx(nil, COINIT_MULTITHREADED)); try // здесь работаем с Excel'ем finally if NeedToUninitialize then CoUninitialize; end; end.
Отличие при работе в Thread — весь код работы должен быть помещен в метод TThread.Execute.
Для C# ничего дополнительно вызывать не нужно — все работает, что для WinForms, что для Console, что для объекта класса Thread().
CoInitializeEx
OleInitialize
Как получить и настроить папки Excel по умолчанию?
По умолчанию все открываемые и сохраняемые документы находятся в папке «%USERPROFILE%Мои документы» (Personal). Ссылка на эту папку содержится в свойстве TExcelApplication.DefaultFilePath (read/write). Для чтения и записи в другие папки используйте полный путь к файлу книги.
Delphi:
(XL.ActiveSheet as _Worksheet).Range['A1', EmptyParam].Formula := Format('DefaultFilePath: %s', [XL.DefaultFilePath[lcid]]);
DefaultFilePath Property
How to: Set the Default Save Path for Workbooks
Чем отличается TExcelApplication от ExcelApplication, TExcelWorkbook от ExcelWorkbook?
Все отличие TExcelApplication от ExcelApplication в том, что первый — наследник TOleServer. Это расширяет возможности для выбора способа подключения/отключения COM-сервера Excel и упрощает работу с событиями Excel.Application. Получить интерфейс ExcelApplication всегда можно из свойства TExcelApplication.DefaultInterface (DefaultInterface — штатное свойство всех наследников класса ToleServer).
Как узнать локализацию Excel’я (русская версия или нет)?
Для Delphi это можно почитать здесь.
C#:
oSheet.get_Range("A1", Type.Missing).Value2 = XL.LanguageSettings.get_LanguageID( Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI);
LanguageSettings Object
Как сделать, чтобы Excel работал быстрее?
Для ускорения работы с Excel’ем можно сделать следующие шаги:
Delphi:
// запретить перерисовку экрана XL.ScreenUpdating[lcid] := False; // отменить автоматическую калькуляцию формул XL.Calculation[lcid] := xlManual; // отменить проверку автоматическую ошибок в ячейках (для XP и выше) with XL.ErrorCheckingOptions do begin BackgroundChecking := False; NumberAsText := False; InconsistentFormula := False; end;
Не использовать метод Select, и, как следствие, свойство Selection (смотрите дальше).
Существенно повышается скорость, если вместо записи в каждую ячейку использовать запись из VarArray (смотрите дальше про объект Range). В Demo-проекте есть тест затраченного времени для различных методов записи.
Так как основное время работы с Excel’ем затрачивается на перерисовку (установка отступов для страницы, размеров строк и столбцов, атрибуты шрифтов и т.д.), то лучше всего использовать заранее подготовленный шаблон.
Как вывести приложение Excel на передний план?
Для «выноса» приложения Excel на передний план просто вызовите метод Visible объекта ExcelApplication.
Delphi:
XL.Visible[lcid] := True;
// Этот способ только для Excel версии XP и выше
SetForegroundWindow(XL.Hwnd);
C#:
XL.Visible = true;
Как сделать так, чтоб работали английские формулы и форматы чисел в ячейках?
Решение для Delphi здесь «Русский Excel и установка NumberFormat»
К сожалению, при работе с русским Excel’ем из C# проблемы те же, но, к счастью, решаются проще — через CultureInfo:
C#:
int savedCult = Thread.CurrentThread.CurrentCulture.LCID; try { // установим английскую "культуру" Thread.CurrentThread.CurrentCulture = new CultureInfo(0x0409, false); Thread.CurrentThread.CurrentUICulture = new CultureInfo(0x0409, false); // здесь работаем с Excel'ем, при чем работают английские формулы, DataFormat // и колонтитулы в PageSetup finally { // восстановим пользовательскую "культуру" для отображения всех данных в // привычных глазу форматах Thread.CurrentThread.CurrentCulture = new CultureInfo(savedCult, true); Thread.CurrentThread.CurrentUICulture = new CultureInfo(savedCult, true); }
Русский Excel и установка NumberFormat
How to: Set the Culture and UI Culture for Windows Forms Globalization
Что такое Selection?
Как пишут в «Best Practices for Setting Range Properties»: «Код, использующий Selection, сгенерирован записью макроса Excel, часто используется для обнаружения объекта или метода, который будет работать. Это хорошая идея, за исключением того, что записанный макрос не оптимизирован для пользователя. Обычно Excel при записи макроса использует Selection и изменяет выбор объекта при записи какой либо задачи».
Т.е. использование Selection не является обязательным и даже не рекомендуется для разработчика. Цитата оттуда же: «На практике вызывайте метод Select объекта только тогда, когда твердо намерены изменить выбранный пользователем элемент. Вы можете никогда не использовать метод Select просто потому, что это вам удобно, как разработчику. Если вы устанавливаете свойства объекта Range, у вас всегда есть альтернатива. Отказ от метода Select не только делает ваш код быстрее, но и порадует пользователей вашей программы (it makes your users happier)». Эта тема еще затронута здесь.
Selection Property
Почему не нужно использовать Excel.Application.Range, а следует ExcelWorksheet.Range?
Использование ExcelApplication.Range позволяет работать только с активным листом активной книги. Если вы открываете по ходу работы еще одну книгу или делаете активным другой лист в книге (например, добавляете новый лист), то данные будут вноситься именно в активный в данный момент лист. Чтоб не попасть в неудобную ситуациюб всегда используйте объект Range объекта ExcelWorksheet. Это не только обезопасит ваш код от попадания «куда Бог пошлет», но и позволит записывать данные сразу в несколько листов и даже книг без изменения ActiveSheet и ActiveCell.
Если приложение Excel работает и пользователь выполняет в Excel, одновременно, какие либо действия, то попытка подключится к Excel и вносить в него данные, вызывает ошибку. Как этого избежать?
При работе с запущенным приложением Excel, он может быть занят, если в это время пользователь редактирует значение в ячейке, или в нем открыто какое-либо модальное диалоговое окно (например, «Открытие документа»). Чтобы обойти эту ситуациюб всегда запускайте новую копию Excel.Application и устанавливайте свойство Interactive в False, что запретит пользователю что-либо делать в Excel’е или закрыть запущенный экземпляр Excel.Application:
Delphi:
XL := TExcelApplication.Create(nil); try XL.ConnectKind := ckNewInstance; XL.Connect; XL.Interactive[lcid] := False; // запрещаем работу пользователю с нашим экземпляром Excel'я XL.Visible[lcid] := True; // работать здесь finally // не забыть разрешить пользователю доступ к Excel'ю! XL.UserControl := True; XL.Interactive[lcid] := True; XL.Disconnect; FreeAndNil(XL); end;
The action cannot be completed because Microsoft Office Excel is busy
Interactive Property
Экспорт в Excel длится довольно долго. Как можно уведомлять пользователя о ходе выполнения работы?
Чтобы пользователь не подумалб что во время экспорта данных в Excel ваша программа и Excel «висит», лучше уведомлять его о ходе работы. Т.к. обновление экрана занимает довольно много времени и так довольно длительного процесса экспорта (хотя все же стоит подумать, как этот процесс оптимизировать и ускорить), то лучшим выходом из этой ситуации является показ этапов работы в свойстве ExcelApplication.StatusBar:
Delphi:
XL.DisplayStatusBar[lcid] := True; // покажем StatusBar, если его не было видно XL.StatusBar[lcid] := 'Читаем'; // XL.StatusBar[lcid] := 'Пишем'; // XL.StatusBar[lcid] := 'Считаем'; // XL.StatusBar[lcid] := False; // уберем наше последнее сообщение
C#:
XL.DisplayStatusBar = true; // XL.StatusBar = "Текст в статусбаре"; // XL.StatusBar = false; // "Готово"
DisplayStatusBar Property
StatusBar Property
Переношу записанный VBA макрос рисования границы в Excel, но Delphi не знает что такое xlContinuous. Где взять значение этой константы?
Это всего лишь значит, что вы пользуетесь в Delphi поздним связыванием. Добавьте в uses ExcelXP или Excel2000. Для C# нужно полностью указывать namespace, тип и имя этой константы, например Excel.XlLineStyle.xlContinuous.
Microsoft.Office.Interop.Excel Namespace
Почему я не могу найти описание компонентов палитры Delphi «Servers» в Help’е? Где найти документацию по работе с Excel’ем?
Компоненты на палитре «Servers» — это «обертка» (wrapper) популярных COM-серверов Microsoft. Для описания их объектной модели, свойств и методов используйте поставляемый с Microsoft Office VBA Help или ищите информацию на MSDN (также смотрите «Полезные ссылки» в конце).
Полезные ссылки
Microsoft Excel Object Model
Automating Excel Using the Excel Object Model
Office Development — Excel
Migrating Excel VBA Solutions to Visual Studio 2005 Tools for Office
Converting Microsoft Office VBA Macros to Visual Basic .NET and C#
Microsoft Excel 2003 Language Reference
Understanding the Excel Object Model from a .NET Developer’s Perspective
Microsoft.Office.Interop.Excel Namespace
Excel Objects
Code Examples for Excel (C#)
Обращение к объекту
Контейнеры
Объекты приложения могут включать в себя объекты разных типов. Например, рабочая книга может содержать один или несколько рабочих листов и листов диаграмм. Рабочий лист, в свою очередь, содержит строки, колонки и интервалы ячеек. Когда объект одного типа находится внутри объекта другого типа, говорят о контейнере ( container ), в котором содержится объект.
Самый старший контейнер объектов MS Excel — это приложение Application. Приложение — это контейнер для всех открытых рабочих книг, и в то же время приложение содержит такой глобальный объект, как строка меню, который доступен любой рабочей книге. Рабочий лист представляет пример того, что объект может быть частью нескольких контейнеров или коллекций одновременно: он входит в рабочую книгу, с одной стороны, а с другой стороны — является частью коллекции Sheets и коллекции Worksheets.
Преимущества
- Рассмотрение объекта в качестве контейнера позволяет уточнить, сославшись на контейнер, с каким именно объектом производится действие в процедуре.
Если в рабочей книге имеются два рабочих листа Sheet1 и Sheet2, то запись Worksheets(«Sheet1»).Range(«A1») указывает на ячейку A1 рабочего листа Sheet1, а запись Worksheets(«Sheet2»).Range(«A1») указывает на ячейку A1 рабочего листа Sheet2.
Ссылка на объект
Объект в VBA указывается при помощи ссылки. Запись Workbooks(«cross«).Worksheets(«Sheet2») указывает на объект, являющийся листом с именем Sheet2 в рабочей книге cross, отличая его, таким образом, от листа с тем же именем, но в другой рабочей книге.
Важно
- Ссылка на объект состоит из имени контейнера и названия свойства-участника.
- Ссылка на объект может состоять из нескольких спецификаторов (имен контейнеров), отделенных друг от друга точкой. Такая запись отражает иерархию объектов и позволяет точно указать конкретный объект.
- Свойства и методы объекта указываются через точку после ссылки на объект.
Для объектов, относящихся к классу globals (например, активная рабочая книга, активная ячейка рабочего листа, константа), спецификатор Application можно опустить.
Оператор With
В VBA перед обращением к каждому из методов или свойств объекта требуется наличие ссылки на объект. Конструкция With…End With позволяет применить последовательность операторов к объекту, указав его имя только один раз в операторе With. Благодаря этому программа становится менее громоздкой, освобождаясь от повторений ссылки на объект.
Синтаксис оператора
With Object [statements] End With
- Object — имя объекта;
- statements — последовательность операторов.
Первая строка этой структуры идентифицирует объект, с которым будут производиться действия. В последующих операторах используются свойства и методы идентифицированного объекта. Оператор End With является закрывающей скобкой для оператора With. Часто подобная структура записывается при помощи макрорекордера.
Внимание
- Каждый оператор внутри блока statements начинается с точки.
Использование объектных переменных
Чтобы получить доступ к свойствам или методам объекта, можно использовать два способа: прямое указание на объект и применение объектной переменной. Объектная переменная занимает 4 байта и хранит адрес, указывающий на объект.
Например, установить полужирный шрифт для первой строки активного листа можно оператором ActiveSheet.Rows(1).Font.Bold = True или, используя объектную переменную, можно предложить два способа записи:
Здесь оператор Set создает объект, тип которого установлен при описании объектной переменной. Далее можно обратиться к свойствам или методам созданного объекта. В первом случае это объект типа Range, во втором случае — тип объекта Font.
Преимущества
- Использование объектных переменных улучшает читабельность программы.
- Использование объектных переменных уменьшает время выполнения программы, т.к. при каждом выполнении оператора для обращения к объекту не придется проходить полную цепочку иерархии объектов.
Объект Application
При открытии MS Excel автоматически становится доступным объект Application с его свойствами и методами. Объект Application — корневой объект приложения. В него вложены остальные объекты приложения. Доступ к ним осуществляется посредством свойств-участников объекта Application.
Для создания ссылки на объект Application используется свойство Application.
Application.Windows(«AIR.XLS «).Activate | Оператор активизирует рабочую книгу |
Application.Goto Range(«B3:C5») | Оператор выделяет интервал ячеек на активном рабочем листе |
Многие свойства объекта Application используются без ссылки на объект Application, так как они возвращают объекты, относящиеся к классу globals.
Активные объекты
Свойства, название которых начинается со слова Active, возвращают активный объект соответствующего типа. Для этих свойств необязательно указывать ссылку на объект Application, так как они входят в класс globals. Некоторые из этих свойств являются одновременно свойствами нескольких объектов.
Свойство | Объект | Действие | Возвращаемый объект |
---|---|---|---|
ActiveCell | Application, Window | Возвращает активную ячейку | Range |
ActiveSheet | Application, Window, Workbook | Возвращает активный лист. Это может быть рабочий лист, лист диаграмм | Sheet |
ActiveWorkbook | Application | Возвращает активную рабочую книгу | Workbook |
ActiveWindow | Application | Возвращает активное окно | Window |
Selection | Application, Window | Возвращает выделенный объект | Различные типы объектов |
Так как перечисленные в таблице свойства возвращают объекты, при записи операторов для активных объектов используются методы или свойства объектов соответствующих типов.
Оператор | Комментарий |
---|---|
ActiveCell.Font.Bold=True | Устанавливает полужирный шрифт текста активной ячейки |
ActiveSheet.Name=»Проба» | Изменяет название активного листа рабочей книги |
MsgBox ActiveWorkbook.Fullname | Высвечивает полное имя рабочей книги, включая путь и имя файла |
Selection.NumberFormat=»0.00″ | Устанавливает числовой формат с двумя знаками после запятой для ячеек выделенного интервала |
ActiveCell.Value=10
Application.ActiveCell.Value=10 ActiveWindow.ActiveCell.Value=10 Application.ActiveWindow.ActiveCell.Value=10 |
Присваивают активной ячейке значение 10. Приведенные примеры доступа к активной ячейке равносильны |
Worksheets(«Sheet1»).Activate
Selection.Clear |
Очищает предварительно выделенный на листе Sheet1 объект, например, интервал ячеек |
Если никакой объект не выделен, то свойство Selection возвращает значение Nothing и очистка не выполняется | |
Worksheets(«Sheet1»).Activate
MsgBox «Тип объекта » & TypeName(Selection) |
Высвечивает тип предварительно выделенного на листе Sheet1 объекта |