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

896

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

Я создал массиву но первый его элемент воспринимается как второй. Что я делаю неправильно?

Если не указать обратного, VBA использует значение 0 в качестве индекса первого элемента массива. Если необходимо, чтобы индекс массива начинался с 1, вставьте представленный ниже оператор в начало модуля VBA.

O p tio n Base 1

Кроме того, можно указать верхнюю и нижнюю границы массива при его создании. Ниже приводится пример.

Dim M on ths(1 То 12) As S trin g

Я слышал о том, что некоторые вещи в Excel можно запрограммировать только с помощью устаревшего макроязыка XLM. Это правда?

Нет, это не вполне соответствует действительности. Одна из задач, которые ставились перед разработчиками Excel 2010, — устранение ограничений на возможности языка VBA.

Например, в предыдущих версиях Excel требовались макросы XLM для определения описаний аргументов в пользовательских функциях рабочего листа. В Excel 2010 эту за­ дачу можно выполнить с помощью нового аргумента A rgu m en tD escrip tio n s метода M acroO ptions. Еще один пример нового свойства — коллекция A ddlns2, которая по­ зволяет использовать все открытые надстройки (не только те, которые установлены). В прежних версиях Excel доступ к открытым (но не установленным) надстройкам требо­ вал макроса XLM.

Как добиться от кода VBA максимального быстродействия?

Предложим несколько общих советов.

Удостоверьтесь, что объявлены все используемые переменные. Воспользуйтесь

оператором O ption E x p lic it в начале модуля, чтобы сделать объявление пе­ ременных обязательным.

Если ссылка на объект Excel применяется более одного раза, создайте для этого объекта переменную.

• Используйте конструкцию W ith-End W ith везде, где это возможно.

Если макрос записывает информацию на рабочий лист, отключите обновление эк­

рана с помощью оператора A p p lic a t io n . S creen U p d atin g = F a lse .

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

Пользовательские диалоговые окна

Необходимо получить от пользователя данные, но диалоговое окно UserForm тре­ бует сложного программирования. Существует ли альтернатива ?

Да. Обратитесь к функциям VBA MsgBox и InputBox. Кроме того, можно восполь­ зоваться методом Excel Input Box.

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

897

Допустим, что в диалоговом окне UaerForm находится 12 элементов управления CommandButton. Как создать единый макрос, который будет вызываться при щелчке на любой из кнопок?

Для решения этой задачи не существует простого способа, так как каждый элемент управления CommandButton имеет собственную процедуру C lick . Одним из решений является вызов дополнительной процедуры из каждой процедуры обработки события CommandButton_Click. Другое решение— это создание модуля класса для получе­ ния нового объекта (см. главу 15).

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

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

Как удалить кнопку “х” из строки заголовка диалогового окна UaerForm, с тем

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

Удаление кнопки “х” (Закрыть) из строки заголовка диалогового окна UserForm требует использования нескольких сложных функций Windows API. Более простым ре­ шением будет перехват всех попыток закрыть диалоговое окно. Воспользуйтесь проце­ дурой UserForm _Q ueryClose, которая находится в модуле кода диалогового окна UserForm. Следующий пример иллюстрирует результат того, что пользователь не мо­ жет закрыть диалоговое окно с помощью кнопки “х”.

P riv a te

Sub

UserForm _QueryClose

_

 

(Cancel

As In te g e r, CloseMode

As In te g e r)

I f

CloseMode = vbForm ControlM enu

Then

 

MsgBox "Вы не сможете закрыть

диалоговое о кн о ."

 

Cancel = True

 

 

End I f

End Sub

Элементы созданного мною диалогового окна UaerForm связаны с ячейками рабоче­ го листа с помощью свойства C on trolSource. Существует ли более удачный спо­ соб получения подобного результата?

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

Существует ли способ создания массива элементов управления для диалогового окна UaerForm? Это можно сделать в Visual Basic, но я не могу понять, как это делает­ ся в VBA

Массив элементов управления создать нельзя, но можно создать массив объектов C on trol. Следующий код создает массив, который содержит элементы управления

CommandButton.

898

 

 

 

 

 

 

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

P riv a te

Sub

U s e r F o r m _ In itia liz e ()

Dim

B u tto n s ()

As

CommandButton

Cnt

=

0

 

 

 

 

 

For

Each

C tl

In

U se rF o rm l. C o n tro ls

I f

TypeNam e(Ctl)

=

"CommandButton" Then

 

 

Cnt = Cnt + 1

 

 

 

 

ReDim P reserve

B u tto n s (1 To Cnt)

 

 

Set

B u tto n s (C n t)

= C tl

End

I f

 

 

 

 

 

N ext

C tl

 

 

 

 

 

End Sub

 

 

 

 

 

 

 

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

Да. Метод H ide оставляет диалоговое окно UserForm в памяти, но делает его неви­ димым. Оператор U nload выгружает диалоговое окно, начиная процесс “уничтожения” (вызывая событие T erm inate объекта UserForm) и удаляя диалоговое окно U ser - Form из памяти.

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

По умолчанию каждое диалоговое окно Use г Form отображается в модальном режи­ ме. Это означает, что перед началом других действий диалоговое окно необходимо за­ крыть. Можно также создавать немодальные диалоговые окна UserForm. Для этого ме­ тоду Show передается аргумент vbM odeless. Ниже приведен пример такого оператора.

U se rF o rm l. Show vbM odeless

Как отобразить индикатор текущего состояния, пока происходит длительный процесс установки приложения?

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

Как включить фигуры Excel в диалоговое окно UserForm?

