Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

886

Часть VII. Дополнительные темы

Функции

Ясоздал функцию VBA для использования в формулах рабочего листа. Но в результате

еевыполнения отображается сообщение об ошибке #ИМЯ?. Что здесь неправильно?

Скорее всего, причина в том, что функция находится в модуле кода листа (например, Л и с т 1 ) либо в модуле T h is W o rk b o o k (ЭтаКнига). Пользовательские функции рабоче­ го листа должны находиться в стандартных модулях VBА.

Я создал функцию VBA, которая работает при вызове ее из другой процедуры, а при использовании в составе формулы рабочего листа не работает. В чем здесь проблема?

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

Я создал пользовательскую функцию рабочего листа. При получении доступа к этой функции из диалогового окна мастера функций выводится сообщение о невозможно­ сти предоставления справочной информации. Как устранить эту проблему?

Для того чтобы добавить к функции описание, активизируйте рабочую книгу, которая содержит эту функцию. Затем выберите команду Вид1^Макросы1^Макросы (View1^ Macros1^Macros) для отображения диалогового окна Макрос (Macro). Функция не ото­ бражается в списке, поэтому укажите ее имя в поле Имя макроса (Macro Name). После ввода имени функции щелкните на кнопке Параметры (Options) для отображения диа­ логового окна Параметры макроса (Macro Options). В поле Описание (Description) введите описание функции.

Можно ли отображать справочную информацию для аргументов функции в диало­ говом окне мастера функций?

Да. В Excel 2010 появился новый аргумент метода M acroOptions, позволяющий реали­ зовать эту возможность. Можно написать макрос, выполняющий присваивание описаний аргументам функции. Дополнительные сведения по этой теме можно найти в главе 10.

Моя функция рабочего листа отображается в категории “Определенные пользо­ вателем”окна мастера функций. Как переместить функцию в другую категорию?

Для этого необходимо воспользоваться кодом VBA. Следующий оператор перемеща­ ет функцию MyFunc в категорию 1 (Финансовые функции (Financial)):

A p p lic a tio n . M acroO ptions M acro:= "MyFunc", C ate g o ry:= 1

Представленная ниже таблица содержит список допустимых номеров категорий функций.

Номер

Категория

0

Без категории (отображается только в категории Все функции)

1Финансовые

2Дата и время

3Математические и тригонометрические

4Статистические

Глава 31. Часто задаваемые вопросы о программировании в Excel

887

Окончание таблицы

Номер Категория

5Ссылки и массивы

6Работа с базами данных

7Текстовые

8Логические

9Информационные

10Команды (обычно эта категория скрыта)

11Настройка (обычно эта категория скрыта)

12Управление макросами (обычно эта категория скрыта)

13DDE/внешние (обычно эта категория скрыта)

14Определенные пользователем (по умолчанию)

15Инженерные

Как создать новую категорию функций?

Укажите текстовую строку для аргумента C a t e g o r y метода M a c r o O p t io n s . Ниже приводится пример.

A p p lic a tio n .M a c ro O p tio n s M acro:= "MyFunc", _

C a te g o ry := "Корпоративные функции XYZ"

