
2 семестр / vba_2002
.pdfУ меня в диалоговом окне UserForm находится 12 элементов управления CommandButton. Как создать единый макрос, который будет вызываться при щелчке на любой из кнопок?
Для этого не существует простого способа, так как каждый элемент управления Command- Button имеет собственную процедуру C l i c k . Одним из решений является вызов дополнительной процедуры из каждой процедуры обработки события CommandButton_click. Другое решение — это создание модуля класса для получения нового объекта (см. главу 15).
Существует ли способ отобразить диаграмму в диалоговом окне UserForm?
Непосредственного способа получения такой диаграммы нет. Одним из решений является использование макроса, который сохраняет диаграмму в виде файла формата GIF и загружает файл GIF в элемент управления Image.
Как удалить кнопку X из строки заголовка диалогового окна UserForm? Мне необходимо лишить пользователя возможности закрывать диалоговое окно с помощью этой кнопки
Удаление кнопки Закрыть из строки заголовка диалогового окна UserForm требует использования нескольких сложных функций Windows API. Более простым решением будет перехват всех попыток закрыть диалоговое окно. Воспользуйтесь процедурой UserForri _ QueryClose, которая находится в модуле кода диалогового окна UserForm. Следующий пример иллюстрирует результат того> что пользователь не может закрыть диалоговое окно с помощью кнопки Закрыть.
Private Sub UserForm_QueryClose _
(Cancel As Integer, CloseMode As integer) If CloseMode = vbFormControlMenu Then
MsgBox "Вы не можете закрыть окно этим способом." Cancel = True
End If End Sub
Я создал диалоговое окно UserForm, элементы управления которого связаны с ячейками рабочего листа с помощью свойства ControlSource. Существует ли более удачный способ получения подобного результата?
Рекомендуется избегать использования ссылок на ячейки рабочего листа, кроме случаев, когда это действительно необходимо. Создание таких ссылок приводит к замедлению работы приложения, гак как рабочий лист пересчитываете^ каждый раз, когда элемент управления вносит изменения в связанную ячейку.
Существует ли способ создания массива элементов управления для диалогового окна UserForm? Это можно сделать в Visual Basic 6.0, но я не могу понять, как это делается в VBA.
Массив элементов управления создать нельзя, но можно создать массив объектов C o n t r o l . Следующий код создает массив, который содержит элементы управления CommandButton.
Private Sub UserForm_Initialize() Dim Buttons () As CoiwnandButton Cnt = 0
For Each Ctl In UserForml.Controls
ЧастьVII.Другиетемы |
729 |
If TypeName(Ctl) = "CommandButton" Then
Cnt = Cnt + 1
ReDim Preserve Buttons(1 To Cnt)
Set Buttons (Cnt) = Ct:l
End If
Next Ctl
End Sub
Существует ли разница между скрытием диалогового окна UserForm и его выгрузкой из памяти?
Да. Метод Hide оставляет диалоговое окно UserForm в памяти, но делает его невидимым. Оператор Unload выгружает диалоговое окно, начиная процесс "уничтожения" (вызывая событие T e r m i n a t e объекта UserForm) и удаляя диалоговое окно UserForm из памяти.
Как обеспечить отображаемость диалогового окна UserForm в момент выполнения пользователем других действий?
По умолчанию каждое диалоговое окно UserForm отображается в модальном режиме. Это означает, что перед началом других действий диалоговое окно необходимо закрыть. Начиная с Excel 2000, можно создавать немодальные диалоговые окна UserForm. Для этого методу Show передается аргумент vbModeless . Ниже приведен пример такого оператора:
UserFormi.Show vbModeless
Excel выдает сообщение об ошибке компиляции, когда я вызываю метод UserFormi .Show с параметром vbModeless. Как можно создавать немодальные окна в Excel 2002, оставляя их модальными в Excel 97?
Необходимо проверить, какая версия Excel используется для запуска приложения, после чего по результатам проверки запустить соответствующую процедуру. Следующий код демонстрирует этот способ.
Sub ShowUserForm()
If Val {Application .Version) >== 9 Then ShowModelessForm
Else
UserFonnl. Show End If
End Sub
Sub ShowModelessForm () Dim frm As Object Set frm = UserFormi
frm.Show 0 ' vbModeless End Sub
Так как процедура ShowModelessForm не выполняется в Excel 97, она не приведет к появлению ошибки компиляции.
Мне необходимо отобразить индикатор текущего состояния, пока происходит долгий процесс установки приложения. Как это сделать?
Воспользуйтесь диалоговым окном UserForm. В главе 15 описано несколько способов создания индикаторов текущего состояния, в том числе постепенное увеличение длины прямоугольника, в течение длительного процесса.
730 |
Глава 30. Часто задаваемые вопросы о программировании в Excel |
Как воспользоваться средствами рисования Excel, чтобы добавить простые рисунки в диалоговое окно UserForm?
Инструменты рисования нельзя использовать непосредственно с пользовательскими диалоговыми окнами, но их можно применять косвенно. Начните с создания рисунка на рабочем листе. После этого выделите рисунок и выберите Правка^Копировать. Активизируйте диалоговое окно UserForm и вставьте в него объект Image. Нажмите клавишу <F4> для отображения окна Properties. Выберите свойство P i c t u r e и нажмите комбинацию клавиш <Ctrl+V>, чтобы разместить содержимое буфера обмена в элемент управления Image. Кроме того, вам может понадобиться установить свойство A u t o S i z e в значение True.
Как создать список файлов и папок в диалоговом окне UserForm, чтобы пользователь мог выбрать один из файлов?
Создавать такое диалоговое окно UserForm нет необходимости. Для этого существует метод VBA GetOpenFilename . Он отображает диалоговое окно, в котором пользователь может выбрать диск, папку и файл.
У меня есть несколько файлов Lotus 1-2-3 для Windows и Quattro Pro для Windows, которые содержат пользовательские диалоговые окна. Существует ли утилита для преобразования этих диалоговых окон в диалоговые окна Excel?
Нет, не существует.
Мне необходимо объединить строки и отобразить их в элементе управления ListBox. Но при выполнении этой операции строки отображаются с неправильным выравниванием. Как добиться одинакового выравнивания?
Одним из решений является использование моноширинного шрифта, например Courier New. Но лучше настроить элемент управления L i s t B o x на форматирование в два столбца (дополнительная информация приведена в главе 14).
Существует ли возможность отображения встроенного диалогового окна Excel с помощью кода VBA?
Многие (но не все) диалоговые окна Excel могут быть отображены с помощью метода A p p l i c a t i o n . D i a l o g s . Например, следующий оператор отображает диалоговое окно, которое позволяет форматировать числа в ячейках: •
Application.Dialogs(xlDialogFormatNumber).Show
Для просмотра констант, соответствующих встроенным диалоговым окнам, можно воспользоваться окном Object Browser. В редакторе VBE нажмите клавишу <F2>, выберите библиотеку Excel и найдите опцию x l D i a l o g . Скорее всего, для поиска необходимой константы вам придется воспользоваться методом проб и ошибок.
Я попытался применить методику, описанную в предыдущем вопросе, но получил сообщение об ошибке. Почему?
Метод D i a l o g s завершится неудачно, если его вызвать в неподходящем контексте. Например, если попытаться отобразить диалоговое окно Тип диаграммы (xlDialogChartType), когда диа|рамма не активизирована, то будет выведено сообщение об ошибке.
ЧастьVII,Другиетемы |
731 |
Каждый раз при создании диалогового окна UserForm я добавляю кнопки ОК и Отмена. Существует ли способ автоматического добавления этих элементов управления?
Да. Настройте диалоговое окно UserForm, чтобы оно содержало все элементы управления, которые используются наиболее часто. После этого выберите File^Export File (Файл=*Экспорт файла) для сохранения этого диалогового окна. Когда возникнет необходимость добавить новое диалоговое окно в проект, выберите команду File^lmport File (Файл1*Импорт файла).
Существует ли возможность создания диалогового окна UserForm без строки заголовка?
Нет. Самое большее, что можно сделать, — это очистить строку заголовка, указав в качестве значения его свойства C a p t i o n пустую строку.
Я записал макрос VBA, предназначенный для выполнения операции печати в файл. Но в коде отсутствует способ указания имени файла и выдается сообщение о необходимости ввести имя файла.
Эта распространенная проблема была решена в Excel 2000. В Excel 2000 и более поздних версиях можно указать аргумент PrToFileName метода P r i n t o u t . Ниже приведен пример использования данного метода:
ActiveSheet.Printout PrintToFile:=True, _ PrToFileName:="test.prn"
Когда я щелкаю на кнопке в диалоговом окне UserForm, ничего не происходит. Что я делаю неправильно?
Элементы управления, добавленные в диалоговое окно UserForm, не выполняют никакой функции, пока им не будет предоставлена процедура обработки события. Эти процедуры должны располагаться в модуле кода диалогового окна UserForm, а также иметь соответствующие имена.
Могу ли я создать диалоговое окно, размер которого будет оставаться постоянным, независимо от текущего разрешения экрана?
Да, такое диалоговое окно можно создать, но стоит ли этот результат затраченных усилий? Рекомендуется создать код, который определяет разрешение экрана и использует свойство Zoom диалогового окна UserForm для изменения его размера. Чтобы избежать подобной проблемы, все диалоговые окна разрабатываются для разрешения 640x480.
Существует ли возможность создания диалогового окна UserForm, которое позволяет указывать диапазон ячеек с помощью указателя мыши?
Да. Воспользуйтесь элементом управления Ref E d i t . Пример использования этого элемента управления приводится в главе 14.
Существует ли способ изменения расположения диалогового окна UserForm?
Существует. Необходимо лишь установить значения свойств Left и Тор диалогового окна UserForm. Но чтобы изменение было реализовано, установите свойство S t a r t U p P o s i t i o n в значение 0.
732 |
Глава 30. Часто задаваемые вопросы о программировании в Excel |
Можно ли добавить в рабочую книгу диалоговый лист Excel 5/95?
Да. Щелкните правой кнопкой мыши на любом ярлыке листа в рабочей книге и выберите из контекстного меню опцию Добавить. В диалоговом окне Вставка укажите Окно диалога Excel 5.O. Но помните, что в этой книге не приводится информация о диалоговых листах Excel 5/95.
Надстройки
Где можно найти надстройки для Excel?
Надстройки для Excel расположены в нескольких источниках.
•В Excel интегрировано несколько надстроек, которые можно использовать в любой момент.
•Дополнительные надстройки можно загрузить с узла Microsoft Office Update.
•Независимые производители создают надстройки, предназначенные для выполнения самых разных задач.
•Некоторые разработчики создают бесплатные надстройки и распространяют их через Web-узлы.
•Можно создать собственные надстройки.
Как установить надстройку?
Для этого загрузите надстройку с помощью команды Сервис^Надстройки или команды Файл^Открыть. Использовать команду С е р в и с ^ Надстройки предпочтительнее, поскольку надстройка, открытая с помощью команды Файл^Открыть, не может быть закрыта с помощью VBA.
При установке собственной надстройки с помощью диалогового окна Надстройки я не обнаружил ее имени и описания. Как добавить описание к надстройке?
Перед созданием надстройки необходимо воспользоваться командой Файл ^Свойства, чтобы открыть диалоговое окно Свойства. Перейдите на вкладку Документ. В поле Название введите текст, который должен отображаться в диалоговом окне Надстройки. В поле Комментарии введите описание надстройки. После этого можно продолжать создавать надстройку.
У меня есть несколько надстроек, которые я больше не использую, но я никак не могу разобраться, как удалить их из списка в диалоговом окне Надстройки. В чем проблема?
Странно, но неиспользуемые надстройки невозможно удалить из списка средствами Excel. Необходимо о т р е Д а к т и Р о в а т ь содержимое системного реестра и удалить ссылки на файлы надстроек, которые больше не должны использоваться. Еще один способ удаления надстроек заключается в удалении файлов, в которых хранятся надстройки. После этого при попытке открыть надстройку из диалогового окна Надстройки Excel предложит удалить надстройку из списка.
Часть Ж Другие темы |
733 |
Как создать надстройку?
Активизируйте рабочий лист и выполните Файл=>Сохранить как. После этого из выпадающего списка Тип ф а й л а выберите Надстройка Microsoft Excel (*.xla).
Я пытаюсь создать надстройку, но диалоговое окно Сохранение документа не предоставляет возможности выбрать необходимый тип файла.
Скорее всего, активный лист не является рабочим листом.
Нужно ли преобразовывать все ключевые рабочие книги в надстройки?
Нет! Несмотря на то, что надстройку можно создать на основе любой рабочей книги, не все рабочие книги подходят на эту роль. Когда рабочая книга превращается в надстройку, она становится полностью невидимой. Для большинства рабочих книг невидимость означает невозможность использования.
Существует ли необходимость в хранении двух версий рабочей книги: XLS и XLA?
В версиях до Excel 97 хранение обеих версий было необходимым. Начиная с Excel 97, это делать не обязательно. Надстройку можно легко обратно преобразовывать в рабочую книгу.
Как внести изменения в надстройку после ее создания?
Запустите редактор VBE (комбинация клавиш <Alt+Fll>) и установите свойство IsAddln объекта ThisWorkbook в значение F a l s e . Внесите все необходимые изменения, установите свойство I s A d d l n в значение T r u e и повторно сохраните файл.
Какая разница между файлом XLS и файлом XLA, который создан на основе файла XLS? Откомпилирован ли файл XLA? Может, он работает быстрее?
Между данными файлами не существует особой разницы, и прирост в быстродействии несущественен. Код VBA всегда "компилируется" перед выполнением. Это касается как файлов XLS, так и файлов XLA. Но файлы XLA содержат код VBA, а не откомпилированный код.
Как защитить код надстройки от просмотра пользователями?
Запустите редактор VBE и выберите Tools^xxxx Properties (Сервис^ Свойства хххх)
(где хххх — название проекта). Перейдите на вкладку Protection (Защита) и установите флажок Lock project from viewing (Блокировать просмотр проекта), затем введите пароль.
Защищены ли мои надстройки? Другими словами, если я распространяю файл XLA, можно ли быть уверенным, что больше никто не увидит мой исходный код?
Надстройку можно защитить с помощью пароля. Это предотвратит доступ к исходному коду для большинства пользователей. Новые версии Excel имеют улучшенные возможности по обеспечению безопасности, но остается вероятность взлома пароля с помощью целого ряда утилит. Если это вас не устраивает, то обратитесь к другому способу распространения приложений.
734 |
Глава 30. Часто задаваемые вопросы о программировании в Excel |
Объекты CommandBar
Я связал с кнопкой на панели инструментов макрос. Будет ли выполняться другой макрос, если пользователь, щелкая на этой кнопке, удерживает клавишу <Shift>?
Да. Для этого необходимо воспользоваться функцией Windows API. Дополнительная информация приводится в главе 11,
Excel 95 содержал удобный редактор меню, но в Excel 97 и более поздних версиях его нет. Почему?
Начиная с Excel 97, панели инструментов и меню Excel стали полностью другими. Теперь они представляются объектами CommandBar. Редактор меню выведен из состава Excei, поэтому для редактирования меню и панелей инструментов необходимо использовать диалоговое окно Настройка (выберите команду Сервис1 *Настройка).
Можно ли редактировать меню, которые созданы в редакторе меню Excel 95?
Да, но лишь посредством Excel 95.
После редактирования меню с помощью диалогового окна Настройка изменения сохранены и используются постоянно. Как можно внести изменения в меню только для одной рабочей книги?
Вносите изменения с помощью кода VBA, когда рабочая книга загружается, и восстанавливайте меню с помощью кода VB А, когда рабочая книга выгружается из памяти.
Я знаю, как можно использовать свойство Faceld для определения изображения на элементе управления. Но какое значение свойства Faceld относится к конкретному изображению?
Microsoft не предоставляет способа получения этой информации, но существует несколько утилит, которые позволяют легко идентифицировать значения свойства F a c e l d для изображений. В главе 22 приводится пример полезной надстройки.
Я присоединил новую версию панели инструментов к рабочей книге, но Excel продолжает отображать старую версию. Как заставить Excel использовать новую версию?
Когда Excel открывает рабочую книгу, к которой присоединена панель инструментов, существующая панель инструментов не замешается. Лучшим решением будет использование кода VBA. который создает панель инструментов "на лету" при открытии рабочей книги и удаляет эту панель инструментов при закрытии рабочей книги. Кроме того, можно присоединить панель инструментов к рабочей книге и создать код VBA, который будет удалять панель инструментов при закрытии рабочей книги.
ЧастьVII.Другиетемы |
735 |
Я внес большое количество изменений в панели инструментов Excel. Как вернуть панели инструментов в первоначальное состояние?
Для этого воспользуйтесь диалоговым окном Настройка и сбросьте каждую панель инструментов вручную. Также можно обратиться к следующей процедуре:
Sub ResetAllToolbarsO
For Each tb In CoimandBars
If tb.Type = msoBarTypeWcrmal Then If tb.Builtln Then tb.Reset
End If Next tb
End Sub
Заметим, что эта процедура удаляет все изменения в панелях инструментов, даже те, которые внесены надстройками.
Расскажите о способах отображения собственного меню при активизации определенной рабочей книги.
Необходимо воспользоваться событиями WorkbookActivate и WorkbookDeactivate. Другими словами, необходимо создать процедуру, расположенную в модуле кода объекта ЭтаКнига, которая скрывает меню, когда рабочая книга деактивизируется, и отображает меню, когда рабочая книга активизируется.
Как добавить разделитель между двумя кнопками на панели инструментов?
Установите свойство BeginGroup элемента управления, расположенного после разделителя, в значение True.
Как отобразить флажок напротив опции меню?
Флажок, отображаемый возле опиии меню, управляется с помощью свойства State. Следующий оператор отображает флажок возле опции меню My Item. CommandBars(l).Commands("MyMenu"). _
Commands("My Item").State = msoButtonDown
Для того чтобы сбросить флажок возле опции меню, необходимо установить свойство State в значение msoButtonUp.
Я случайно удалил некоторые опции меню рабочего листа и теперь не могу их вернуть. Перезапуск Excel проблему не решает
Выберите Сервис^Настройка и перейдите в диалоговом окне Настройка «а вкладку Панели инструментов. Выберите Строка меню листа и щелкните на кнопке Сброс.
Как отключить отображение всех контекстных меню?
Для этого воспользуйтесь следующей процедурой.
Sub DisableAllShortcutMenusO Dim cb As CommandBar
For Each cb In CommandBars
If cb.Type = msoBarTypePopup Then _ cb.Enabled = False
Next cb End Sub
73S |
Глава 30. Часто задаваемые вопросы о программировании в Excel |
Существует ли способ отключить контекстные меню, которые отображаются при щелчке правой кнопкой мыши?
Да. Для этого рекомендуется воспользоваться следующим оператором: CommandBars("Toolbar List").Enabled = False
Я только что ввел оператор CommandBarsC'Toolbar List").Enabled = False, и в моей системе он не сработал!
Этот оператор не работает в исходной версии Excel 97. Данная ошибка исправлена в Excel 97 версии SR-1.
ЧастьVII.Другиетемы |
737 |

Информационные
ресурсы, посвященные Excel
Если |
информация, изложенная в этой книге, оказалась |
|
вам полезной, то я выполнил свою задачу. Но книга, |
к сожалению, не является исчерпывающим источником информации. Кроме того, время от времени возникают ковые вопросы, поэтому всегда необходимо оставаться в курсе событий. Таким образом, я собрал список ресурсов, которые помогут читателям повысить свою квалификацию как разработчика приложений для Excel. Эти ресурсы разделены на три категории.
•Техническая поддержка со стороны фирмы Microsoft.
•Группы новостей.
•Web-узлы.
Техническая поддержка
со стороны фирмы Microsoft
"Техническая поддержка" — это распространенный термин. Он означает поддержку производителя программного обеспечения. В данном случае речь идет о поддержке, непосредственно предоставляемой фирмой Microsoft. Техническая поддержка Microsoft реализуется в нескольких формах.
Вариантыподдержки
Для того чтобы ознакомиться с доступными вариантами поддержки, выберите команду Справка^О программе. По-
Iеле этого щелкните на кнопке Поддержка. В результате будет открыто диалоговое окно, которое содержит список типов технической поддержки, предоставляемых фирмой Microsoft. В число этих типов входит платная и бесплатная поддержка.