Фигуры невозможно непосредственно вставить в пользовательские диалоговые окна, но их можно применять косвенно. Начните с создания фигуры на рабочем листе. После этого выделите фигуру и выберите команду Главная^ Буфер обменам Копировать (Home^Clipboard^Copy). Активизируйте диалоговое окно UserForm и вставьте в него объект Image. Нажмите клавишу <F4> для отображения окна Properties (Свойства). Выберите свойство P ic tu r e и нажмите комбинацию клавиш <Ctrl+V>, чтобы помес­ тить содержимое буфера обмена в элемент управления Image. Кроме того, вам может понадобиться присвоить свойству A u to S ize значение True.

Как создать список файлов и папок в диалоговом окне UserForm, чтобы пользова­ тель мог выбрать один из файлов?

Создавать такое диалоговое окно UserForm нет необходимости. Для этого сущест­ вует метод VBA G etO penFilenam e. Он отображает диалоговое окно, в котором поль­ зователь может выбрать диск, папку и файл.

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

899

Мне нужно объединить строки и отобразить их в элементе управления L istB ox, но при выполнении этой операции строки отображаются с неправильным вырав­ ниванием. Как добиться одинакового выравнивания?

Одним из решений является использование моноширинного шрифта, например Courier New. Но лучше настроить элемент управления L istB o x на форматирование в два столбца (дополнительная информация приведена в главе 14).

Существует ли простой способ заполнения элементов управления L istB o x либо ComboBox значениями с помощью кода VBA?

Да, с помощью массива. Следующий оператор добавляет три значения в элемент управления L istB o x l:

L is t B o x l. L is t = A r r a y ( "Январь", "Ф евраль", "Март")

Существует ли возможность отображения встроенного диалогового окна Excel с помощью кода VBA?

Многие (но не все) диалоговые окна Excel могут быть отображены с помощью метода A p p l i c a t i o n . D ia lo g s . Например, следующий оператор отображает диалоговое ок­ но, которое позволяет форматировать числа в ячейках:

A p p lic a tio n . D ia lo g s (x lD ia lo g F o rm a tN u m b e r) .Show

Этот метод не является вполне надежным, и далеко не все диалоговые окна Excel мо­ гут открываться таким образом.

Лучшим методом вызова команд ленты (включая те из них, которые отображают диа­ логовые окна) является использование метода E xe cu te M so наряду с указанием имени элемента управления. Ниже приводится пример оператора, в результате выполнения ко­ торого отображается диалоговое окно, содержащее параметры форматирования чисел.

A p p lica tio n .C o m m a n d B a rs . ExecuteM so( "N um berF orm atsD ialog")

Дополнительные сведения по этой теме можно найти в главе 22.

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

Метод E xe cu te M so завершится неудачно, если его вызвать в неподходящем контек­ сте. Например, следующий оператор отображает диалоговое окно Вставить ячейки (Insert Cells). Но если попытаться вызвать этот оператор в случае выделенной диаграммы или защищенной рабочей книги, появится сообщение об ошибке.

A p p lic a tio n . CommandBars. ExecuteMso ( " C e lls In s e r tD ia lo g " )

Каждый раз при создании диалогового окна UserForm я добавляю кнопки ОК и Отмена. Существует ли способ автоматического добавления этих элементов управления?

Да, такой способ существует. Настройте диалоговое окно UserForm, чтобы оно со­ держало все элементы управления, которые используются наиболее часто. После этого выберите F\\e^>Export File (Файл^Экспорт файла) для сохранения этого диалогового окна. Когда возникнет необходимость добавить новое диалоговое окно в проект, выбе­ рите команду F\\e^>Import File (Файл1^Импорт файла).

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

Существует ли возможность создания диалогового окна U ser Form без строки заголовка?

Да, но в этом случае понадобятся некоторые сложные API-функции.

Когда я щелкаю на кнопке в диалоговом окне UserForm, ничего не происходит. Что я делаю неправильно?

Элементы управления, добавленные в диалоговое окно UserForm, не выполняют никакой функции, пока им не будет предоставлена процедура обработки события. Эти процедуры должны располагаться в модуле кода диалогового окна Use г Form, а также иметь соответствующие имена.

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

Да, такое диалоговое окно можно создать, но стоит ли результат затраченных уси­ лий? Рекомендуется создать код, который определяет разрешение экрана и использует свойство Zoom диалогового окна Use г Form для изменения его размера. Учтите, что все диалоговые окна разрабатываются для разрешения 1024x768, которое наиболее часто применяется в мониторах современных компьютеров.

Существует ли возможность создания диалогового окна UserForm, которое позво­ ляет указывать диапазон ячеек с помощью мыши?

Да. Воспользуйтесь элементом управления R efE d it. Пример использования этого элемента управления приводится в главе 14.

Существует ли способ изменения расположения диалогового окна UserForm?

Существует. Необходимо лишь установить значения свойств L e ft и Тор диалогово­

го окна Use г Form.

Но чтобы изменение было реализовано, установите свойство

S ta rtU p P o s itio n

в значение 0.

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

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

W ith U serForm l

.S ta rtU p P o s itio n = 0

. L e ft = A p p lic a tio n . L e ft + (0. 5 * A p p lic a tio n .W idth) _

-(0. 5 * .W idth)

.Top = A p p lic a tio n . Top + (0. 5 * A p p lic a tio n . H e ig h t) _ - (0. 5 * .H e ig h t)

. Show 0 End W ith

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

Да. Соответствующий пример рассматривается в главе 15.