У меня есть пользовательская функция, которая будет применяться в формуле ра­ бочего листа. Как сделать так, чтобы при вводе неверного значения функция воз­ вращала значение ошибки (#ЗНАЧ1)?

Е сл и ф ункция называется M y F u n c t io n , то м ож но использовать следую щ ий опера­ тор для возврата кода о ш и б к и в ячейку, содерж ащ ую ф ункцию :

M yFunction = C V E rr(x lE rrV a lu e )

В этом примере x l E r r V a l u e является предопределенной константой. Константы остальных кодов ошибок описываются в интерактивном справочном руководстве.

В коде VBA я воспользовался функцией Windows API, которая работала великолеп­ но. Затем я передал рабочую книгу коллеге, он попытался открыть ее и получил со­ общение об ошибке компиляции. В чем причина появления этой проблемы?

Вероятнее всего, причина появления проблемы заключается в том, что ваш коллега использует 64-разрядную версию Excel 2010. Для обеспечения совместимости с этой версией объявления API-функций должны включать ключевое слово “PtrSafe”. Пример объявления API-функции, которое корректно в 32-разрядной версии Excel, но вызывает ошибку в 64-разрядной версии Excel 2010, приводится ниже.

D eclare F u n c tio n G etW indow sD irectoryA L ib

"k e rn e l3 2 "

_

(ByVal lp B u ffe r As S trin g , ByVal nS ize

As Long) As

Long

Во многих случаях обеспечение совместимости объявления с 64-разрядной версией Excel достигается путем добавления слова “PtrSafe” после ключевого слова D e c la r e . Этот метод обычно применяется при объявлении API-функций, хотя некоторые такие функции требуют изменения типа данных аргументов.

Ниже приводится пример объявления, которое совместимо как с 32-, так и с 64-раз- рядной версиями Excel 2010.

SUM (СУММ)

888

Часть VII. Дополнительные темы

D e cla re P trS a fe F u n c tio n G etW indow sD irectoryA

L ib

"k e rn e l3 2 " _

(ByVal lp B u ffe r As S tr in g , ByVal n S ize As

Long)

As Long

Причина сбоя кода VBA в Excel 2007 (и более ранних версиях) может заключаться в том, что ключевое слово P trS a fe не распознается. Ниже представлен пример исполь­ зования директив компилятора для объявления API-функции, которая совместима с 32-раз- рядной версией Excel (включая версии, предшествующие Excel 2010) и с 64-разрядной версией Excel 2010.

# I f VBA7 And Win64

Then

 

 

 

L ib

"k e rn e l3 2 " _

D e cla re P trS a fe

F u n c tio n G e tW indow sD irectoryA

(ByVal lp B u ffe r As

S tr in g ,

ByVal nS ize

As

Long)

As

Long

#E lse

G e tW indow sD irectoryA L ib

"k e rn e l3 2 "

_

D e cla re F u n c tio n

(ByVal lp B u ffe r As

S trin g ,

ByVal n S ize

As

Long)

As

Long

#End I f

 

 

 

 

 

 

 

Первый оператор D e c la re

применяется в том случае, когда значения констант VBA7

и W ind64 будут T ru e

(в случае использования 16-разрядной версии Excel 2010). Для

всех других версий Excel применяется второй оператор D e c la re .

Как выполнить пересчет формул, применяющих пользовательскую функцию?

Для этого можно воспользоваться комбинацией клавиш <Ctrl+Alt+F9>.

Можно ли использовать встроенные функции рабочего листа Excel в коде VBA?

В большинстве случаев — да. Функции Excel рабочего листа задаются с помощью метода W o rk s h e e tF u n c tio n объекта A p p lic a t io n . Например, доступ к функции

вы получите, введя следующий оператор:

Ans = A p p lic a tio n . W o rk s h e e tF u n c tio n . Sum (Range (11A l :A3 ") )

В этом примере подсчитывается сумма всех значений в ячейках А1:АЗ (в активном листе), которая присваивается переменной Ans.

Если VBA содержит эквивалент функции рабочего листа, то последнюю нельзя ис­ пользовать на рабочем листе. Например, если VBA задает функцию подсчета квадратно­ го корня (S q r), то функцию SQRT рабочего листа в коде VBA использовать нельзя.

Существует ли способ задать разрыв строки в тексте окна сообщения?

Для этого необходимо воспользоваться символом возврата каретки или перевода строки. Представленный далее оператор отображает окно сообщения, которое содержит текст, состоящий из двух строк. Встроенная константа v b N e w L in e представляет символ перевода строки.

MsgBox "Привет" & vbNewLine & A p p lic a tio n .UserName

Объекты, свойства, методы и события

Существует ли список событий Excel, которые можно использовать ?

Да. Соответствующие сведения можно найти в справочной системе.

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

Существует несколько способов получения этой информации. Можно воспользовать­ ся окном Object Browser, которое отображается в редакторе VBE. Нажмите клавишу

Глава 31. Часто задаваемые вопросы о программировании в Excel

889

<F2> для получения доступа к окну Object Browser и выберите Excel из раскрывающе­ гося списка Libraries/Workbooks (Все библиотеки). Список Classes (Классы) (слева) содержит все доступные объекты Excel. При выборе объекта его свойства и методы ото­ бражаются справа в списке Members (Компоненты).

Кроме того, список свойств и методов можно отобразить при введении имени объек­ та. Например, введите следующий код:

Range ( " A l" ) .

При вводе точки будет отображен список всех доступных свойств и методов объекта Range. Если этого не произошло, то необходимо выбрать Tools^Options (Сервис1^ Параметры), перейти на вкладку Editor (Редактор) и установить флажок Auto List Members (Автоматическая вставка объектов). К сожалению, свойство автоперечисления работает далеко не со всеми объектами. Например, ввод следующего оператора не при­ ведет к отображению списка всех свойств и методов:

A c tiv e s h e e t. Shapes(1 ).

Большое количество информации по языку VBA содержит также справка, которую можно вызвать в окне справки Visual Basic Editor. В нем вы найдете описание методов и свойств всех объектов, которые могут вызвать интерес разработчика. Самым простым способом получения этой информации является ввод имени объекта в окне отладки (Immediate) в нижней части окна VBE или наведение указателя на имя объекта с после­ дующим нажатием клавиши <F1>. В результате будет отображен раздел справочного ру­ ководства, посвященный этому объекту.

В чем смысл использования коллекций? Является ли коллекция объектом? Что та­ кое коллекция?

Коллекция — это объект, который содержит группу подобных объектов. Коллекция получает название в виде существительного во множественном числе. Например, кол­ лекция W o rk s h e e ts — это объект, который содержит объекты W o rk s h e e t рабочей книги. Коллекцию можно воспринимать как массив: W o rk s h e e ts (1) указывает пер­ вый объект W o rk s h e e t в коллекции W orkbooks. Вместо индекса допускается указы­ вать имя рабочего листа, например W o rk s h e e ts ( " J Ih c tI м). Концепция коллекции упрощает одновременное управление подобными объектами. А для циклического пере­ бора членов коллекции можно воспользоваться конструкцией F o r E a c h -N e x t.

Когда в коде VBA я ссылаюсь на рабочий лист, возникает сообщение об ошибке “subscript out of range”. Но я не использую подсценарии. В чем тут дело?

Эта ошибка возникает при попытке получить доступ к несуществующему члену кол­ лекции. Например, приведенный ниже оператор создает сообщение об ошибке, если ак­ тивная рабочая книга не содержит рабочий лист, который называется M yS heet.

Set X = A ctive W o rkb o o k .W o rksh e e ts( "M ySheet")

Как лишить пользователя возможности прокручивать рабочий лист?

Для этого можно или скрыть неиспользуемые строки и столбцы, или воспользоваться оператором VBA для перенастройки полосы прокрутки на рабочем листе. Следующий оператор устанавливает область прокрутки на листе Лист1 таким образом, что пользо­ ватель не может активизировать ячейки за пределами диапазона B2:D50.

W o rkshe ets( "Л и с т !") . S c ro llA re a = "B2:D50"

890

Часть VII. Дополнительные темы

Для того чтобы восстановить первоначальную область прокрутки, воспользуйтесь та­ ким оператором:

W o rksh e e ts( "Л ист1" ) . S c ro llA re a = ""

Помните, что значение свойства S c ro llA re a не сохраняется вместе с рабочей кни­ гой. Таким образом, необходимо устанавливать это свойство при каждом следующем от­ крытии рабочей книги. Данный оператор можно разместить в процедуре обработчика событий Workbook_Open.

Какая разница между использованием методов S e le c t и A p l l i c a t i o n . Goto?

Метод S e l e c t объекта R an ge выделяет диапазон только на активном рабочем лис­ те. Метод A p p l i c a t i o n . G o t o можно использовать для выделения диапазона на лю­ бом листе рабочей книги. Метод A p p lic a t i o n . G o t o может либо активизировать, ли­ бо деактивизировать другой лист. Кроме того, метод G o to позволяет прокручивать ра­ бочий лист, чтобы расположить выделенный диапазон в левом верхнем углу экрана.

Какая разница между активизацией и выделением диапазона?

В отдельных случаях методы A c tiv a te и S e le c t приводят к одинаковому эффек­ ту. Но-зачастую они возвращают разные результаты. Предположим, что выделен диапа­ зон А1:СЗ. Приведенный ниже оператор активизирует ячейку СЗ. Первоначальный диа­ пазон остается выделенным, но ячейка СЗ становится активной, т.е. курсор находится в этой ячейке.

Range("С З " ) .A c tiv a te

Предположим также, что диапазон А1:СЗ выделен. Представленный далее оператор выделяет единственную ячейку, которая становится активной.

Range("С З " ) .S e le c t

Существует ли быстрый способ удаления всех значений из рабочего листа без уда­ ления формул?

Да. Код выполняется по отношению к активному рабочему листу и удаляет значения всех ячеек, которые не содержат формул (форматирование ячеек тоже не очищается).

On E rro r Resume N ext

C e lls . S p e c ia lC e lls (x lC e llT y p e C o n s ta n ts , 2 3 ) .C le a rC o n te n ts

Второй аргумент, 23, представляет собой сумму значений, представленных следую­

щими встроенными константами: x lE r r o r s (16),

x l L o g i c a l (4), xlN u m b ers (1)

и x lT e x t V a lu e s (2).

 

Использование оператора On E r r o r R esum e

N e x t позволяет отменить сообще­

ние об ошибке, которое возникает, если ни одна ячейка не соответствует указанному критерию.

Я знаю, как писать операторы VBA, выделяющие диапазон, для которого известен адрес. Объясните, как создать оператор выделения, если известны только номер строки и номер столбца?

Для этого воспользуйтесь методом C e lls . Следующий оператор выделяет ячейку в пятой строке и двенадцатом столбце (т.е. ячейку L5):

C e lls (5, 12) .S e le c t

Глава 31. Часто задаваемые вопросы о программировании в Excel

891

При попытке создать макрос, вызывающий команду Excel Файл^Выход из Excel (File°>Exit Excel), Excel закрывается до того, как отобразится сгенерированный код. Существует ли команда VBA для выхода из Excel?

Для выхода из Excel используйте следующую инструкцию:

A p p lic a t io n . Q u it

Как отключить обновление экрана в процессе работы макроса?

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

A p p lic a tio n . S creenU pdating = F alse

По завершении выполнения процедуры свойству S c r e e n U p d a t i n g присваивается значение T r u e . Для восстановления обновления экрана воспользуйтесь следующим опе­ ратором:

A p p lic a tio n . S creenU pdating = F alse

Какой самый простой способ создания имени диапазона с помощью VBA?

Если включить запись макроса при создании имени диапазона, то будет получен сле­ дующий код.

R a n g e ("D 1 4 :G 2 0 ").S e le ct

ActiveW orkbook.N am es.Add Name:= " In p u tA re a ", _

R e fe rs T o R lC l:= " =Лист1!R14C4: R2 0C7"

Но намного проще использовать следующий оператор:

S h e e ts( "Л йст1" ) . Range( "D14: G20" ) . Name = "In p u tA re a "

Как определить, имеет ли имя конкретная ячейка или диапазон?

Для этого необходимо проверить значение свойства Nam e объекта N am e, который содержится в объекте R a n g e . Следующая функция принимает диапазон в качестве аргу­ мента и возвращает имя диапазона, если оно существует. Если диапазон не имеет имени, то функция возвращает значение F a ls e .

F u n c tio n RangeName(rng) As V a ria n t

On

E rro r

Resume

N ext

RangeName

=

r n g . Name. Name

I f

E rr <>

0

Then

RangeName = False

End F u n c tio n

На первый взгляд создается впечатление, что в Excel 2010 отсутствует окно пред­ варительного просмотра. Переход к предварительному просмотру осуществляется в режиме просмотра Backstage (после выполнения команды Файл^Печать), а классическое окно предварительного просмотра отсутствует

Единственный способ перехода в классическое окно предварительного просмотра — воспользоваться следующим оператором VBA:

A c tiv e S h e e t. P rin tP re v ie w

892

Часть VII. Дополнительные темы

Можно ли отображать сообщения в строке состояния в процессе выполнения мак­ роса? Я использую сложный макрос и неплохо бы иметь представление о ходе его выполнения

Рекомендуется присвоить описательный текст свойству S ta tu s B a r объекта A p p li­ c a tio n . Приведем пример соответствующего оператора.

A p p lic a tio n . S ta tu s B a r = "Обрабатывается файл " & FileNum

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

A p p lic a tio n . S ta tu s B a r

=

F alse

A p p lic a tio n .S ta tu s B a r

=

""

Я написал макрос VBA, который копирует диапазон и вставляет его в другое место на рабочем листе. Этот макрос использует метод S e le c t. Существует ли более эффективный способ копирования и вставки?

Да. Хотя при записи макроса ячейки сначала выделяются, выделение выполнять во­ все не обязательно - на самом деле это только замедляет работу макроса. Запись простой операции копирования и вставки приводит к генерированию кода VBA, состоящего из четырех строк. Две из них вызывают метод S e le c t.

Range("A l " ) . S e le c t

S e le c tio n . Copy

R a n g e ("B l") .S e le c t

A c tiv e S h e e t. Paste

Эти четыре строки кода можно заменить одним оператором, который приводится ниже.

Range(" A l " ) . Сору Range( " B l")

Обратите внимание на то, что последний оператор не требует использования метода S e le c t.

Я не нашел метода сортировки массива VBA. Значит ли это, что нужно копиро­ вать значения на рабочий лист и применять метод R ange. S o rt?

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

Мой макрос работает с выделенными ячейками, но он неудачно завершается, если выделенной оказывается диаграмма. Как удостовериться в том, что выделен диа­ пазон ячеек?

Можно воспользоваться функцией VBA TypeName, которая применяется для про­ верки объекта S e le c tio n . Ниже приведен пример такого кода.

I f

TypeN am e(S election) <> "Range" Then

 

MsgBox "Выделите диапазон!"

 

E x it Sub

End

I f

Еще одним вариантом является использование свойства R a n g e S e lec tio n , которое возвращает объект Range, представляющий выделенные ячейки рабочего листа. Данное свойство возвращает выделенные ячейки на рабочем листе указанного окна, даже если

Глава 31. Часто задаваемые вопросы о программировании в Excel

893

помимо них выделен графический объект. Это свойство объекта Window, а не объекта Workbook. Следующий оператор отображает адрес выделенного диапазона:

MsgBox A ctive W in d o w .R a n g e S e le ctio n .A d d re ss

Как определить, активна ли диаграмма?

Используйте следующее выражение.

I f

A c tiv e C h a rt Is N o th in g Then

 

MsgBox "Выделите диаграмму "

 

E x it Sub

End

I f

Окно сообщения появится на экране только в том случае, если диаграмма неактивна (имеется в виду как внедренная диаграмма, так и диаграмма на отдельных листах).

Макрос VBA должен подсчитать количество строк, выделенных пользователем. Ме­ тод S e le c t io n . Rows. Count не применяется, если выделены несмежные строки. Это ошибка?

На самом деле так и должно быть. Метод Count возвращает количество элементов в первой выделенной области (предположим, что выделение состоит из нескольких облас­ тей). Для того чтобы получить точное количество строк, код VBA должен определить количество выделенных областей и подсчитать количество строк в каждой области. Сна­ чала необходимо воспользоваться методом S e le c t io n .A r e a . Count, чтобы получить количество областей. Ниже приведен пример, который сохраняет общее количество вы­ деленных строк в переменной NumRows.

NumRows

=

0

For Each

a re a In S e le c tio n .A re a s

NumRows

= NumRows + a re a . Rows. Count

Next area

 

Кстати, это относится и к подсчету количества выделенных столбцов.

Я использую Excel для создания накладных. Существует ли способ генерации уни­ кального номера накладной?

Одним из способов является использование системного реестра. Следующий код де­ монстрирует такой способ.

C ounter

=

G e tS e ttin g ("X Y Z C o rp '\ " In vo ice N u m ",

"C o u n t", 0)

C ounter

=

C ounter

+ 1

 

S a ve S e ttin g "XYZ

C o rp ", "Invo ice N um ", "C o u n t",

C ounter

При выполнении данного кода текущее значение извлекается из системного реестра, увеличивается на единицу и назначается переменной Counter. После этого обновлен­ ное значение сохраняется в системном реестре. Значение переменной C ounter можно использовать в качестве уникального номера накладной.

Этот прием можно применять и в других целях. Например, можно подсчитать коли­ чество раз, когда была открыта рабочая книга. Для этого код, подобный указанному вы­ ше, включается в процедуру Workbook_Open.

Существует ли свойство рабочей книги Excel, которое определяет ее постоянное отображение на экране?

К сожалению, не существует.

894

Часть VII. Дополнительные темы

Существует ли оператор VBA для выделения последнего значения в строке или

столбце? Как правило, я могу воспользоваться комбинацией клавиш <Ctrl+Shift+J> или <Ctrl+Shift+ —» для выполнения этого действия, но как это сделать с помощью макроса?

Эквивалентом комбинации клавиш <Ctrl+Shift+i> в VBA выступает следующий оператор:

S e le c tio n . E n d (x lD o w n ).S e le c t

Для иных направлений используются три другие константы: xlT oL ef t, x lT oR ig h t

и xlUp.

Как определить последнюю непустую ячейку в выбранном столбце?

Представленный ниже оператор отображает адрес последней непустой ячейки в столбце А.

MsgBox A c tiv e S h e e t. C e lls (R o w s . C ou nt, 1 ) .E n d (x lU p ).A d d re s s

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

W ith

A c tiv e S h e e t. C e lls (R o w s . C ou nt, 1)

I f

Is E m p ty ( .V alue) Then

 

MsgBox

. E nd(x lU p ) .Addre s s

E lse

 

 

MsgBox

.Addre s s

End I f

 

End W ith

 

Ссылки VBA могут стать очень длинными, особенно если нужно точно указать объект врабочей книге ирабочем листе. Существует ли способ сократить длину ссылок?

Да. Для этого воспользуйтесь оператором S et для создания объектной переменной. Ниже приведен пример подобного кода.

Dim

MyRange

as

Range

Set

MyRange

=

ThisW orkbook.W o rksh e e ts( "Л ист1" ) . Range( " A l")

После выполнения оператора S et можно ссылаться на объект Range по имени MyRange. Например, вы имеете возможность определить значение ячейки с помощью следующего оператора:

MyRange.Value = 10

Кроме упрощения ссылок на объекты, использование таких переменных ускоряет вы­ полнение кода.

Существует ли способ объявления массива, если неизвестно, сколько элементов он будет содержать ?

Да. Можно объявить динамический массив с помощью оператора Dim. При этом исполь­ зуются пустые скобки. Как только станет известно, сколько элементов будет содержаться в массиве, воспользуйтесь оператором ReDim, чтобы переопределить массив. Оператор ReDim P reserve позволяет переопределить массив без потери текущего содержимого.

Можно ли предоставить пользователю возможность отменить результат выпол­ нения макроса ?

Да, но эта возможность недоступна по умолчанию. Для того чтобы включить ее, мо­ дуль кода VBA должен отслеживать изменения, проведенные макросом. Макрос должен быть готов отменить внесенные изменения при выборе пользователем команды Отмена.

Глава 31. Часто задаваемые вопросы о программировании в Excel

895

Чтобы разрешить пользователю выполнять команду Отмена, воспользуйтесь мето­ дом OnUndo в качестве последнего оператора макроса. Этот метод позволяет указать текст, который отображается в меню команды Отмена, а также процедуру, вызываемую командой Отмена. Ниже приводится пример.

A p p lic a tio n . OnUndo "Последний макрос ", "MyUndoMacro"

Можно ли приостановить выполнение макроса, чтобы пользователь мог ввести данные в определенную ячейку?

Для того чтобы получить значение от пользователя и поместить его в определенную ячейку, можно воспользоваться функцией Excel InputB ox. Например, первый оператор фрагмента кода, приведенного ниже, отображает окно ввода. Как только пользователь введет значение, оно будет помещено в ячейку А1.

U serV al = A p p lic a tio n .In p u tB o x (p ro m p t:= "Значение", T y p e := l) I f TypeNam e(UserVal)<>"B oolean" Then R a n g e ("A l") = U serV al

VBA имеет функцию InputBox, но метод с таким же названием содержится в объекте Appl i c a t i o i l Они одинаковы?

Нет. Метод Excel InputB ox является более гибким, так как позволяет проверить вве­ денное пользователем значение. В предыдущем примере в качестве значения аргумента Туре метода InputB ox использовалась единица (представляет числовое значение). Это значение позволяет удостовериться, что пользователь ввел в поле числовое значение.

Для того чтобы написать оператор VBA, который создает формулу, следует вста­ вить символ кавычек (") в текст. Как это сделать?

Предположим, что вам с помощью кода VBA необходимо ввести следующую форму­ лу в ячейку с адресом В1.

=ЕСЛИ(А1="Да", ИСТИНА, ЛОЖЬ)

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

R a n g e ("B l").o rm u la = " =ЕСЛИ(А1="Да", ИСТИНА,ЛОЖЬ)" ' неверно

Решением будет последовательное использование двух двойных кавычек. В этом слу­ чае внутренние кавычки Excel интерпретирует как одинарные кавычки. Представленный далее оператор приводит к необходимому результату.

R a n g e ("B l") .Form ula = "=ЕСЛИ(A l= ""Y e s "", ИСТИНА,ЛОЖЬ)"

Еще одним способом является использование функции VBA Chr с аргументом 34. Функция возвращает символ кавычки. Следующий пример демонстрирует применение этого способа.

Range( " B l" ) . Form ula = _

" =ЕСЛИ (Al= " Sc Chr (34) & "Да" & C hr(34) & ", ИСТИНА, ЛОЖЬ) "

Еще один способ заключается в том, чтобы воспользоваться формулой, в которой вместо символов кавычек используются апострофы. Затем с помощью функции VBA R eplace апострофы заменяются кавычками.

MyFormula = "=ЕСЛИ А1=' Д а' , TRUE,FALSE)"

 

Range( " B l" ) . Form ula = R eplace(M yForm ula,

C h r(3 4 ))