Немодальная форма vba excel

Modeless UserForms allows you to interact with Excel while the form is open and visible. This means that you can select cells, enter data, move to other worksheets, run new macros, and do everything you would normally do in Excel, all while the form is open and visible.

By default, UserForms are Modal, which means that when they are open you cannot do anything else in Excel except to interact with that form; this also means that no macros will run unless initiated by the form that is visible. This is the normal operation for forms.

Here, you will learn how to make Modeless UserForms, which will include how to do it with and without VBA.

Sections:

How to Make a Modless Form By Hand

How to Make a Modless Form with Code

Meaning of Modeless UserForms

Notes

How to Make a Modless Form By Hand

VBA Window (Alt+F11) > Select the UserForm > Look to the Properties window (F4) > Change the ShowModal property to False.

ba9dbd1cb2fd8716226fddeaf578afc9.png

How to Make a Modless Form with Code

UserForm1.Show vbModeless

vbModeless is what tells Excel to make the form Modeless.

You put this after the line that you use to display the form.

In this example, this code is contained within a module and looks like this:

Sub ShowUserForm()

UserForm1.Show vbModeless

End Sub

You do not have to put any additional code within the code section for the UserForm itself; merely add vbModeless after .Show in the macro that is used to show the form. 

In the sample file for this tutorial, this particular code is attached to a button that runs the form.

Meaning of Modeless UserForms

When you have a Modal form, the default kind of form, where you cannot do anything in Excel while the form is visible, no code in Excel will be run unless initiated by the UserForm.

This means that if you have any code after the line that displays the form, none of that code will run until after the form is closed.

However, if you use a modeless form, code within Excel will continue to run after the form is made visible.

We can test this by putting code for a small popup window after the code that runs the form.

Default Modal Form with MsgBox

Sub ShowUserForm()

UserForm1.Show

'Try to display a message box after the form is initialized.
MsgBox "Hi!"

End Sub

Run this code and the message box will not appear until after you close the form.

Modeless Form with MsgBox

Sub ShowUserForm()

UserForm1.Show vbModeless

'Try to display a message box after the form is initialized.
MsgBox "Hi!"

End Sub

Run this code and you will see the msgbox appear over the form because code execution was not paused while the form was displayed.

6c85857f9ce37e374090c2f9f3d82de1.jpg

Notes

If you are not familiar with how to run or startup a UserForm, please read our tutorial on showing a UserForm.

The concept of Modal and Modeless forms might be a little confusing at first, so I highly recommend that you download the sample file and play around with these examples. The code to launch the form is placed within a regular macro in a module and attached to a button within the worksheet.

Similar Content on TeachExcel

UserForm Properties List and Explanation

Tutorial: This is a listing of all properties for the UserForm in Excel. Each property includes an e…

Make a UserForm in Excel

Tutorial: Let’s create a working UserForm in Excel.
This is a step-by-step tutorial that shows you e…

UserForm Events

Tutorial: Explanation of UserForm Events in Excel. This includes what they are, how to use them, and…

UserForm Controls

Tutorial: This tutorial gives you an overview of what a UserForm Control is and how to add them to y…

Use Macros with UserForms

Tutorial: This tutorial explains how macros interact with UserForms.
This includes an explanation of…

Showing a UserForm

Tutorial: How to display a UserForm in Excel and some common things you might want to do when you di…

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

В настоящей заметке рассматриваются методы создания пользовательских форм и работы с ними.[1] Пользовательские диалоговые окна создаются на основе технологии пользовательских форм, к которым можно получить доступ из редактора Visual Basic (VBE; подробнее см. Настройка среды Visual Basic Editor).

Рис. 1. Окно новой пустой формы UserForm

Скачать заметку в формате Word или pdf, примеры в формате архива

Стандартная последовательность шагов при этом следующая:

  1. Вставьте новую форму UserForm в проект VBAProject рабочей книги.
  2. Добавьте элементы управления в форму UserForm.
  3. Настройте свойства добавленных элементов управления.
  4. Создайте процедуры «обработчики событий» для элементов управления. Эти процедуры добавляются в модуль кода UserForm и выполняются при возникновении различных событий (например, при щелчке на кнопке).
  5. Разработайте процедуру, которая отображает форму UserForm. Эта процедура находится в модуле VBA (а не в модуле кода для формы UserForm).
  6. Определите простой способ вызова на выполнение процедуры, созданной в п. 5. Можно поместить кнопку на рабочий лист, команду ленты и т.д.

Рассмотрим эти шаги подробнее.

Вставка новой формы UserForm

Чтобы добавить в проект форму UserForm, запустите VBE (например, нажав в Excel клавиши <Alt+F11>), выберите рабочую книгу в окне Project и выполните команду Inserts –> UserForm). Формы UserForm получают такие имена, как UserForm1, UserForm2 и т.д. Можно переименовать форму, изменив свойство Name в окне Properties (см. рис. 1). Если это окно не отображается, нажмите в VBE клавишу <F4>. В рабочей книге может быть произвольное количество форм UserForm, а каждая форма включает единственное пользовательское диалоговое окно.

Добавление элементов управления в пользовательское диалоговое окно

Чтобы добавить элементы управления в форму UserForm, воспользуйтесь панелью Toolbox. Обратите внимание, что в VBE отсутствуют команды меню, предназначенные для добавления элементов управления. Если панель Toolbox не отображена на экране, пройдите по меню View –> Toolbox (рис. 2).

Рис. 2. Окно Toolbox для добавления элементов управления в пользовательскую форму

Щелкните на той кнопке в панели Toolbox, которая соответствует добавляемому элементу управления. После этого щелкните внутри диалогового окна для создания элемента управления (используется размер элемента по умолчанию). Также можно щелкнуть на элементе управления и, перетащив его границы в диалоговом окне, задать необходимый размер в пользовательском диалоговом окне. Добавленному элементу управления назначается имя, которое состоит из названия типа элемента управления и числового кода. Рекомендуется их переименовать, чтобы в коде VBA было понятно, с чем вы имеете дело. Согласитесь, что РrоductListBox звучит лучше, чем ListBox1.

Элементы управления в окне Toolbox

Форма UserForm, которая показана на рис. 3, размещена в файле all userform controls.xlsm.

Рис. 3. Эта форма UserForm содержит 15 элементов управления

Элемент управления CheckBox (6) предоставляет пользователю возможность выбрать один из двух вариантов: включить или выключить. Если галочка установлена, то CheckBox имеет значение True, в противном случае – False.

ComboBox (4) подобен объекту ListBox (5). Отличие заключается в том, что ComboBox представляет раскрывающийся список, в котором в определенный момент времени отображается только одно значение. Кроме того, пользователю в поле списка разрешено вводить значение, которое необязательно представляет одну из опций объекта ComboBox.

Каждое создаваемое диалоговое окно будет иметь как минимум один элемент управления CommandButton (10). Обычно используются кнопки ОК и Отмена.

Элемент управления Frame (9) применяется в качестве оболочки для других элементов управления. Он добавляется в диалоговое окно либо в целях эстетики, либо из соображений логического группирования однотипных элементов управления. Элемент управления Frame требуется в случае, если в диалоговом окне содержится более одного набора элементов управления OptionButton.

Элемент управления Image (15) используется для представления графического изображения, которое сохранено в отдельном файле или вставляется из буфера обмена. Графическое изображение сохраняется вместе с рабочей книгой. Таким образом, вместе с рабочей книгой передавать другому пользователю копию графического файла необязательно. Некоторые графические файлы занимают много места, поэтому их включение в рабочую книгу приведет к радикальному увеличению ее размера.

Элемент управления Label (2) отображает текст в диалоговом окне.

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

Элемент управления MultiPage (12) позволяет создавать диалоговые окна с несколькими вкладками, которые подобны появляющимся после выбора команды Формат ячеек. По умолчанию элемент управления MultiPage состоит из двух вкладок.

Элемент управления OptionButton (7) применяется при выборе пользователем одного варианта из нескольких. Эти элементы управления всегда группируются в диалоговом окне в наборы, содержащие не менее двух опций. Когда один элемент управления OptionButton выбран, все остальные элементы управления OptionButton текущей группы автоматически становятся неактивными. Если в пользовательском диалоговом окне содержится более одного набора элементов управления OptionButton, то каждый из таких наборов должен иметь собственное значение свойства GroupName. В противном случае все элементы управления OptionButton в диалоговом окне рассматриваются как члены одной группы. Также можно вставить элементы управления OptionButton в объект Frame, что приведет к их автоматическому группированию.

Элемент управления RefEdit (16) используется тогда, когда пользователь должен выделить диапазон ячеек на листе.

Элемент управления ScrollBar (13) в некотором смысле подобен элементу управления SpinButton. Разница заключается в том, что пользователь может перетаскивать ползунок объекта ScrollBar для изменения значения с большим приращением. Элемент управления ScrollBar рекомендуется использовать при выборе значения из большого диапазона.

Элемент управления SpinButton (14) позволяет выбрать значение после щелчка на одной из двух кнопок со стрелками. Одна из них применяется для увеличения значения, а вторая — для уменьшения. Элемент управления SpinButton часто используется совместно с элементами управления TextBox и Label, которые содержат текущее значение элемента управления SpinButton.

Элемент управления TabStrip (11) подобен элементу управления MultiPage, однако использовать его сложнее. Элемент управления TabStrip, в отличие от MultiPage, не выступает контейнером для других объектов. Как правило, элемент управления MultiPage обладает более широкими возможностями.

Элемент управления TextBox (3) позволяет пользователям вводить текст в диалоговом окне.

Элемент управления ToggleButton (8) имеет два состояния: включен и выключен. Щелчок на кнопке приводит к изменению состояния на противоположное и к изменению внешнего вида кнопки. Этот элемент управления может иметь значение True (активен) или False (неактивен). Он не относится к «стандартным» элементам управления, поэтому использование двух элементов управления OptionButton или одного CheckBox может оказаться более удачным вариантом.

Использование элементов управления на рабочем листе

Элементы управления пользовательскими диалоговыми окнами могут встраиваться в рабочий лист (без использования UserForm). Доступ к элементам управления можно получить, пройдя в Excel Разработчик –> Элементы управления –> Вставить. Для использования подобных элементов в составе рабочего листа требуется гораздо меньше усилий, чем для создания пользовательского диалогового окна. Кроме того, в данном случае можно не создавать макросы, поскольку элемент управления можно связать с ячейкой рабочего листа.

Например, если на рабочий лист вставить элемент управления CheckBox, его можно связать с нужной ячейкой, задав свойство LinkedCell. Если флажок установлен, в связанной ячейке отображается значение ИСТИНА. Если же флажок сброшен, то в связанной ячейке отображается значение ЛОЖЬ. Например, на рис. 4 переключатель «Фикс. Ставка 20%» связан с ячейкой Н15. Рисунок отображает рабочий лист, содержащий некоторые элементы управления ActiveX (см. файл activex worksheet controls.xlsx). Книга включает связанные ячейки и не содержит макросов.

Рис. 4. Элементы управления ActiveX без макросов

Элементы управления на рабочем листе могут происходить из двух источников:

  • Элементы управления формами. Эти элементы управления являются внедряемыми объектами.
  • Элементы управления ActiveX. Эти элементы управления являются подмножеством элементов, доступных в пользовательских диалоговых окнах.

Эти элементы управления работают не одинаково. После добавления элемента управления ActiveX в рабочий лист Excel переходит в режим конструктора. В этом режиме можно настраивать свойства любого элемента управления рабочего листа, добавлять или изменять процедуры обработки событий для элемента управления, а также изменять его размер или положение. Для отображения окна свойств элемента управления ActiveX воспользуйтесь командой Разработчик –> Элементы управления –> Свойства.

Для создания простых кнопок можно использовать элемент управления Button (Кнопка), который находится на панели инструментов Формы (Form). В этом случае обеспечивается возможность запуска макроса. Если же воспользоваться элементом управления CommandButton, который относится к группе элементов управления ActiveX, то после щелчка на нем вызывается связанная процедура обработки событий (например, CommandButton1_Click), которая находится в модуле кода объекта Лист (Sheet). Связать макрос с этой процедурой нельзя.

Если Excel находится в режиме конструктора, тестирование элементов управления невозможно. В этом случае нужно выйти из режима конструктора, щелкнув на кнопке Разработчик –> Элементы управления –> Режим конструктора. Эта кнопка работает, как переключатель.

Настройка элементов управления пользовательского диалогового окна

Продолжим описание использования элементов управления в UserForm. После того, как элементов управления помещен в диалоговое окно, его можно переместить и изменить размер. Можно выделить несколько элементов управления. Для этого следует удерживать нажатой клавишу <Shift> и щелкать на объектах либо обвести указателем мыши необходимые элементы управления.

В форме UserForm содержатся вертикальные и горизонтальные направляющие, которые помогают выровнять добавленные в диалоговое окно элементы управления. При добавлении или перемещении элемент управления привязывается к направляющим, что облегчает упорядочение таких элементов в окне. Если вы не используете направляющие, можете их отключить, выбрав в VBE команду Tools –> Options. В диалоговом окне Options перейдите на вкладку General и выберите соответствующие параметры в разделе Form Grid Settings.

Меню Format окна VBE предоставляет несколько команд, которые позволяют точно разместить и выровнять элементы управления в диалоговом окне. Перед использованием этих команд необходимо указать элементы управления, к которым они будут применяться (рис. 5).

Рис. 5. Выравнивание элементов в форме UserForm

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

Изменение свойств элементов управления

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

  • В момент проектирования при разработке пользовательского диалогового окна. Для этого используется окно Properties.
  • В процессе выполнения, когда пользовательское диалоговое окно отображается на экране. Для этого воспользуйтесь инструкциями VBA.

Работа с окном Properties. В VBE окно Properties позволяет изменять свойства выделенного элемента управления (это может быть обычный элемент управления или сама форма UserForm, рис. 6).

Рис. 6. Окно Properties для выделенного элемента управления OptionButton

В окне Properties есть две вкладки. На вкладке Alphabetic свойства выбранного объекта отображаются в алфавитном порядке. На вкладке Categorized эти свойства сгруппированы по категориям. Обе вкладки отображают одни и те же свойства.

Для того чтобы изменить свойство, необходимо щелкнуть на нем и ввести новое значение. Некоторые свойства могут принимать только ограниченный набор допустимых значений, выбираемых из соответствующего списка. После щелчка на таком свойстве в окне Properties будет отображена кнопка со стрелкой, указывающей вниз. Щелкните на этой кнопке, чтобы выбрать значение из предложенного списка. Например, свойство TextAlign может принимать одно из следующих значений: 1 — fmTextAlignLeft, 2 — fmTextAlignCenter и 3 — fmTextAlignRight.

После выделения отдельных свойств (например, Font и Picture) рядом с ними отображается небольшая кнопка с троеточием. Щелчок на этой кнопке приводит к вызову диалогового окна настройки свойства.

Для свойства Picture элемента управления Image необходимо указать графический файл или вставить изображение из буфера обмена. В последнем случае следует сначала скопировать его в буфер обмена, а затем выбрать свойство Picture элемента управления Image и нажать комбинацию клавиш <Ctrl+V> для вставки содержимого буфера обмена. Если выделить два или более элементов управления одновременно, в окне Properties отобразятся только те свойства, которые являются общими для этих объектов.

Объекту UserForm присущ ряд свойств, значения которых можно изменять. Эти свойства применяются в качестве значений, заданных по умолчанию, для элементов управления, которые добавляются в пользовательские диалоговые окна. Например, если изменить свойство Font пользовательского диалогового окна, все добавленные в окно элементы управления будут применять этот шрифт.

Общие свойства. Каждый элемент управления имеет как собственный набор уникальных свойств, так и ряд общих свойств, присущих другим элементам управления. Например, все элементы управления имеют свойство Name и свойства, определяющие его размер и расположение на форме (Height, Width, Left и Right). Если вы собираетесь работать с элементом управления с помощью кода VBA, присвойте ему значащее имя. Например, первый элемент управления OptionButton, который добавлен в пользовательское диалоговое окно, по умолчанию получит имя ОрtionButton1. В коде ссылка на этот объект будет выглядеть следующим образом: OptionButton1.Value = True. Но если элементу управления OptionButton присвоить описательное имя (например, obLandscape), то можно использовать такой оператор: obLandscape.Value = True.

Многие пользователи предпочитают имена, которые указывают на тип объекта. В предыдущем примере был использован префикс ob, который указывает на то, что объект является элементом управления OptionButton.

Можно изменять значения свойств нескольких элементов управления одновременно. Например, вы вправе создать на форме несколько элементов управления OptionButton и выровнять их по левому краю. Для этого достаточно выделить все элементы управления OptionButton и изменить значение свойства Left в окне Properties. Все выделенные элементы управления примут новое значение свойства Left.

Чтобы получить доступ к справочной информации о свойствах различных элементов управления, щелкните на свойстве в окне Properties и нажмите клавишу <F1>.

Советы по использованию клавиатуры. Многие пользователи предпочитают перемещаться по диалоговым окнам с помощью клавиатуры. Комбинации клавиш <Таb> и <Shift+Tab> позволяют циклически переключаться между элементами управления. Чтобы удостовериться, что диалоговое окно корректно реагирует на команды с клавиатуры, обратите внимание на такие моменты: порядок просмотра элементов управления и комбинации клавиш.

Порядок просмотра определяет последовательность, в которой активизируются элементы управления после нажатия пользователем клавиши <Таb> или комбинации клавиш <Shift+Tab>. Кроме того, порядок активизации указывает, какой элемент управления по умолчанию выделяется на форме первым. Если пользователь вводит текст в элемент управления TextBox, то этот элемент считается активным. Если после этого щелкнуть на элементе управления OptionButton, то именно он станет активным. Элемент управления, назначенный первым для просмотра, будет активным в момент открытия диалогового окна.

Для того чтобы указать порядок активизации, выберите команду View –> Tab Order. Кроме того, можно щелкнуть правой кнопкой мыши на UserForm и выбрать пункт Тab Order из появившегося контекстного меню. Excel отобразит диалоговое окно Tab Order (Порядок просмотра, рис. 7).

Рис. 7. В диалоговом окне Tab Order измените порядок просмотра элементов управления

Также можно указать порядок активизации элемента управления с помощью окна Properties (см. рис. 6, самое последнее из отраженных свойств). Первый активизируемый элемент управления будет иметь свойство Tablndex = 0. Изменение значения свойства Tablndex текущero объекта приведет к изменению значений свойств Tablndex других элементов правления. Изменения вносятся автоматически. Вы можете удостовериться в том, что значения свойства Tablndex всех элементов управления не больше количества элементов управления в диалоговом окне. Если нужно удалить элемент управления из списка активизируемых объектов, то присвойте его свойству TabStop значение False.

Одни элементы управления, такие как Frame и MultiPage, служат контейнерами для других элементов управления. Элементы управления в таком контейнере имеют собственный порядок просмотра (активизации). Для установки порядка просмотра группы элементов управления OptionButtons, находящихся внутри элемента управления Frame, выделите элемент управления Frame до того, как будет выполнена команда View –> Tab Order.

Большинству элементов управления диалогового окна можно назначить комбинацию клавиш. Таким образом, пользователь получит доступ к элементу управления, нажав <Alt> и указанную клавишу. Применив свойство Accelerator в окне Properties, можно определить клавишу для активизации элемента управления.

Некоторые элементы управления, например, TextBox, лишены свойства Accelerator, поскольку не отображают значение свойства Caption. Но к таким элементам можно получить доступ с помощью клавиатуры, воспользовавшись свойством Label. Присвойте клавишу элементу управления Label и расположите его в порядке просмотра перед элементом TextBox.

Отображение пользовательского диалогового окна

Для того чтобы отобразить пользовательское диалоговое окно с помощью VBA, необходимо создать процедуру, которая вызывает метод Show объекта UserForm. Форму UserForm невозможно отобразить, не выполнив как минимум одну строку кода VBA:

Sub ShowForm()

     UserForm1.Show

End Sub

Данная процедура должна располагаться в стандартном модуле VBA, а не в модуле формы UserForm. При отображении пользовательская форма остается на экране до тех пор, пока ее не скроют. Обычно в нее добавляют элемент управления CommandButton, который запускает процедуру закрытия формы. Эта процедура либо выгружает пользовательскую форму с помощью метода Unload, либо удаляет ее с экрана с помощью метода Hide объекта UserForm.

Отображение немодальной формы. По умолчанию отображается модальная форма. Это означает, что форма должна исчезнуть с экрана прежде, чем пользователь выполнит какие-либо действия на рабочем листе (т.е. редактирование данных невозможно). Немодальную форму также можно отобразить. В этом случае вы вправе продолжать работу в Excel, не скрывая саму форму. Для отображения немодальной формы используется следующий синтаксис:

UserForm1.Show vbModeless

Тестирование пользовательского диалогового окна. Обычно в процессе разработки возникает необходимость в тестировании формы UserForm. Для этого можно воспользоваться одним из способов:

  • выполните команду Run –> Run Sub/UserForm;
  • нажмите <F5>;
  • щелкните на кнопке Run Sub/UserForm, которая находится на стандартной панели инструментов.

Выбор одного из этих методов приводит к запуску события инициализации диалогового окна. Как только диалоговое окно будет отображено в тестовом режиме, можно проверить порядок активизации объектов, а также поддержку комбинаций клавиш.

Отображение пользовательского диалогового окна на основе значения переменной. В некоторых случаях приходится выбирать, какое окно UserForm будет отображено. Если название пользовательского диалогового окна хранится в виде строковой переменной, можно воспользоваться методом Add для добавления объекта UserForm в коллекцию UserForms с последующим обращением к методу Show из коллекции UserForms. В приведенном ниже примере название объекта UserForm присваивается переменной MyForm, после чего отображается пользовательское диалоговое окно.

MyForm = «UserForm1»

UserForms.Add(MyForm).Show

Загрузка пользовательского диалогового окна. В VBA поддерживается оператор Load. Загрузка пользовательского диалогового окна приводит к сохранению объекта формы в памяти. Однако до тех пор пока не будет выполнен метод Show, форма останется невидимой для остальной части программы. Для загрузки окна UserForm1 воспользуйтесь оператором:

Load UserForm1

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

О процедурах обработки событий. Как только диалоговое окно появляется на экране, пользователь начинает с ним взаимодействовать, т.е. генерирует события. Например, щелчок на элементе управления CommandButton приводит к возникновению события Click объекта CommandButton. Вам необходимо создать процедуры (обработчики событий), которые будут выполняться при возникновении соответствующих событий.

Процедуры обработки событий находятся в модуле кода объекта UserForm. Наряду с этим процедура обработки события может вызывать другие процедуры, которые находятся в стандартном модуле VBA.

В коде VBA можно изменять свойства элементов управления, пока пользовательское диалоговое окно отображается на экране (т.е. на этапе выполнения). Например, можно назначить элементу управления ListBox процедуру, которая изменяет текст элемента управления Label при выборе элемента списка.

Закрытие пользовательского диалогового окна

Для закрытия формы UserForm1 воспользуйтесь командой: Unload UserForm1. Если же код находится в модуле кода формы UserForm, воспользуйтесь оператором: Unload Me. В этом случае ключевое слово Me применяется для идентификации пользовательской формы.

Обычно в коде VBA команда Unload выполняется только после того, как форма UserForm выполнит все свои функции. Например, форма UserForm может содержать элемент управления CommandButton, который используется в качестве кнопки ОК. Щелчок на этой кнопке приводит к выполнению заранее определенного макроса. Одна из функций макроса заключается в выгрузке формы UserForm из памяти. В результате пользовательское диалоговое окно отображается на экране до тех пор, пока макрос, содержащий оператор Unload, не завершает свою работу.

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

Окно формы UserForm автоматически выгружается из памяти после того, как пользователь щелкает на кнопке Закрыть (обозначается символом х в заголовке окна). Это действие также приводит к возникновению события QueryClose объекта UserForm, за которым следует событие Terminate пользовательского диалогового окна. Объект UserForm может использовать метод Hide. После его вызова диалоговое окно исчезает, но остается в памяти, поэтому в коде можно получить доступ к различным свойствам элементов управления:

UserForml.Hide

Если ваш код находится в модуле кода объекта UserForm, можно воспользоваться оператором:

Me.Hide

Если по какой-либо причине пользовательское диалоговое окно должно быть немедленно скрыто в процессе выполнения макроса, воспользуйтесь методом Hide в самом начале процедуры, а затем укажите команду DoEvents. Например, в следующей процедуре форма UserForm немедленно исчезнет после того, как пользователь щелкнет на кнопке CommandButton1. Последний оператор процедуры выгружает пользовательское диалоговое окно из памяти.

Private Sub CommandButton1_Click()

   Me.Hide

   Application.ScreenUpdating = True

   For r = 1 To 10000

      Cells(r, 1) = r

   Next r

   Unload Me

End Sub

В рассматриваемом примере переменной ScreenUpdating присвоено значение True, в результате чего Excel полностью скрывает окно UserForm. Если этот оператор не использовать, окно UserForm остается видимым.

Пример создания пользовательского диалогового окна

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

Создание пользовательской формы. Создайте рабочую книгу, содержащую только один рабочий лист. Нажмите комбинацию клавиш <Alt+F11> для активизации VBE. В окне Project выберите проект рабочей книги и выполните команду Inserts –> UserForm. Воспользуйтесь окном Properties для изменения значения свойства Caption формы UserForm на Укажите имя и пол (если окно Properties не отображается, нажмите <F4>).

Рис. 8. Создание пользовательской формы

Добавьте элемент управления Label и настройте его свойства (рис. 9):

Свойство          Значение

Accelerator        И

Caption               Имя:

Tablndex             0

Рис. 9. Пользовательская форма с элементами управления

Добавьте элемент управления TextBox и измените его свойства:

Name                   TextName

Tablndex             1

Добавьте элемент управления Frame и измените его свойства:

Caption                Пол

Tablndex             2

Добавьте элемент управления OptionButton в состав элемента Frame и измените его свойства:

Accelerator        М

Caption              Мужчина

Name                   OptionMale

Tablndex             0

Добавьте еще один элемент управления OptionButton в состав элемента Frame и измените его свойства:

Accelerator        Ж

Caption               Женщина

Name                   OptionFemale

Tablndex             1

Добавьте элемент управления CommandButton за пределами элемента Frame и измените его свойства:

Caption                OK

Default                 True

Name                   OKButton

Tablndex             3

Добавьте еще один элемент управления CommandButton и настройте его свойства:

Caption               Отмена

Default                False

Name                   CloseKButton

Tablndex             4

При создании нескольких похожих элементов управления может оказаться, что быстрее копировать существующий элемент управления, чем создавать новый. Для копирования элемента управления удерживайте нажатой клавишу <Ctrl> при перетаскивании элемента управления, что приведет к созданию копии. После этого останется изменить свойства скопированного элемента управления.

Создание кода для отображения диалогового окна. После создания элементов управления на лист необходимо добавить элемент управления ActiveX, называемый Кнопка (CommandButton). Эта кнопка будет запускать процедуру, которая предназначена для отображения формы UserForm. Для этого выполните следующие действия:

  1. Перейдите в окно Excel (например, воспользуйтесь комбинацией клавиш <Alt+F11>).
  2. Выберите команду Разработчика –> Элементы управления –> Вставить и щелкните на значке Кнопка (CommandButton), который находится в разделе Элементы ActiveX.
  3. Разместите кнопку на рабочем листе. Чтобы измените ее подпись, щелкните на кнопке правой кнопкой мыши и выберите в контекстном меню команду Объект CommandButton –> Edit. Для изменения других свойств объекта щелкните на нем правой кнопкой мыши и выберите команду Properties.
  4. Дважды щелкните на объекте CommandButton. Это приведет к активизации VBE. При этом отобразится модуль кода для листа с открытой пустой процедурой обработки событий объекта CommandButton, который расположен на рабочем листе.
  5. Введите единственный оператор в процедуру CommandButton1_Click (рис. 10). В процедуре используется метод Show объекта UserForml для отображения пользовательского диалогового окна.

Рис. 10. Процедура CommandButton1_Click вызывается после щелчка на кнопке рабочего листа

Тестирование диалогового окна. После щелчка на кнопке, находящейся на рабочем листе, ничего не произойдет. Точнее, кнопка будет выделена, но это не приведет к инициализации каких-либо действий. Причина этого заключается в том, что программа Excel по-прежнему остается в режиме конструктора, в который она переходит автоматически после добавления элемента управления ActiveX. Для выхода из режима конструктора щелкните на кнопке Разработчик –> Элементы управления –> Режим конструктора. Если же требуется изменить кнопку, снова перейдите в режим конструктора. После выхода из режима конструктора щелчок на кнопке приведет к отображению пользовательского диалогового окна.

Когда диалоговое окно будет отображено, введите произвольный текст в текстовом поле и щелкните на кнопке ОК. В результате ничего не произойдет, что совершенно естественно, так как для объекта UserForm не создано ни одной процедуры обработки событий. Для закрытия диалогового окна щелкните на крестике в его заголовке.

Добавление процедур обработки событий. Перейдите в VBE. Удостоверьтесь в том, что пользовательское окно отображено на экране, и дважды щелкните на кнопке Отмена. Активизируется окно кода для формы UserForm, а также добавляется пустая процедура CloseButton_Click. Обратите внимание, что название процедуры состоит из имени объекта, символа подчеркивания и названия обрабатываемого события. Добавьте в процедуру единственный оператор:

Private Sub CloseButton_Click()

   Unload UserForm1

End Sub

Эта процедура, которая вызывается после щелчка на кнопке Отмена, выгружает из памяти форму UserForm1.

Щелкните на значке View Object в верхней части окна Project Explorer или дважды кликните на строке UserForm1, чтобы отобразить форму UserForm1. Дважды щелкните на кнопке ОК и введите код процедуры – обработчика событий для события Click объекта OKButton:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

Private Sub OKButton_Click()

    Dim NextRow As Long

‘   Проверка активности листа Лист1

    Sheets(«Лист1»).Activate

   Проверка ввода имени

    If TextName.Text = «» Then

        MsgBox «Введите имя.»

        TextName.SetFocus

        Exit Sub

    End If

‘   Определение следующей пустой строки

    NextRow = _

      Application.WorksheetFunction.CountA(Range(«A:A»)) + 1

   Передача имени

    Cells(NextRow, 1) = TextName.Text

‘   Передача пола

    If OptionMale Then Cells(NextRow, 2) = «Мужчина»

    If OptionFemale Then Cells(NextRow, 2) = «Женщина»

   Очистка элементов управления для ввода следующей записи

    TextName.Text = «»

    TextName.SetFocus

    OptionMale = False

    OptionFemale = False

End Sub

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

Процедура OKButton_Click работает следующим образом. Сначала она проверяет, активен ли лист Лист1, введено ли имя. После этого запускается функция Excel СЧЁТЗ (CountA) для определения следующей пустой ячейки в столбце А. Затем текст из текстового поля TextBox передается в определенную ячейку столбца А. С помощью операторов If определяется выделенный элемент управления OptionButton, что обеспечивает запись соответствующего текста в столбец В (пол). Далее элементы диалогового окна очищаются и окно перезапускается, чтобы обеспечить возможность введения следующей записи. Заметим, что щелчок на кнопке ОК не приведет к закрытию диалогового окна. Для завершения ввода данных (и выгрузки пользовательского диалогового окна) щелкните на кнопке Отмена.

Проверьте работоспособность комбинаций клавиш: Alt+М – активизирует мужской пол, Alt+Ж – женский. Рабочая книга с рассмотренным примером находится в файле get name and sex.xlsm.

События объекта User Form

Каждый элемент управления в форме UserForm (а также сам объект UserForm) разрабатывается для того, чтобы реагировать на определенные события. Эти события возникают в результате действий пользователя или генерируются программой Excel. Можно создать код, который будет выполняться при возникновении определенного события. Некоторые действия приводят к возникновению сразу нескольких событий. Например, щелчок на кнопке со стрелкой, направленной вверх, в элементе управления SpinButton приведет к возникновению события SpinUp и события Change. После того как пользовательское диалоговое окно будет отображено с помощью метода Show, Excel сгенерирует события Initialize и Activate объекта UserForm. В Excel также поддерживаются события, связанные с объектами Sheet (Лист), Chart (Диаграмма) и ThisWorkbook (ЭтаКнига).

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

  • Добавьте элемент управления в пользовательское диалоговое окно.
  • Дважды щелкните на элементе управления, чтобы открыть модуль кода для объекта UserForm. VBE вставит пустую процедуру обработки события, принятого по умолчанию.
  • Щелкните на раскрывающемся списке в правом верхнем углу окна модуля и просмотрите полный список событий, которые поддерживаются текущим элементом управления (на рис. 11 показан список событий для элемента управления CheckBox).
  • Выберите событие из списка, и VBE создаст пустой обработчик события.

Рис. 11. Список событий для элемента управления CheckBox

Имя процедуры обработки событий включает имя объекта, который сгенерировал событие. Таким образом, если изменить имя элемента управления, придется внести соответствующие изменения и в имя процедуры обработки события. Имя процедуры не изменяется автоматически! Чтобы облегчить работу, присвойте описательные имена элементам управления до того, как приступите к созданию процедуры обработки соответствующих событий.

События объекта UserForm. Несколько событий непосредственно связано с отображением и выгрузкой объекта UserForm:

  • Происходит перед загрузкой и отображением формы UserForm. Не происходит, если объект UserForm до этого был скрыт.
  • Происходит в момент активизации объекта UserForm.
  • Происходит в момент деактивизации объекта UserForm. Не происходит при сокрытии формы UserForm.
  • Происходит перед выгрузкой объекта UserForm.
  • Происходит после выгрузки объекта UserForm.

Важно правильно выбрать подходящее событие для процедуры обработки событий, а также проанализировать порядок выполнения событий. Использование метода Show приводит к возникновению событий Initialize и Activate (в указанном порядке). Применение команды Load приводит к вызову события Initialize. Команда Unload вызывает события QueryClose и Terminate (в указанном порядке). Метод Hide не приводит к вызову каких-либо событий.

В файле userform events.xlsm описанные события перехватываются и в момент возникновения события возникает окно сообщения. Если изучение событий объекта UserForm вызывает у вас затруднения, то, проанализировав код этого примера, вы получите ответы на многие вопросы.

События элемента управления SpinButton. Для того чтобы разобраться в концепции событий, мы подробно рассмотрим события, связанные с элементом управления SpinButton (рис. 12). Файл spinbutton events.xlsm демонстрирует применение событий, генерируемых объектами SpinButton и UserForm (первый содержится во втором). Рабочая книга включает несколько процедур обработки событий — по одной для каждого события элемента управления SpinButton и объекта UserForm. Каждая из этих процедур добавляет текст в столбце А с описанием события.

Рис. 12. События элемента управления SpinButton

Пользователь может управлять объектом SpinButton с помощью мыши или (если элемент управления активен) клавиш управления курсором. Когда пользователь щелкает мышью на верхней кнопке элемента управления SpinButton, происходят следующие события: Enter (генерируется только в том случае, если элемент управления неактивен); Change; SpinUp.

Пользователь может нажать клавишу <Таb> для того, чтобы сделать активным элемент управления SpinButton. Только после этого можно использовать клавиши управления курсором для изменения значения элемента управления. Если все именно так и происходит, то события генерируются в следующем порядке: Enter; KeyDown; Change; SpinUp (или SpinDown); KeyUp.

Элемент управления SpinButton может изменяться в коде VBA, что также провоцирует возникновение соответствующих событий. Например, оператор SpinButton1.Value = 0 устанавливает свойство Value элемента управления SpinButton1 равным 0, а это приводит к возникновению события Change. Такой результат достигается только в том случае, если исходное свойство Value не равно нулю.

Вы вправе предположить, что выполнить отмену генерирования событий можно, установив свойство EnableEvents объекта Application равным False. Но это свойство поддерживается только объектами, которые являются «истинными» в Excel: Workbook, Worksheet и Chart.

Совместное использование элементов управления SpinButton и TextBox. Элемент управления SpinButton имеет свойство Value, но не может отображать значение этого свойства. В большинстве случаев требуется, чтобы пользователь мог изменить значение элемента управления SpinButton непосредственно, а не многократно щелкая на элементе управления. Эффективным решением может стать объединение элемента управления SpinButton с элементом управления TextBox, что позволяет пользователю вводить значение элемента управления SpinButton непосредственно, используя для этого поле элемента управления TextBox. Кроме того, щелчок на элементе управления SpinButton позволит изменить значение, отображаемое в элементе управления TextBox.

На рис. 13 приведен пример (см. также файл spinbutton and textbox.xlsm). Свойство Min элемента управления SpinButton имеет значение 1, а свойство Мах— значение 100. Таким образом, щелчок на одной из стрелок элемента управления SpinButton приведет к изменению значения в пределах от 1 до 100. Код, реализующий «связывание» элементов управления SpinButton и TextBox сводится к созданию процедур обработки событий, которые будут синхронизировать свойство Value элемента управления SpinButton и свойство Text элемента управления TextBox.

Рис. 13. Комбинирование элементов управления SpinButton и TextBox

Представленная процедура выполняется каждый раз при возникновении события Change элемента управления SpinButton. Таким образом, процедура выполняется тогда, когда пользователь щелкает на элементе управления SpinButton или изменяет его значение, нажав одну из клавиш управления курсором.

Private Sub SpinButton1_Change()

    TextBox1.Text = SpinButton1.Value

End Sub

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

Private Sub TextBox1_Change()

    Dim NewVal As Integer

    NewVal = Val(TextBox1.Text)

    If NewVal >= SpinButton1.Min And _

        NewVal <= SpinButton1.Max Then _

        SpinButton1.Value = NewVal

End Sub

Эта процедура начинается с вызова функции VBA Val, которая преобразует текст элемента управления TextBox в числовое значение (если элемент управления TextBox содержит строку, то функция Val возвращает значение 0). Следующий оператор определяет, попадает ли значение в указанный диапазон допустимых значений. Если это так, то свойство Value элемента управления SpinButton устанавливается равным значению, которое введено в поле элемента управления TextBox.

Пример организован таким образом, что щелчок на кнопке ОК (которая называется OKButton) передает значение элемента управления SpinButton в активную ячейку. Процедура обработки события Click элемента управления CommandButton выглядит следующим образом:

Private Sub OKButton_Click()

   Enter the value into the active cell

    If CStr(SpinButton1.Value) = TextBox1.Text Then

        ActiveCell = SpinButton1.Value

        Unload Me

    Else

        MsgBox «Некорректная запись.», vbCritical

        TextBox1.SetFocus

        TextBox1.SelStart = 0

        TextBox1.SelLength = Len(TextBox1.Text)

    End If

End Sub

Данная процедура выполняет проверку: анализируются текст, введенный в поле элемента управления TextBox, и значения элемента управления SpinButton. Такая процедура обрабатывает ситуации неверного ввода данных. Например, если пользователь введет в поле элемента управления TextBox текст Зt, то значение элемента управления SpinButton не изменится, а результат, который помещается в активную ячейку, будет отличным от ожидаемого. Обратите внимание, что значение свойства Value элемента управления SpinButton преобразуется в строку с помощью функции CStr. Это позволяет предотвратить ошибку, которая возникает, когда числовое значение сравнивается с текстовым. Если значение элемента управления SpinButton не соответствует содержимому элемента управления TextBox, то на экране отображается специальное сообщение. Причем объект TextBox активен, а его содержимое — выделено (с помощью свойств SelStart и SelLength). Таким образом, пользователю проще исправить неправильные значения.

О свойстве Tag. Каждый объект UserForm и каждый элемент управления имеет свойство Tag. Оно не представляет конечные данные и по умолчанию не имеет значения. Свойство Tag можно использовать для хранения информации, которая будет применена в программе. Например, можно создать набор элементов управления TextBox в пользовательском диалоговом окне. От пользователя требуется ввести текст только в некоторые из них. В отдельные поля вводить текст необязательно. Можно применять свойство Tag для идентификации полей, которые нужно заполнять. В таком случае значение свойства Tag — это строка, например, Required. Поэтому при написании кода обработки введенных пользователем данных можно ссылаться на свойство Tag.

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

Function EmptyCount()

   Dim ctl As Control

   EmptyCount= 0

   For Each ctl In UserFormi.Controls

      If TypeName(ctl) = «TextBox» Then

         If ctl.Tag = «Required» Then

            If ctl.Text = «» Then

               EmptyCount = EmptyCount + 1

            End If

         End If

      End If

   Next ctl

End Function

Ссылка на элементы управления пользовательского диалогового окна

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

Sub GetData ()

   UserForm1.Show

End Sub

Предположим, что в диалоговом окне UserForm1 содержится текстовое поле TextBox1 и вам необходимо указать значение текстового поля по умолчанию:

Sub GetData()

   UserForm1.TextBox1.Value = «Джон Доу»

   UserForm1.Show

End Sub

Еще одним способом установки значения по умолчанию является использование события Initialize объекта UserForm. Можно написать код процедуры UserForm_Initialize, который будет располагаться в модуле кода диалогового окна:

Private Sub UserForm_Initialize()

   TextBox1.Value = «Джон Доу»

End Sub

Обратите внимание, что при обращении к элементу управления из модуля кода диалогового окна необязательно вводить в ссылку имя объекта UserForm. Подобное определение ссылок на элементы управления имеет свое преимущество: всегда можно воспользоваться средством Auto List Member, которое позволяет выбирать имена элементов управления из раскрывающегося списка.

Вместо того чтобы использовать фактическое имя объекта UserForm, предпочтительнее применить имя Me. В противном случае, если имя объекта UserForm изменится, вам придется изменять все ссылки (с его участием) в коде.

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

MsgBox UserForm1.Controls.Count

В VBA не поддерживаются коллекции для каждого типа элемента управления. Например, не существует коллекции элементов управления CommandButton. Но тип элемента управления можно определить с помощью функции TypeName. Следующая процедура использует структуру For Each для циклического просмотра элементов коллекции Controls. В результате отображается количество элементов управления CommandButton, которые входят в коллекцию элементов управления объекта UserForm1 (этот код вы найдете в файле all userform controls.xlsm).

Sub CountButtons()

    Dim cbCount As Integer

    Dim ctl As Control

    cbCount = 0

    For Each ctl In UserForm1.Controls

        If TypeName(ctl) = «CommandButton» Then _

            cbCount = cbCount + 1

    Next ctl

    MsgBox cbCount

End Sub

Настройка панели инструментов Toolbox

Если объект UserForm активен в редакторе VBE, на панели Toolbox отображаются элементы управления, которые можно добавить в пользовательское диалоговое окно. Панель Toolbox изначально содержит одну вкладку. Щелкните на ней правой кнопкой мыши и в контекстном меню выберите параметр New Page (Добавить страницу). Кроме того, можно изменить текст, который отображается на вкладке. Для этого выберите параметр Rename (Переименовать) из контекстного меню.

Рекомендуется предварительно настроить элементы управления и сохранить их для дальнейшего использования. Можно, например, в форме создать элемент управления CommandButton, который настроен на выполнение роли кнопки ОК. Можно изменять параметры кнопки: Width (Ширина), Height (Высота), Caption (Подпись), Default (По умолчанию) и Name (Имя). После этого перетащите модифицированный элемент управления CommandButton на панель инструментов Toolbox. Это приведет к созданию элемента управления. Щелкните на элементе управления правой кнопкой мыши, чтобы переименовать его или изменить значок.

Также можно создать раздел панели Toolbox, в котором будет содержаться несколько элементов управления. Например, вы вправе создать два элемента управления CommandButton, которые будут представлять кнопки ОК и Отмена. Настройте их так, как это необходимо. Затем выберите обе кнопки и переместите их на панель инструментов Toolbox. Впоследствии можно использовать новый элемент управления панели Toolbox для быстрого создания необходимых кнопок.

Этот метод также применим к элементам управления, которые используются в качестве контейнера. Например, создайте элемент управления Frame и добавьте в него четыре модифицированных элемента управления OptionButton (соответствующим образом расположив их на форме). После этого перетащите элемент управления Frame на панель инструментов Toolbox, чтобы создать модифицированный элемент управления Frame.

Можно разместить модифицированные элементы управления на отдельной вкладке панели Toolbox. Таким образом, появляется возможность экспортировать вкладку панели Toolbox для совместного применения другими пользователями Excel. Для экспорта вкладки панели Toolbox щелкните на ней правой кнопкой мыши и выберите пункт меню Export Page.

Среди прилагаемых к заметке файлов находится страничный файл под именем newcontrols.pag, который включает некоторые настроенные элементы управления. Можно импортировать этот файл в качестве новой вкладки окна Toolbox. Щелкните правой кнопкой мыши на вкладке и выберите команду Import Page. В результате панель Toolbox будет как на рис. 14.

Рис. 14. В окне Toolbox появилась страница с новыми элементами управления

Добавление элементов управления ActiveX

В пользовательском диалоговом окне содержатся и другие элементы управления ActiveX, разработанные компанией Microsoft и независимыми производителями. Для того чтобы добавить дополнительные элементы управления ActiveX на панель инструментов Toolbox, щелкните правой кнопкой мыши на ней и выберите пункт Additional Controls (Дополнительные элементы управления). В результате будет отображено диалоговое окно, показанное на рис. 15.

Рис. 15. В диалоговом окне Additional Controls можно найти дополнительные элементы управления ActiveX

В диалоговом окне Additional Controls содержатся все элементы управления ActiveX, установленные в системе. Выберите элементы управления, которые необходимо добавить на панель инструментов. После этого щелкните на кнопке ОК для добавления значков каждого из выбранных элементов управления. Не все элементы управления ActiveX, установленные в системе, поддерживаются пользовательскими диалоговыми окнами. Более того, большая их часть не поддерживается, к тому же некоторые элементы управления требуют лицензии на использование в приложениях. Если лицензия отсутствует, на экране появится сообщение об ошибке.

Создание шаблонов диалоговых окон

Зачастую при создании пользовательского диалогового окна каждый раз на форму добавляются одни и те же элементы управления. Например, все пользовательские диалоговые окна имеют два элемента управления CommandButton, используемых в качестве кнопок ОК и Отмена. В предыдущем разделе рассматривались методы комбинирования элементов управления с целью получения одного элемента управления, обладающего функциями двух. Еще одной программной уловкой может служить шаблон диалогового окна, который при необходимости импортируется для последующего создания на его основе других проектов. Преимущество шаблонного подхода заключается в следующем: процедуры обработки событий сохраняются вместе с шаблоном.

Начните с создания пользовательского диалогового окна, содержащего все элементы управления и настройки, которые необходимо повторно использовать в других проектах. После этого убедитесь, что диалоговое окно выделено. Выберите команду File –> Export File (или нажмите комбинацию клавиш <Ctrl+E>). После этого на экране появится запрос на ввод имени файла. Затем для создания проекта на основе шаблона выполните команду File –> lmport File, чтобы загрузить ранее сохраненное диалоговое окно.

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

[1] По материалам книги Джон Уокенбах. Excel 2010. Профессиональное программирование на VBA. – М: Диалектика, 2013. – С. 405–438.

 

Добрый день.  

  Нелепая попытка скрытия/отображения в текущем режиме(до момента выгрузки)немодальной формы  
при активации/деактивации именно того Листа(Книги), при котором форма была загружена.  

  Проблема:  
— выключаются многие операции в текущем режиме    
в т.ч. редактирование в VBA;    
в т.ч. после выгрузки формы.  
— может, можно по-умнее добиться того-же?  

  Заранее благодарен

 

GIG_ant

Пользователь

Сообщений: 3102
Регистрация: 24.12.2012

В чем смысл данной затеи ?

 

При заранее неизвестных (вводимых поздее пользователем) обрабатываемых формой ячейках (диапазонах и т.п.)  
— одновременная работа формы с Литом — хорошо  
— «гуляние» немодальной формы по всем открытым Листам(Книгам) — хорошо, но не очень(т.к. в обработку  формой попадают, порой,  ячейки (диапазоны и т.п.) именно с активного в ДАННЫЙ МОМЕНТ Листа (а не того, с которого была форма загружена)

 

GIG_ant

Пользователь

Сообщений: 3102
Регистрация: 24.12.2012

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

 

1)Нужный Лист тоже заранее неизвестен (вызов формы д.б. из Панелей Инструментов и т.п.)  
2) Скрытие формы, в т.ч.:  
-перестраховывает при «прыгании» пользователем (по его необходимости) по Листам/Книгам  
-если не нужна форма на других Листах/Книгах,  

  НО, НУЖНА одновременная работа формы с Литом.

 

GIG_ant

Пользователь

Сообщений: 3102
Регистрация: 24.12.2012

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

 

Заранее прошу прощения, если нечетко выражаю мысль.  

  Повторюсь, хорошесть (как я понимаю)  немодальной формы — (в т.ч.) одновременная работа формы с Листом. Она будет нужна.  

  Смысл проблемы:  

  1 шаг) пользователь выбрал какой-то Лист, на нем какие-то данные для обработки элементами немодальной формы  
2 шаг) элементы немодальной формы получили эти данные для обработки  
3 шаг) Не факт, что у пользователя в это время(при загруженной немодальной форме и кропотливой,не имеющей отношение к форме,работе с Листом) не возникнет желания/необходимости выйти на другие Листы/Книги.  
4 шаг ПРОБЛЕМНЫЙ) Если, будучи на других  Листах/Книгах, он  случайно/по СВОЕМУ представлению/по недоразумению приведет в действие макросы (через предоставляемые на форме кнопки и т.п.) обработки полученных с изначального(при загрузке формы) данных, то форма обработает «расположенные так-же» данные, но с именно с активного в ДАННЫЙ МОМЕНТ Листа.  

  Присваивать переменные заранее неизвестным данным — не всегда вариант.  
Может, имеет смысл перестраховываться (от не всегда предсказуемых действий пользователя) скрытием немодальной формы в «текущем режиме»?

 

GIG_ant

Пользователь

Сообщений: 3102
Регистрация: 24.12.2012

Я в тупике.  
Может найдется кто по понятливей ).

 
 
 

Блеск. Низкий поклон.  

  Вожможно ли, чтобы «Unload UserForm1» происходило ТОЛЬКО на «ButtonClose_Click».  
А при «гулянии» на других Листах И Книгах было  UserForm1.Hide    

  (Сам от обезьяны все-еще происхожу).

 

Вариант: вообще не сможете никуда перейти с листа, в котором форма была открыта.

 

Прошу прощения  

  Смысл:    
Пусть пользователь вволю «гуляет»/работает  на любых (открытых) Листах И Книгах.  
Лишь бы имел возможность пользоваться «немодальной-по-сути» формой ТОЛЬКО на изначальном (активированном при загрузке формы) Листе.  
Ну, а если, «нагуляясь», вообще забудет, где она загружена, то, конечно, на закрытие Книги — предупреждение и Unload.

 
 

Точно так.  
Странно, почему подобное «свойство» формы не заложено изначально в Excel.  

  Огромная благодарность с моей стороны.

 

Виноват.Еще раз потревожу.  

  В данном примере (пост 24.02.2012, 16:14)  
‘создание формы -> получение данных -> требуемое поведение формы’  
«заточено» ТОЛЬКО для работы в данной Книги (т.к. используется ThisWorkbook).  
(т.е. этот файл (Книгу) нельзя использовать,к примеру, в качестве Надстройки Excel).  

  Правильно ли я подкорректировал файл, чтобы (все в одном флаконе):  

  — не привязываться к Книге(ThisWorkbook)  
(для случая использования ее как Надстройки Excel)  
— привязываться к Книге(ThisWorkbook),если она же и ActiveWorkbook при загрузке формы (для случая использования ее как отдельной КнигиExcel)  
— (т.к, подумалось что, при Unload Формы м.б. «повешаны» какие-либо дополнительные операции,то:)    
на закрытие Книги (в которой форма была загружена)-  
предупреждение и принудительный возврат на Лист, на котором она загружена.  
— игнорирование закрытия остальных (открытых) Книг?

 

В архиве надстройка .xla, при открытии которой, в меню «Сервис»  
будет добавлена кнопка «НеМодФорма».  
(чуть подкорректировал Вашу корректировку).

 

Так точно.    
Thanks a million.

 

Неустанно  виноват.  

  Всплыл  мормыш:  
При  ПОВТОРНОМ  (на радостях)  вызове с ДРУГИХ  Листов/Книг уже ЗАГРУЖЕННОЙ формы получаем ситуацию:  
опять  – > «четвертак» ->  еще хуже, чем было до создания темы (форма вообще непонятно-что начинает обрабатывать)    

  Верно-ли я его придушил?  
(Кнопка в КонтекстномМенюЯчейки обязана терять доступность)

 

Да. В данном случае всех зайцев не поймать (что-бы и для Надстройки и для отдельной Книги).  
Ближе к Надстройке, наверное, так?

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Вот вариант. Жалко, что пришлось делать на Collection. Был бы VB.NET, то лучше бы Dictionary работали.

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Хотя поспешил с утверждением про Dictionary. Есть же ObjPtr

 

{quote}{login=Сергей Кр}{date=29.02.2012 10:37}{thema=}{post}Всплыл  мормыш:  
При  ПОВТОРНОМ  (на радостях)  вызове с ДРУГИХ  Листов/Книг уже ЗАГРУЖЕННОЙ формы получаем ситуацию:  
опять  – > «четвертак» ->  еще хуже, чем было до создания темы (форма вообще непонятно-что начинает обрабатывать)    

  Верно-ли я его придушил?  
(Кнопка в КонтекстномМенюЯчейки обязана терять доступность){/post}{/quote}  
Вариант:    
добавляем в меню (контекстное) две (!) «играющих друг с дружкой в прятки» кнопки.  
Первая вызывает форму, а вторая — возвращает на лист с активированной формочкой.

 

Мужики(!!)  
(Уважаемый Александр(?)(С.М.), Уважаемый Аnvg.  Прошу простить «свойское» обращение,  но это — от искренней благодарности и от искренней радости).  
Мой поклон до земли.  

  Начинал тему: не верилась-не представлялась такая реализация.  

  Попробую сделать/объединить  обе идеи:  
1) «игра»  в CommandBars(«Cell») двух кнопок:  
-msoControlButton: на вызов UserForm  
-msoControlPopup: на  «собирание»   открытых UserForm  («msoControlButton –ов»   с  соответствующими  .Caption-нами=Имя Книги.Имя Листа  с  макросами возвращения на соответствующие листы  к  соответствующей активированным формам)  
2) все это —  с  Collection  оf UserForms: (действительно ведь) для возможности создания не одной, а нескольких форм.

 

P/S    
1)ButtonClose_Click (формы запросто м.б. без Заголовков)  и    
2)предупреждения на (App_)WorkbookBeforeClose (не всех-же Листах формы м.б. открыты)  
тоже буду добиваться.

 

PP/SS  
1)В посте( 01.03.2012, 12:1) не правильно сформулировал:  
«для возможности создания не одной, а нескольких форм».  
Конечно, же:  
«для возможности использования формы на нескольких Листах»  

  2)Ribbon-ом легче и красивше (чем в CommandBars(«Cell»)),  
но оставлять в беде СчастливыхОбладателейМО2003 нельзя.

 

Вернулся в сознание.  Действительно,  зачем что-то еще?..  
Оба варианта (каждый в своем амплуа) завораживающим образом решают проблему.  

  Александр.  
Андрей.  
Еще раз благодарю.  

  Простите, Андрей.  
Не могу понять:  как в Стандартных Модулях выходить на  pForm?

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Сергей  
Форм же несколько, поэтому pForm всего лишь вспомогательная переменная методов ThisBookV1. Можно получить по номеру формы в коллекции, для этого в модуль ThisBookV1 нужно добавить следующие функции:  
Public Function FormCount() As Long  
   If FormCol Is Nothing Then  
       FormCount = -1  
   Else  
       FormCount = FormCol.Count  
   End If  
End Function  

  Friend Function GetFormById(ByVal FormID As Long) As fmModeless  
   If (FormCol Is Nothing) Or (FormID < 1) Then  
       Set GetFormById = Nothing  
   ElseIf (FormID <= FormCol.Count) Then  
       Set GetFormById = FormCol(FormID)  
   Else  
       Set GetFormById = Nothing  
   End If  
End Function  
Первая возвращает число форм в коллекции, вторая форму по номеру в коллекции. Следует только помнить, что при закрытии формы №2, форма №3 получает №2.  
Можно обратиться по рабочему листу, используя функцию в ThisBookV1  
Friend Function GetFormBySheet(ByVal forSheet As Worksheet) As fmModeless  
   Dim pForm As fmModeless  
   Set GetFormBySheet = Nothing  
   If Not FormCol Is Nothing Then  
       For Each pForm In FormCol  
           If pForm.Reference Is forSheet Then  
               Set GetFormBySheet = pForm  
               Exit For  
           End If  
       Next pForm  
   End If  
End Function  
Можно, конечно, объявить FormCol как Public коллекцию, но как учит теория ООП, не жалательно работать с полями класса вне этого класса.  
И, честно говоря, не совсем понятен смысл работы с формами или их элементами вне кода этих форм.

 

Интуитивно уловил. Спасибо.  
Если бы Вы смогли подсказать, где с ‘чувством и расстановкой’ освещаются методологические основы тематики (Collection, Dictionary) – был бы признателен.  

  Андрей.Не могли бы Вы посмотреть:

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

#30

09.03.2012 09:47:01

{quote}{login=Сергей Кр}{date=09.03.2012 08:03}{thema=}{post}Если бы Вы смогли подсказать, где с ‘чувством и расстановкой’ освещаются методологические основы тематики (Collection, Dictionary) – был бы признателен. {/post}{/quote}Посмотрите здесь:  

http://www.excelworld.ru/forum/3-313-1  

По ходу темы будут несколько хороших ссылок.

<#0>

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

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

Обращение к ячейке

Способы обращения к диапазону в виде одной ячейки на примере ячейки B5 на активном листе:

Range(«B5»)

[B5]

Cells(5, 2)

Cells(5, «B»)

Обращение к ячейке на неактивном листе активной книги:

Worksheets(«Имя листа»).Range(«B5») = 123

Обращение к ячейке в неактивной книге:

Workbooks(«Книга2.xlsm»).Worksheets(«Имя листа»).Range(«B5») = 123

Обращение к ячейке в неактивной текущей книге с исполняемым кодом:

ThisWorkbook.Worksheets(«Имя листа»).Range(«B5») = 123

"Имя листа" — это имя на ярлыке листа, которое в проводнике проекта VBA отображается в скобках.

Обращение к диапазону

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

‘смежный диапазон

Range(«B5:E10»)

[B5:E10]

Range(Cells(5, 2), Cells(10, 5))

Range(Cells(5, «B»), Cells(10, «E»))

‘несмежный диапазон

Range(«B5:E10, G2:I7, D12:F17»)

Application.Union([B5:E10], [G2:I7], [D12:F17])

С помощью метода Application.Union можно объединить в несмежный диапазон и выражения типа Range(Cells(5, 2), Cells(10, 5)).

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

Обмен значениями

Ячейка-переменная-ячейка

Диапазон-массив-диапазон

Dim arr

arr = Range(«A1:E5»)

Range(«A7:E11») = arr

Аналог Ctrl+стрелка

Аналог сочетания клавиш Ctrl+стрелка — свойство End объекта Range:

Dim myRange As Range, a As String

Set myRange = Range(«D10»).End(xlDown | xlToLeft | xlToRight | xlUp)

a = Range(«D10»).End(xlDown | xlToLeft | xlToRight | xlUp).Address

В качестве аргумента свойства End оставляем одну константу в зависимости от нужного направления.

Последняя строка таблицы

Варианты определения номера последней строки таблицы:

Dim n as Long

n = Range(«A1»).CurrentRegion.Rows.Count

n = Range(«A1»).End(xlDown).Row

n = Cells(Rows.Count, «A»).End(xlUp).Row

Шаблоны для копирования

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

Оператор With

With объект

    операторы

End With

Функция IIf

IIf(условие, если True, если False)

Оператор If…Then…Else

Однострочная конструкция:

If условие Then операторы

Многострочная конструкция полная:

If условие Then

    операторы

ElseIf условие Then

    операторы

Else

    операторы

End If

Многострочная конструкция неполная:

If условие Then

    операторы

Else

    операторы

End If

Оператор Select Case

Select Case выражение

    Case условие 1

        операторы 1

    Case условие 2

        операторы 2

    Case условие n

        операторы n

    Case Else

        операторы

End Select

Цикл For… Next

Полная конструкция:

Dim i As Long

For i = 1 To 20 Step 1

    операторы

Exit For

    операторы

Next

Неполная конструкция:

Dim i As Long

For i = 1 To 20

    операторы

Next

Цикл For Each… Next

Полная конструкция:

For Each элемент In группа

    операторы

Exit For

    операторы

Next

Неполная конструкция:

For Each элемент In группа

    операторы

Next

Цикл Do While… Loop

Условие до операторов:

Do While условие

    операторы

Exit Do

    операторы

Loop

Условие после операторов:

Do

    операторы

Exit Do

    операторы

Loop While условие

Цикл Do Until… Loop

Условие до операторов:

Do Until условие

    операторы

Exit Do

    операторы

Loop

Условие после операторов:

Do

    операторы

Exit Do

    операторы

Loop Until условие

Цикл While… Wend

While условие

    операторы

Wend

Отключение обновлений экрана

Отключение обновлений экрана позволяет ускорить длинную процедуру и скрыть мельтешение (мерцание) экрана во время ее выполнения:

Application.ScreenUpdating = False

    операторы

Application.ScreenUpdating = True

Отмена оповещений и сообщений

Отмена оповещений и сообщений в ходе выполнения процедуры:

Application.DisplayAlerts = False

    операторы

Application.DisplayAlerts = True

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

InputBox и MsgBox

Dim a As String

a = InputBox(«Напишите что-нибудь:»)

MsgBox a

Скрыть лист

‘Скрыть лист

Sheets(«Лист1»).Visible = False

‘Отобразить лист

Sheets(«Лист1»).Visible = True

Защита листа

‘Защитить лист

Worksheets(«Лист1»).Protect

‘Снять защиту листа

Worksheets(«Лист1»).Unprotect

Пользовательская форма

Памятка по работе с формой:

‘Загрузить (открыть) форму в модальном окне

UserForm1.Show

‘Загрузить (открыть) форму в немодальном окне

UserForm1.Show 0

‘Скрыть форму

UserForm1.Hide

Me.Hide

‘Показать скрытую форму

UserForm1.Show

‘Выгрузить (закрыть) форму

Unload UserForm1

Unload Me

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

Удаление строк и столбцов

‘Удалить строку №9

Cells(9, 4).EntireRow.Delete

‘Удалить столбец №4

Cells(9, 4).EntireColumn.Delete

Открыть папку или файл

Открыть папку из кода VBA Excel или любой файл по его расширению в программе по умолчанию для просмотра:

‘Открыть папку

ThisWorkbook.FollowHyperlink («C:Тестовая»)

‘Открыть файл

ThisWorkbook.FollowHyperlink («C:ТестоваяДокумент1.docx»)

Закрыть все книги

Закрыть все книги Excel без сохранения изменений, кроме текущей книги с кодом:

Dim myWB As Workbook

For Each myWB In Workbooks

    If Not myWB Is ThisWorkbook Then myWB.Close False

Next

Чтобы закрыть все книги с сохранением изменений, необходимо заменить False на True.


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


Каталог статей

  • Как создать VBA
  • Правила грамматики VBA
    • Объявить переменную
    • Присвойте значения переменным
    • Пусть данные, хранящиеся в переменных, участвуют в операциях
    • Другие знания об объявлении переменных
    • Переменный объем
    • Специальный массив переменных
    • Объявить многомерный массив
    • Объявить динамический массив
    • Другие способы создания массивов
    • Функция массива
      • Используйте UBound, чтобы найти наибольший порядковый номер массива
      • Используйте функцию LBound, чтобы найти минимальный номер индекса
      • Найдите максимальное и минимальное порядковые номера многомерного массива
      • Используйте функцию соединения для объединения одномерных массивов в строки
      • Запишите содержимое массива на лист
      • Доступ к массиву
    • Специальный контейнер для специальной константы данных
  • Объекты, коллекции и свойства и методы объектов
    • Операторы в VBA
      • Арифметический оператор
      • Оператор сравнения
      • Подстановочный знак
      • Логические операторы
  • Встроенные функции VBA
  • Базовая структура операторов исполняемой программы
    • если заявление
      • выберите оператор case
      • для цикла
      • Оператор for each … next перебирает элементы коллекции или массива
      • сделать цикл
      • Используйте оператор Goto, чтобы передать программу другому оператору для выполнения
      • с оператором, сокращенный код
  • подпроцесс, основной программный блок
    • Базовая структура подпроцесса
    • Вызов процедуры в процедуре
    • Передача параметра в подпроцессе
  • Пользовательская функция, функциональный процесс
    • Объявить пользовательскую функцию
    • Используйте свою собственную функцию
    • function example
    • Установите функцию как непостоянную, чтобы пользовательскую функцию можно было вычислять повторно.
  • Объект операции
    • Часто используемые объекты в VBA
    • операция объекта приложения
      • Используйте параметр свойства ScreenUpdating для обновления экрана
      • Установите свойство DisplayAlerts, чтобы подавить отображение диалоговых окон с предупреждениями.
      • Используйте функции листа с атрибутом функции листа
      • Установить свойства и изменить рабочий интерфейс Excel
      • дочерний объект приложения
    • объект книги
      • Объект справочной книги
      • Доступ к свойствам объекта книги
      • Создать книгу-добавить
      • Откройте книгу открытым методом
      • активировать активировать книгу
      • Сохранить книгу
      • закрыть-закрыть книгу
    • объект рабочего листа
      • добавить метод для создания нового рабочего листа
      • Установите атрибут имени, измените имя метки рабочего листа
      • Используйте метод удаления, чтобы удалить лист
      • Два способа активировать рабочий лист
      • Скопируйте рабочий лист методом копирования
      • Используйте перемещение, чтобы переместить лист
      • Установить свойство visible, скрыть или показать рабочий лист
      • Доступ к атрибуту count, чтобы получить количество листов в книге.
    • объект диапазона
      • Обратитесь к ячейке с атрибутом диапазона
      • Используйте атрибут ячейки для ссылки на ячейку
      • Ссылка на весь ряд ячеек
      • Ссылка на весь столбец ячеек
      • Используйте метод объединения для объединения нескольких диапазонов ячеек
      • Свойство смещения объекта диапазона
      • Атрибут изменения размера объекта диапазона
      • Свойство usedrange объекта листа
      • Атрибут currentregion объекта диапазона
      • Конечный атрибут объекта диапазона
      • значение атрибута — содержимое ячейки
      • атрибут count, получить количество ячеек, содержащихся в области
      • Получить адрес ячейки через свойство адреса
      • Используйте методы активации и выбора для выбора ячеек
      • метод копирования для копирования диапазона ячеек
      • вырезать метод, чтобы сократить диапазон ячеек
      • Удалить указанную ячейку с помощью метода удаления
    • Некоторые примеры объектов операции
      • Создавайте книги по мере необходимости
      • Определите, открыта ли книга
      • Определите, есть ли в папке файл книги с указанным именем
      • Ввести данные в неоткрытую книгу
      • Скрыть все листы, кроме активного листа
      • Пакетное создание новых листов с указанными именами
      • Разделяйте данные партиями и сохраняйте их на разных листах
      • Объедините данные из нескольких листов в один лист
      • Сохраните каждый лист в книге как отдельный файл книги
      • Объединение данных из нескольких книг на одном листе
      • Создайте связанное оглавление для листов в той же книге
  • Автоматическое переключение выполнения программно-объектного события
    • Позвольте Excel автоматически реагировать на наши действия
    • Использовать события рабочего листа
      • Событие изменения объекта рабочего листа
      • Отключите событие, чтобы процесс события больше не выполнялся автоматически
      • событие selectionchange: происходит при изменении выбранной ячейки
      • Выделите такое же значение в выбранной области
      • Используйте комментарии, чтобы записать изменение данных в ячейке
    • Общие события рабочего листа
    • Использовать события книги
      • событие открытия: происходит при открытии книги
      • Событие beforeclose: происходит перед закрытием книги
      • событие Sheetchange: происходит, когда ячейка на любом листе изменяется
      • Общие события книги
    • Событие, а не событие
      • Метод onkey объекта приложения
      • OnTime метод объекта Application
      • Позвольте файлу сохраниться автоматически
  • Настройте индивидуальный рабочий интерфейс
    • Элементы управления, важные части для интерфейсов управления зданием
      • Используйте элементы управления на листе
      • Используйте элементы управления ActiveX на листе
    • Не нужно настраивать, используйте готовый диалог
      • Используйте функцию InputBox для создания диалогового окна, в которое можно вводить данные.
      • Используйте метод ввода для создания интерактивного диалога
      • Используйте функцию msgbox для создания диалогового окна вывода
      • Используйте метод FindFile для отображения диалогового окна [Открыть]
      • Используйте метод GetOpenFileName для отображения диалогового окна [Открыть]
      • Используйте метод GetSaveAsFilename для отображения диалогового окна [Сохранить как]
      • Используйте свойство FileDialog объекта приложения, чтобы получить имя каталога.
    • Используйте объект формы для установки интерактивного интерфейса
    • Используйте код для управления созданной вами формой
      • Форма отображения
      • Отображение формы как немодальной формы
      • Закрыть или скрыть отображаемую форму
    • Заявка на событие пользовательской формы
      • Инициализируйте форму с помощью события Initialize
      • Используйте событие QueryClose, чтобы сделать недействительной кнопку [Close], которая поставляется с формой.
    • Задайте функции для элементов управления формы
      • Добавить процедуру события для кнопки [OK]
      • Установите сочетания клавиш для управления
      • Изменить порядок табуляции элемента управления
    • Создайте простую форму входа в систему с формой
  • Отлаживать и оптимизировать написанный код
    • При ошибке GoTo tags
    • on error resume next
    • On Error GoTo 0

Как создать VBA

  1. Войдите в окно средства разработки

2. Выберите модуль вставки, затем вставьте процесс, выберите подпрограмму.


Правила грамматики VBA

В Excel есть только пять типов данных: текст, числовое значение, значение даты, логическое значение и значение ошибки. Но в VBA тип данных не совсем такой, как в Excel.В соответствии с характеристиками данных, VBA делит данные на логические (логические), байтовые (байтовые), целые (целые), числа с плавающей точкой одинарной точности (одинарные), числа с плавающей запятой двойной точности (двойные), валютные ( валюта), десятичное (десятичное), строка (строка), дата (дата), тип объекта и т. д.

Объявить переменную

Объявление переменной фактически указывает имя переменной и тип данных, которые она может хранить. Чтобы объявить переменную в VBA, существует несколько методов:

  1. Тусклое имя переменной как тип данных
  2. Имя частной переменной как тип данных, Объявите переменную частной, переменная станет частной переменной
  3. Имя общедоступной переменной как тип данных, Переменные, определенные с помощью общедоступных переменных, являются общедоступными переменными
  4. имя статической переменной как тип данныхЕсли вы используете static для объявления переменной, эта переменная станет статической переменной. По завершении программы статическая переменная сохранит свое исходное значение без изменений.

Присвойте значения переменным

  1. Присвойте значения переменным типа данных, Вы должны использовать эту инструкцию:пусть имя переменной = данные для хранения
  2. Присваивать значения переменным типа объекта, Следует использовать следующую инструкцию: «установить имя переменной = имя сохраняемого объекта

Пусть данные, хранящиеся в переменных, участвуют в операциях

  1. Переменные типа данных участвуют в операциях


2. Объектные переменные участвуют в операциях.

Другие знания об объявлении переменных

  1. Если вы хотите объявить несколько переменных, вы можете написать код в следующей форме:


2. Тип переменной можно определить с помощью декларатора типа переменной.

тип данных Символ объявления типа
Integer %
Long &
Single
Double #
currency @
string $
  1. Объявляйте переменные без указания типа переменной: в VBA, если вы не уверены в хранении типа данных в переменной, вы можете определить только имя переменной вместо типа переменной при объявлении переменной.Если при объявлении переменной вы указываете только имя переменной без указания типа данных переменной, VBA по умолчанию определяет переменную как тип Variant. Если переменная объявлена ​​как тип варианта, она может хранить любой тип данных
  2. Обязательное объявление всех переменных: если вас беспокоит, что вы забыли объявить переменные в своей программе, вы можете ввести «Option Explicit

Переменный объем

Разделенные по области видимости, переменные в VBA можно разделить на локальные переменные, переменные модуля и общедоступные переменные.

Сфера описание
Единый процесс Областью видимости переменной, объявленной dim или static оператором в процессе, является процесс, то есть только процесс, в котором объявлен оператор переменной, может использовать его. Такая переменная называетсяЛокальная переменная
Единый модуль Переменная, объявленная с помощью оператора dim или private перед первой процедурой модуля, имеет область видимости для всех процедур в модуле, где объявлен оператор переменной, то есть все процедуры в модуле могут его использовать. Такой кадр вызываетсяПеременные уровня модуля
Все модули Переменная, объявленная с помощью оператора public перед первой процедурой модуля, имеет область видимости для всех модулей, то есть все процедуры в модуле могут ее использовать. Такие переменные называютсяПубличная переменная

Специальный массив переменных

  1. Массив — это набор из нескольких переменных одного типа.
  2. Элементы в массиве можно получить по значению индекса
  3. Размер массива должен быть объявлен при объявлении массива
    публичное имя массива dim (от a до b) как тип данных
  4. Присвоение значения массиву означает присвоение значения каждому элементу массива отдельно

Объявить многомерный массив

Dim arr(a,b) as Integer

Здесь нужно объявить массив с именем arr, его форма — строка и столбец b

Объявить динамический массив

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

Sub test()
    a = Application.WorksheetFunction.CountA(rang("A:A"))
    Dim arr() As String
    ReDim arr(1 To a)
End Sub

Другие способы создания массивов

  1. Используйте функцию массива, чтобы объявить массив
Sub arraytest()
    Dim arr As Variant
    arr = Array(1, 2, 3, 4)
         MsgBox "Второй элемент массива arr:" & arr (1)
   
End Sub


2. Используйте функцию разделения, чтобы объявить массив

Sub arraytest()
    Dim arr As Variant
         arr = Split ("Кленовый лист, Конгконг, Сяоюй, Лаочжу", ",")
         MsgBox "Второй элемент массива arr:" & arr (1)
   
End Sub

  1. Создайте массив непосредственно через диапазон ячеек
Sub arraytest()
    Dim arr As Variant
    Range("A1:C3").Value = 5
    arr = Range("A1:C1").Value
    Range("e1:G1").Value = arr
   
End Sub

Функция массива

Используйте UBound, чтобы найти наибольший порядковый номер массива

Sub arraytest()
    Dim arr As Variant
    Range("A1:C3").Value = 5
    arr = Range("A1:C1").Value
         MsgBox "Максимальный порядковый номер массива:" & UBound (arr)
   
End Sub

Используйте функцию LBound, чтобы найти минимальный номер индекса

Sub arraytest()
    Dim arr As Variant
    Range("A1:C3").Value = 5
    arr = Range("A1:C1").Value
         MsgBox "Минимальный порядковый номер массива:" & LBound (arr)
   
End Sub

Найдите максимальное и минимальное порядковые номера многомерного массива

Sub arraytest()
   Dim arr(10, 100) As Integer
   Dim a As Integer, b As Integer
   a = UBound(arr, 1)
   b = UBound(arr, 2)
       MsgBox "Самый большой индекс первого измерения:" & a & Chr (13) & "Самый большой индекс второго измерения:" & b
   
End Sub

Используйте функцию соединения для объединения одномерных массивов в строки

Sub arraytest()
    Dim arr As Variant
    arr = Array(1, 2, 3, 4)
    Text = Join(arr)
    MsgBox Text
   
End Sub

Запишите содержимое массива на лист

Sub arraytest()
    Dim arr As Variant
    arr = Array(1, 2, 3, 4, 5, 6, 7)
    Range("A4:A11").Value = Application.WorksheetFunction.Transpose(arr)
    
End Sub

Где транспонирование — это преобразование столбцов массива. Если содержимого массива недостаточно для заполнения длины ячейки, избыточные данные будут заполнены значениями NA. Если количество заполняемых ячеек недостаточно для длины массива, они будут заполнены по порядку.

Доступ к массиву

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

arr = range("B1:C1").value
msgbox arr(1,2)

Специальный контейнер для специальной константы данных

Константы часто используются для хранения фиксированных данных, таких как процентные ставки, налоговые ставки и пи. ** При объявлении константы английский язык также определяет имя константы, тип данных, которые могут быть сохранены, и данные, которые хранятся в нем. Утверждение:

const имя константы как тип данных = данные, хранящиеся в константе

Так же, как и определение переменных, константа, определяемая оператором const внутри процедуры, называетсяМестная постоянная, Может использоваться только в процессе объявления констант;

Если вы используете оператор const для объявления константы перед первой процедурой модуля, константа вызываетсяПостоянная уровня модуля, Все процессы в модуле могут его использовать;

Если вы хотите, чтобы объявленная константа была доступна во всех модулях, вы должны объявить ее как общедоступный оператор перед первой процедурой модуля.Публичная константа

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

Объекты — это вещи, вещи, которые используют код VBA для управления и контроля, принадлежат существительным. В VBA книги Excel, рабочие листы, ячейки и т. Д. — это все объекты, диаграммы, сводные таблицы, изображения и т. Д. Также являются объектами, даже линии границ ячеек, вставленные комментарии — все это объекты …

Коллекция также является объектом, что является общим термином для нескольких объектов одного типа.

Каждый объект имеет атрибуты, и атрибуты объекта можно понимать как содержание или характеристики объекта.Объекты и атрибуты относительны. Ячейка является объектом относительно шрифта, но ячейка является атрибутом относительно рабочего листа.

Метод — это действие или операция, выполняемая над объектом, и каждый объект имеет один или несколько соответствующих методов. Разница между методами и атрибутами заключается вСвойство возвращает содержимое или характеристики объекта, такие как подобъект, цвет, размер и т. Д.; Метод — это операция над объектом, такая как выбор, активация и т. Д.

Операторы в VBA

Арифметический оператор

Оператор эффект пример
+ Найдите сумму двух чисел 5+9=14
Найдите разницу между двумя числами или найдите противоположность числа 8-3=5
* Найдите произведение двух чисел
/ Найдите частное двух чисел
Найдите целое число частного, полученного после получения числа 52=2
^ Найдите степень определенного числа
Mod Найдите остаток от деления двух чисел 12 mod 9 =3

Оператор сравнения

Оператор эффект грамматика Результат возврата
= Сравните, равны ли два данных expression1=expression2 Вернуть ИСТИНА, если равно, ложь, если не равно
<> не равно expression1<> expression2 Напротив вышеуказанного
> Сравните размер двух чисел expression1> expression2
>= Сравните размер двух чисел expression1>= expression2
< Сравните размер двух чисел expression1<expression2
<= Сравните размер двух чисел expression1<=expression2
is Сравните ссылочные переменные двух объектов Объект 1 — это объект 2 Возвращает TRUE, если объект 1 и объект 2 ссылаются на один и тот же объект, в противном случае возвращает false.
like Сравните, совпадают ли две строки Строка 1 похожа на строку 2 Возвращает TRUE, если строка 1 соответствует строке 2, в противном случае возвращает false.

Подстановочный знак

Подстановочный знак эффект Пример кода
* Заменить любое количество символов «Ли Цзяцзюнь», как «Ли *»
? Заменить любой отдельный символ «Ли Цзяцзюнь», как «Ли ??»
# Заменить любой одиночный номер «Товар 5» лайкнул «товар №»
[charlist] Заменить любой символ в списке символов “I” like “[A-Z]”
[!charlist] Заменить любой символ не в списке символов “I” like “[!A-Z]”

Логические операторы

Оператор эффект Форма предложения Правила расчета
and Выполнить операцию логического И Выражение 1 и выражение 2 Если значения выражения 1 и выражения 2 ИСТИНА, вернуть ИСТИНА, в противном случае вернуть ложь
or Выполнить операцию логического ИЛИ Выражение 1 или выражение 2 Если одно из двух истинно, возвращается ИСТИНА, а ложь — ложь.
not Выполнить операцию логического НЕ не означает Операция отрицания
xor Выполнить логическую операцию «исключающее ИЛИ» Выражение 1 xor выражение 2 Если значение, возвращаемое выражением 1 и выражением 2, не совпадает, вернуть ИСТИНА, иначе вернуть ложь
eqv Выполните логические операции «эквивалентности» Выражение 1 eqv выражение 2 Когда выражение 1 и выражение 2 возвращают одно и то же значение, оно возвращает ИСТИНА, в противном случае — ложь.
Imp Выполните логические операции «импликации» Выражение 1 imp выражение 2 Когда значение 1 — ИСТИНА, а значение выражения 2 — ложь, оно возвращает ложь, в противном случае — ИСТИНА.

Встроенные функции VBA

Хотя функций много, нам не нужно их очень точно запоминать. ** Если вы помните примерное написание функции, вы можете выбрать функцию, которую хотите использовать, в списке функций, отображаемом системой, введя «VBA.» В [Окно кода] при написании кода.

Базовая структура операторов исполняемой программы

если заявление

В VBA правила для операторов if следующие:

если условие, затем инструкция иначе условие

выберите оператор case

Хотя использование оператора if может решить проблему «множественного выбора одного», когда существует слишком много условий выбора, чтобы судить, используйте несколько операторов elseif или несколько операторов if, точно так же, как использование слишком большого числа if в предложении, это будет для понимания кода Логика приносит трудности.Обычно, когда нам нужно сделать выбор из трех или более стратегий, мы выбираем использование оператора select case для решения проблемы.

Sub test()
    Select Case Range("B2").Value
        Case Is >= 90
                         Диапазон ("C2"). Значение = "Отлично"
        Case Is >= 80
                         Диапазон ("C2"). Значение = "Хорошо"
        Case Is >= 60
                         Диапазон ("C2"). Значение = "Пройдено"
        Case Is < 60
                         Диапазон ("c1"). Значение = "Ошибка"
    End Select
    
End Sub

для цикла

Синтаксические правила для определения цикла for в VBA следующие:

для переменной цикла = начальное значение до конечного значения шаг шага
         Тело петли
 имя переменной следующего цикла

Цикл for должен заканчиваться следующим

Sub test()
    Dim irow As Byte
    Dim i As Byte
    For i = 1 To 10 Step 1
        Select Case Range("B" & i).Value
            Case Is > 100
                                 Диапазон ("C" & i) .Value = "Информационная ошибка"
            Case Is >= 90
                                 Диапазон ("C" & i) .Value = "Отлично"
            Case Is >= 80
                                 Диапазон ("C" & i) .Value = "Хорошо"
            Case Is >= 60
                                 Диапазон ("C" & i) .Value = "Пройдено"
            Case Is < 60
                                 Диапазон ("C" & i) .Value = "Failed"
        End Select
    Next i
End Sub

Оператор for each … next перебирает элементы коллекции или массива

Когда вам нужно перебрать каждый элемент массива или каждый член коллекции, используйте оператор for each … next

Sub test()
   Dim i As Byte
  j = 1
    For Each sht In Worksheets
        Range("D" & j).Value = sht.Name
        j = j + 1
    Next sht
   
End Sub

сделать цикл

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

  1. Предикат открытия
do [условие цикла while]
         Тело петли
    exit do
         Тело петли
loop
  1. Усеченный предикат
do 
         Тело петли
    exit do
         Тело петли
 цикл [условие цикла while]

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

Sub test()
   Dim i As Byte
   i = 1
   Do
        Worksheets.Add
        i = i + 1
    Loop While i < 5
End Sub

Используйте оператор Goto, чтобы передать программу другому оператору для выполнения

Чтобы оператор goto четко знал, к какому оператору нужно обратиться, вы можете добавитьСоздание текстового символа с двоеточием или числовой метки без двоеточия, А затем напишите имя метки после goto

Sub test()
   Dim i As Integer
   Dim sum As Long
   i = 1
x:    mysum = mysum + i
    i = i + 1
    If i <= 100 Then GoTo x
         MsgBox "Сумма от 1 до 100:" & mysum
End Sub

с оператором, сокращенный код

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

Sub fontest()
    With Worksheets("Sheet1").Range("A1").Font
                 .Name = "Имитация песни"
        .ColorIndex = 3
        .Bold = True
        .Size = 12
    End With
End Sub

подпроцесс, основной программный блок

Базовая структура подпроцесса

[private | public | static] имя подпроцедуры ([список параметров])
         Блок выписок
[exit sub]
         Блок выписок
end sub

Private или public используются для объявления области действия процедуры, и одновременно может использоваться только одна.Если не указано, по умолчанию используется public. Если вы выберете статический, после того, как процесс будет выполнен, значение переменных в процессе будет продолжать сохраняться.

Вызов процедуры в процедуре

  1. Используйте имя процедуры для непосредственного вызова процедуры, разделяя имя процедуры и параметры английскими запятыми.
subname,arg1,arg2

sub runsub()
    subadd
end sub
  1. Используйте ключевое слово call для вызова процедуры, параметры записываются в скобках процедуры, а различные параметры разделяются запятыми.
имя процедуры вызова (args, arg2)
sub runsub()
    call subadd
end sub
  1. Используйте метод run объекта приложения для вызова процесса
application.run "subname,arg1,arg2"
sub runsub()
    application.run "subadd"

Передача параметра в подпроцессе

В VBA есть две основные формы передачи параметров процесса: нажмитеЦитатаПройдите и нажмитеценностьперевод.По умолчанию процесс передает параметры по ссылке. Если программа передает параметры по ссылке, будет передан только адрес памяти, в которой сохранены данные, и любое изменение параметров в процессе повлияет на исходные данные.

Sub shtadd(shtcount As Integer)
    Worksheets.Add Count:=shtcount
    shtcount = 8
    MsgBox "значение shtcount:" & shtcount
End Sub

Sub test()
    Dim c As Integer
    c = 2
    Call shtadd(c)
         MsgBox "Значение в процедуре параметра:" & c
End Sub

Пользовательская функция, функциональный процесс

Объявить пользовательскую функцию

публичная функция имя функции ([параметр])
         Тело функции
         Имя функции = результат
end function

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

Используйте свою собственную функцию

  1. Используйте в Excel:
    Если определенная функция не определена как частная процедура, мы можем использовать нашу настраиваемую функцию в Excel через [Вставить функцию].

Public Function fun()
    fun = Int(Rnd() * 10) + 1
End Function

  1. Используется в процессе VBA
Sub test()
    MsgBox fun()
End Sub

function example

Public Function count_color(arr As Range, c As Range)
    Dim rng As Range
    For Each rng In arr
        If rng.Interior.Color = c.Interior.Color Then
            count_color = 1 + count_color
        End If
    Next rng
    
End Function

Установите функцию как непостоянную, чтобы пользовательскую функцию можно было вычислять повторно.

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

application.voliatile true

example


Public Function fun()
    application.voliatile true
    fun = Int(Rnd() * 10) + 1
End Function

Объект операции

Часто используемые объекты в VBA

Объект Описание объекта
Application Представляет приложение Excel (если VBA используется в слове, он представляет приложение Word)
Workbook Представляет книгу Excel, объект книги представляет файл книги
worksheet Представляет рабочий лист Excel, объект рабочего листа представляет обычный рабочий лист в книге
range Представляет ячейку в Excel, которая может быть отдельной ячейкой или диапазоном ячеек.

операция объекта приложения

Используйте параметр свойства ScreenUpdating для обновления экрана

Свойство ScreenUpdating объекта приложения — это переключатель, который управляет обновлением экрана. Если установлено значение false, экран не будет обновляться, и мы не увидим результаты каждого шага.

Sub test()
    Application.ScreenUpdating = False
    Range("A1:A10").Value = 10
         MsgBox "Только что введен результат 10, вы его видели?"
    Range("A1:A10").Value = 100
         MsgBox "Только что введено 100, вы это видели"
    Application.ScreenUpdating = True
    
End Sub

Установите свойство DisplayAlerts, чтобы подавить отображение диалоговых окон с предупреждениями.

Когда мы выполняем определенные операции в Excel, Excel отображает окно предупреждения, чтобы мы могли определить, выполнять ли эти операции. По многим причинам мы все надеемся, что Excel не будет отображать подобные диалоговые окна с предупреждениями во время выполнения программы. Этого можно добиться, задав для свойства displayalerts объекта приложения значение false.

Sub sheettest()
    Worksheets.Add Count:=5
    Application.DisplayAlerts = False
    Dim sht As Worksheet
    For Each sht In Worksheets
        If sht.Name <> ActiveSheet.Name Then
            sht.Delete
        End If
    Next sht
    Application.DisplayAlerts = True
    
End Sub

Используйте функции листа с атрибутом функции листа

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

Sub cunt()
    Dim mycount As Integer
    Range("A1:B10").Value = 101
    mycount = Application.WorksheetFunction.CountIf(Range("A1:B10"), ">100")
         MsgBox "Ячейки в этой области больше 100:" & mycount
End Sub

Если функция с такой же функцией уже существует в VBA, вы больше не можете ссылаться на функцию на листе через атрибут worksheetfunction. И не все функции рабочего листа можно вызывать через атрибут функции рабочего листа.

Установить свойства и изменить рабочий интерфейс Excel

Задайте свойства объекта приложения для изменения интерфейса Excel

Код выполняется в [Immediate Window] Измененная область
application.caption = «Мой Excel» заглавие
application.caption “miscrosoft excel” заглавие
application.displayformulabar = false Панель редактирования
application.displaystatusbar = false Статус бар
application.statusbar = «Редактирование …» Статус бар
application.statusbar = false Статус бар
activewindow.displayheadings = false Строка и столбец

дочерний объект приложения

Общие атрибуты объектов приложения

Атрибуты Возвращенный объект
ActiveCell Текущая активная ячейка
ActiveChart Активная диаграмма в текущей активной книге
Activesheet Активный лист в текущей активной книге
ActiveWindow Текущее активное окно
ActiveWorkbook Текущая активная книга
Charts Все листы диаграмм в текущей активной книге
selection Все выбранные объекты в текущей активной книге
sheets Все объекты листа в текущей активной книге, включая обычные листы, листы диаграмм, листы макросов Excel 4.0 и листы диалоговых окон 5.0
worksheets Все объекты рабочего листа текущей активной книги (обычные рабочие листы)
workbooks Все открытые книги

объект книги

Объект справочной книги

  1. Ссылка по индексу файла
  2. Ссылка по имени файла
sub test()
    workbooks(3)
    workbooks("sheet1")
end sub

Доступ к свойствам объекта книги

Sub info()
    Range("c1") = ThisWorkbook.Name
    Range("C2") = ThisWorkbook.Path
    Range("C3") = ThisWorkbook.FullName
End Sub

Создать книгу-добавить

  1. Создайте пустую книгу: если вы напрямую вызываете метод добавления объекта книги без установки каких-либо параметров, excel создаст новую книгу, содержащую только обычные рабочие листы.
  2. Укажите шаблон, используемый для создания книги: если вы хотите использовать файл книги в качестве шаблона для новой книги, вы можете использовать параметр шаблона метода добавления, чтобы указать имя файла и его каталог.
  3. Укажите тип книги, включенной в новую книгу
workbooks.add 
workbooks.add template:="D:filetemplate.xlsm"
 workbooks.add template: = xlWBATChart 'Разрешить вновь созданной книге содержать листы диаграмм

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

Значение параметра Типы листов, содержащихся в рабочей тетради
xlWBATWorksheet Обычный рабочий лист
xlWBATChart Рабочий лист диаграммы
xlWBATExcel4Macrosheet 4.0 Рабочий лист макросов
xlWBATExcel4IntlMacrosheet 5.0 Диалоговый рабочий лист

Откройте книгу открытым методом

workbooks.open filename := "path"

активировать активировать книгу

workbooks("workbooks_name").activate

Сохранить книгу

  1. Метод save сохраняет существующий файл
  2. Метод saveas сохраняет книгу как новый файл
  3. Не закрывайте исходный файл после сохранения как новый файл
thisworkbooks.save 
thisworkbooks.saveas filename:="path"
thisworkbooks.savecopyas filename :="path"

закрыть-закрыть книгу

workbooks.close'Закрыть все открытые в данный момент книги
 workbooks ("workbooks_name"). close'Закройте книгу с указанным именем
 workbooks.close savechanges: = true 'Закройте и сохраните изменения в книге

объект рабочего листа

добавить метод для создания нового рабочего листа

  1. Вставить лист перед активным листом
  2. Используйте параметр before | after, чтобы указать, куда вставить рабочий лист.
  3. Используйте параметр count, чтобы указать количество листов, которые нужно вставить
worksheets.add
worksheets.add before|after := worksheet_name
worksheets.add count:=number

Установите атрибут имени, измените имя метки рабочего листа

worksheets("worksheet_name").name = name

Используйте метод удаления, чтобы удалить лист

worksheets('worksheet_Name').delete

Два способа активировать рабочий лист

worksheets("worksheet_name").avtivate
worksheets("worksheet_name").select

Скопируйте рабочий лист методом копирования

  1. Скопируйте лист в указанное место
  2. Скопируйте рабочий лист в новую книгу
worksheets('worksheet_name').copy before|after :=worksheet_name
worksheets("worksheet_name").copy

Используйте перемещение, чтобы переместить лист

  1. Переместите лист в указанное положение
  2. Переместить лист в новую книгу
worksheets('worksheet_name').move before|after :=worksheet_name
worksheets("worksheet_name").move

Установить свойство visible, скрыть или показать рабочий лист

worksheets("worksheet_name").visible =False or True

Доступ к атрибуту count, чтобы получить количество листов в книге.

worksheets.count

объект диапазона

Обратитесь к ячейке с атрибутом диапазона

  1. Обратитесь к одному фиксированному диапазону ячеек: этот метод на самом деле предназначен для ссылки на ячейку по адресу ячейки.
  2. Обратитесь к нескольким несмежным ячейкам:Задайте для параметра атрибута диапазона строку, состоящую из нескольких адресов ячеек, разделенных запятыми.
  3. Обратитесь к общей области нескольких областей:Задайте для атрибута диапазона строку, состоящую из нескольких адресов ячеек, разделенных пробелами.
  4. Ссылка на прямоугольную область, ограниченную двумя областями
range("A1:C1")
range("A1:A10,E6,E7:C12").select
range("B1:B10 A4:D6").value
range("B6:B10","D2:D8")

Используйте атрибут ячейки для ссылки на ячейку

  1. Ссылка на ячейку на листе, где пересекаются указанная строка и столбец.
  2. Ссылка на ячейку в диапазоне ячеек
  3. Установите возвращаемый результат атрибута ячеек как параметр атрибута диапазона
  4. Используйте номера индексов для ссылки на ячейки
activesheet.cells (3,4) «выберите пересекающуюся ячейку D3 в третьей строке и четвертом столбце»

 range ("B3: F9"). cells (2,3) = 10 'Введите 100 на стыке второй строки и третьего столбца области B3: F9'

 диапазон (ячейки (1,1), ячейки (5,14)). select'Specify A1: D5 area '

 activesheet.cells (2) .value = 200 'Укажите вторую ячейку рабочего листа как 200'

Ссылка на весь ряд ячеек

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

activesheet.rows ("3: 3"). select'Выбрать третью строку на активном листе '
 activesheet.rows ("3: 5"). select "Выбрать 3-5 строк активного рабочего листа"
 activesheet.rows (3) 'Выбрать третью строку активного листа'

Ссылка на весь столбец ячеек

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

activesheet.columns ("F: G"). select "Выбрать столбцы F-G на активном листе"

 activesheet.columns (3) 'Выбрать 6-й столбец активного листа'

Используйте метод объединения для объединения нескольких диапазонов ячеек

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

application.union (range ("A1: A10"), range ("D1: D5")). select 'Выбрать две области одновременно'

Свойство смещения объекта диапазона

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

range ("B2: C3"). offset (5,3) .value = 200 'Переместить диапазон B2: C3 вправо на 3 ячейки и вниз на 5 ячеек'

Атрибут изменения размера объекта диапазона

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

range ("B2"). resize (4,5) 'Развернуть область B2 в область с 4 строками и 5 столбцами'

 range ("B2: E6"). resize (2,1) 'Уменьшить исходную область до области из двух строк и одного столбца'

Свойство usedrange объекта листа

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

activesheet.usedrange.select'Выберите диапазон ячеек, которые использовались в активном листе '

Атрибут currentregion объекта диапазона

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

range("B5").currentregion.select

Конечный атрибут объекта диапазона

Атрибут end объекта диапазона возвращает ячейку в конце диапазона, содержащего указанную ячейку, и возвращаемый результат эквивалентен ячейке, полученной нажатием [ввод + стрелка] в ячейке.

range("C5").end(xlUP).address

конечные параметры и описание

Параметры, которые можно установить Параметр Описание
xlToLeft Это эквивалентно нажатию [конец + стрелка влево] в ячейке
xlToRight Это эквивалентно нажатию [конец + стрелка вправо] в ячейке.
xlUp Это эквивалентно нажатию [конец + стрелка вверх] в ячейке
xlDown Это эквивалентно нажатию [конец + стрелка вниз] в ячейке

значение атрибута — содержимое ячейки

range("A1:B2").value="abc"

атрибут count, получить количество ячеек, содержащихся в области

range("B4:F10").count
range("B4:F10").rows.count
range("B4:F10").columns.count

Получить адрес ячейки через свойство адреса

msgbox "Адрес текущей выбранной ячейки:" & selection.address

Используйте методы активации и выбора для выбора ячеек

activesheet.range("A1:F5").activate
activesheet.range("A1:F5").select

метод копирования для копирования диапазона ячеек

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

range('region').copy destination:=range("other_region")

вырезать метод, чтобы сократить диапазон ячеек

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

range('region').cut destination:=range("other_region")

Удалить указанную ячейку с помощью метода удаления

Указанную ячейку можно удалить, вызвав метод удаления объекта диапазона, но это отличается от удаления ячейки вручную.Если ячейка удаляется с помощью кода VBA, Excel не будет отображать диалоговое окно [Удалить].Если мы хотим, чтобы Excel обрабатывал другие ячейки по своему усмотрению после удаления указанной ячейки, нам нужно написать код VBA, чтобы сообщить Excel о нашем намерении.. Если вы хотите удалить всю строку ячеек, где находится B3, вы должны написать код как:

range("B3").entirerow.delete

Некоторые примеры объектов операции

Создавайте книги по мере необходимости

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

Sub wbadd()
    Dim wb As Workbook
    Dim sht As Worksheet
    Set wb = Workbooks.Add
    Set sht = wb.Worksheets(1)
    With sht
                 .Name = "Список сотрудников"
    End With
         wb.SaveAs ThisWorkbook.Path & "Employee Roster.xlsx"
    ActiveWorkbook.Close
    
    
End Sub

Определите, открыта ли книга

Sub isopen()
    Dim i As Integer
    For i = 1 To Workbooks.Count
                 Если Workbooks (i) .Name = "Result Sheet.xlsx", то
                         MsgBox "Файл протокола был открыт"
            Exit Sub
        End If
    Next
         MsgBox «Файл не открыт»
End Sub

Определите, есть ли в папке файл книги с указанным именем

Sub isexist()
    Dim fil As String
         fil = ThisWorkbook.Path & " Employee roster.xlsx"
    If Len(Dir(fil)) > 0 Then
                 MsgBox "Файл существует"
    Else
                 MsgBox «Файл не существует»
    End If
    
End Sub

Ввести данные в неоткрытую книгу

Sub wbinput()
    Dim wb As String, xrow As Integer, arr
         wb = ThisWorkbook.Path & " Employee roster.xlsx"
    Workbooks.Open (wb)
    With ActiveWorkbook.Worksheets(1)
        xrow = .Range("A1").CurrentRegion.Rows.Count + 1
                 arr = Array (xrow-1, « », « », # 7/8/1987 #, # 9/1/2010 #, «10 лет нового набора»)
        .Cells(xrow, 1).Resize(1, 6) = arr
    End With
    ActiveWorkbook.Close savechanges:=True
    
    
End Sub

Скрыть все листы, кроме активного листа

Sub shtvisible()
    Dim sht As Worksheet
    For Each sht In Worksheets
        If sht.Name <> ActiveSheet.Name Then
            sht.Visible = xlSheetVeryHidden
        End If
    Next
End Sub

Пакетное создание новых листов с указанными именами

Sub shtadd()
    Dim i As Integer
    Dim sht As Worksheet
    i = 1
    Set sht = Worksheets("Sheet11")
    Do While sht.Cells(i, "E") <> ""
       Worksheets.Add after:=Worksheets(Worksheets.Count)
       ActiveSheet.Name = sht.Cells(i, "E").Value
       i = i + 1
    Loop
    
End Sub

Разделяйте данные партиями и сохраняйте их на разных листах

Sub fenlie()
    Dim i As Long, bj As String, rng As Range
    i = 1
    bj = Worksheets("Sheet11").Cells(i, "C").Value
    Do While bj <> ""
        Set rng = Worksheets(bj).Range("A1048576").End(xlUp).Offset(1, 0)
        Worksheets("Sheet11").Cells(i, "A").Resize(1, 7).Copy rng
        i = i + 1
        bj = Worksheets("Sheet11").Cells(i, "C").Value
    Loop

End Sub

Объедините данные из нескольких листов в один лист

Sub hebing()
    Dim sht As Worksheet
    Set sht = Worksheets("Sheet11")
    sht.Rows.Clear
    Dim wt As Worksheet, xrow As Integer, rng As Range
    For Each wt In Worksheets
        If wt.Name <> "Sheet11" Then
            Set rng = sht.Range("A1048576").End(xlUp)
            xrow = wt.Range("A1").CurrentRegion.Rows.Count
            wt.Range("A1").Resize(xrow, 7).Copy rng
        End If
    Next
End Sub

Сохраните каждый лист в книге как отдельный файл книги

Sub savetofile()
    Application.ScreenUpdating = False
    Dim folder As String
         folder = ThisWorkbook.Path & " Таблица оценок"
    If Len(Dir(folder, vbDirectory)) = 0 Then
        MkDir folder
    End If
    
    Dim sht As Worksheet
    For Each sht In Worksheets
        If sht.Name <> "Sheet11" Then
            sht.Copy
            ActiveWorkbook.SaveAs folder & "" & sht.Name & ".xlsx"
            ActiveWorkbook.Close
        End If
    Next
    Application.ScreenUpdating = True
    
End Sub

Объединение данных из нескольких книг на одном листе

Sub hzwb()
    Dim bt As Range, r As Long, c As Long
    r = 1
    c = 7
    Dim wt As Worksheet
    Set wt = ThisWorkbook.Worksheets(1)
    wt.Rows(r & ":1045876").ClearContents
    Application.ScreenUpdating = False
    Dim filename As String, sht As Worksheet, wb As Workbook
    Dim erow As Long, fn As String, arr As Variant
    filename = Dir(ThisWorkbook.Path & "*.xlsx")
    Do While filename <> ""
        If filename <> ThisWorkbook.Name Then
            erow = wt.Range("A1").CurrentRegion.Rows.Count
            fn = ThisWorkbook.Path & "" & filename
            Set wb = GetObject(fn)
            Set sht = wb.Worksheets(1)
            arr = sht.Range(sht.Cells(r, "A"), sht.Cells(1048576, "B").End(xlUp).Offset(0, 5))
            wt.Cells(erow, "A").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
            wb.Close savechanges:=True
        End If
        filename = Dir
    Loop
    Application.ScreenUpdating = True
    
End Sub

Создайте связанное оглавление для листов в той же книге

Sub mulu()
    Dim wt As Worksheet
    Set wt = Worksheets("Sheet11")
    wt.Rows("1:1048576").ClearContents
    Dim sht As Worksheet, irow As Integer
    irow = 1
    For Each sht In Worksheets
        If sht.Name <> "Sheet11" Then
            wt.Cells(irow - 1, "A").Value = irow - 1
            wt.Hyperlinks.Add anchor:=wt.Cells(irow - 1, "B"), Address:="", SubAddress:="'" & sht.Name & "'!A1", TextToDisplay:=sht.Name
        End If
        irow = 1 + irow
    Next
End Sub

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

Автоматическое переключение выполнения программно-объектного события

Позвольте Excel автоматически реагировать на наши действия

  1. Откройте окно кода этой книги
  2. Выберите объект книги, выберите открыть в объявлении
  3. Подпрограмма записи

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

Использовать события рабочего листа

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

Событие изменения объекта рабочего листа

Событие изменения объекта рабочего листа сообщает VBA: автоматически запускать программу при изменении ячейки рабочего листа процесса.

При написании процедур обработки событий мы обычно используем этот метод: выберите соответствующий объект и имя события в списке [Объект] и поле списка [Событие] в [Окне кода], и пусть VBA автоматически устанавливает для нас объем процесса события. , Название процесса и информация о параметрах

  1. Автоматически выполнять при смене ячеек
Private Sub Worksheet_Change(ByVal Target As Range)
         MsgBox Target.Address & "был изменен на" & Target.Value
    
End Sub
  1. Автоматически выполнять при изменении некоторых ячеек
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 1 Then
        Exit Sub
    End If
    
         MsgBox Target.Address & "был изменен на" & Target.Value
    
End Sub

Отключите событие, чтобы процесс события больше не выполнялся автоматически

Отключение событий означает предотвращение возникновения событий после выполнения операций. В VBA вы можете установить для свойства EnableEvents объекта приложения значение false, чтобы отключить события.

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
         Target.Offset (0, 1) .Value = "Проверить"
    Application.EnableEvents = True
End Sub

событие selectionchange: происходит при изменении выбранной ячейки

Время изменения выбора объекта рабочего листа сообщает VBA: процесс обработки этого события автоматически выполняется при изменении выбранного диапазона ячеек на листе.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
         MsgBox "Текущая выбранная ячейка:" & Target.Address
    
End Sub

Выделите такое же значение в выбранной области

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Range("A3:I66").Interior.ColorIndex = xlNone
   If Application.Intersect(Target, Range("A3:I66")) Is Nothing Then
        Exit Sub
    End If
    
   If Target.Count > 1 Then
    Set Target = Target.Cells(1)
   End If
   Dim rng As Range
   For Each rng In Range("A3:I66")
    If rng.Value = Target.Value Then
        rng.Interior.ColorIndex = 6
    End If
    Next
End Sub

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

Dim rngvalue As String

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Then
        Exit Sub
    End If
    Dim cvalue As String
    
    If Target.Formula = "" Then
                 cvalue = "пустой"
    Else
        cvalue = Target.Text
    End If
    
    If rngvalue = cvalue Then
        Exit Sub
    
    End If
    Dim rngcom As Comment
    Dim comstr As String
    Set rngcom = Target.Comment
    If rngcom Is Nothing Then Target.AddComment
    comstr = Target.Comment.Text
    Target.Comment.Text Text:=comstr & Chr(10) & Format(Now(), "yyyy-mm-ddhh:mm") & _
                 "Исходное содержание:" & rngvalue & "изменено на:" & cvalue
    Target.Comment.Shape.TextFrame.AutoSize = True
    
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count > 1 Then
        Exit Sub
    End If
    If Target.Formula = "" Then
                 rngvalue = "пустой"
    Else
        rngvalue = Target.Text
    End If
    
End Sub

Общие события рабочего листа

Всего объект рабочего листа встречается 17 раз. Вы можете просмотреть эти события в списке [Событие] в [Окно кода] или в справке VBA.
Общие события рабочего листа

Название события Описание времени
activate Происходит при активации рабочего листа
beforeDelete Происходит перед удалением рабочего листа
beforeDoubleClick После двойного щелчка на листе операция двойного щелчка по умолчанию выполняется до
beforeRightClick После щелчка правой кнопкой мыши на листе до выполнения операции щелчка правой кнопкой мыши по умолчанию
calculate Возникает после пересчета рабочего листа
change Происходит при изменении ячейки на листе
deactivate Происходит, когда рабочий лист меняется с активного листа на неактивный.
followHyperlink Происходит при нажатии любой гиперссылки на листе
PivotTableUpdate Происходит после обновления сводной таблицы на листе
selectionchange Происходит при изменении выделения на листе

Использовать события книги

События рабочей книги — это события, которые происходят в объекте книги. Объект книги представляет книгу. Процесс события объекта книги должен быть записан в модуле ThisWorkbook, который можно найти в [Project Explorer]

событие открытия: происходит при открытии книги

Событие открытия — одно из наиболее часто используемых событий книги. Будете ли вы использовать это событие для инициализации Excel, например, для настройки окна Excel или рабочего интерфейса, в котором вы хотите открыть книгу, и отображения нашей пользовательской формы и т. Д.

Событие beforeclose: происходит перед закрытием книги

private sub workbook_beforeclose(cancel as boolean)
         if msgbox ("Вы уверены, что хотите закрыть книгу?", vbyesno) = vbno, то
        cancel =true
    end if
end sub

событие Sheetchange: происходит, когда ячейка на любом листе изменяется

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
         MsgBox "Вы меняете:" & Sh.Name & "на листе" & Target.Address & "cell"
End Sub

Общие события книги

Название события Описание события
activate Происходит при активации книги
AddinInstall Происходит, когда книга установлена ​​как надстройка
AddinUninstall Происходит, когда книга выгружается как надстройка
AfterSave Происходит после сохранения книги
BeforeClose Происходит до закрытия книги
BeforePrint Происходит перед печатью указанной книги
beforesave Происходит перед сохранением книги
Deavtivate Происходит, когда статус книги неактивен
NewChart Происходит при создании новой диаграммы в книге
Newsheet Происходит при создании нового листа в книге
open Происходит при открытии книги
sheetavtivate Возникает при активации любого рабочего листа
sheetBeforeDoubleClick Происходит перед двойным щелчком по любому листу
sheetBeforeRightClick Происходит до щелчка правой кнопкой мыши на любом листе
sheetCalculate Возникает после пересчета рабочего листа
SheetChange Происходит при изменении ячейки на любом листе
sheetDeactivate Происходит, когда какой-либо рабочий лист становится неактивным
sheetFollowHyperLink Происходит при нажатии любой гиперссылки в книге
SheetPivotTableUpdate Происходит при обновлении любой сводной таблицы
sheetSelectionchange Происходит при изменении выбранной области на любом листе
WindowActivate Происходит при активации любого окна книги
windowdeactivate Происходит, когда любое окно становится неактивным
windowresize Возникает при изменении размера любого окна книги

Событие, а не событие

Метод onkey объекта приложения

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

Sub test()
    Application.OnKey "+e", "Hello"
End Sub

Sub Hello()
         MsgBox "Я изучаю метод onkey"
End Sub

Кнопки, которые можно установить в onkey, и их соответствующие коды

Ключ к использованию Код, который нужно установить
Backspace {backspace} or {BS}
Break {Break}
Caps Lock {CAPSLOCK}
Delete or Del {DELETE} OR {DEL}
Кнопка «Стрелка вниз {DOWN}
End {END}
Enter (цифровая клавиатура) {ENTER}
ENTER ~
Esc {ESCAPE} OR {ESC}
Home {HOME}
Ins {INSERT}
Стрелка влево {LEFT}
Num Lock {NUMLOCK}
PageDown {PGDN}
PageUp {PGUP}
Правая стрелка {RIGHT}
Scroll Lock {SCROLLLOCK}
Tab {TAB}
Стрелка вверх {UP}
От F1 до F15 С {F1} по {F15}
Shift +
Crtl ^
Alt %

OnTime метод объекта Application

Метод Ontime сообщает VBA автоматически выполнять указанный процесс в указанное время.

Sub test()
    Application.OnTime TimeValue("14:07:00"), "Hello"
End Sub

Sub Hello()
         MsgBox "Я изучаю метод вовремя"
End Sub

ВовремяDateSerialПараметры могут быть установлены на указанный год, месяц и день;ScheduleЕсли значение d равно TRUE, будет установлен новый процесс Ontime. Если он равен False, ранее установленный процесс будет очищен. Значение по умолчанию — TRUE.

Позвольте файлу сохраниться автоматически

Sub test()
    Application.OnTime Now() + TimeValue("00:05:00"), "AutoSave"
End Sub

Sub AutoSave()
    ThisWorkbook.Save
    Call test
End Sub

Настройте индивидуальный рабочий интерфейс

Элементы управления, важные части для интерфейсов управления зданием

В Excel есть два типа элементов управления: элементы управления формы и элементы управления ActiveX. Вы можете найти их в [Функциональной области] Excel.

  1. Контроль формы
Название контроля Описание управления
Кнопка Используется для выполнения макрос-команд
Поле со списком Предоставляет несколько вариантов на выбор, пользователь может выбрать один из элементов
Флажок Контроль выбора, возможен множественный выбор
Кнопка числовой настройки Выберите значение, щелкнув стрелку элемента управления
Окно списка Отображение списка из нескольких вариантов, пользователь может выбрать один вариант
Кнопка выбора Элементы управления, используемые для выбора, обычно несколько кнопок выбора объединены в поле со списком. В группе одновременно можно выбрать только одну кнопку выбора.
Коробка группы Используется для объединения нескольких других элементов управления
этикетка Используется для ввода и отображения статического текста
полоса прокрутки Включая горизонтальную полосу прокрутки и вертикальную полосу прокрутки
  1. Элемент управления ActiveX: в Excel доступно 11 элементов управления ActiveX, но на листе используется больше элементов управления ActiveX. Вы можете нажать среди них кнопку [Другие элементы управления] и выбрать другие элементы управления во всплывающем диалоговом окне.

Используйте элементы управления на листе

  1. Добавить элементы управления формой


2. Нарисуйте элементы управления формы.


3. Задайте соответствующую область

Используйте элементы управления ActiveX на листе

  1. Добавить элемент ActiveX


2. Установите атрибуты

  1. Написать контрольный код
Private Sub xb2_Click()
      If xb2.Value = True Then
                 Диапазон ("D2"). Значение = "Женский"
        xbl.Value = False
    End If
End Sub

Private Sub xbl_Click()
    If xbl.Value = True Then
                 Диапазон ("D2"). Значение = "Мужской"
        xb2.Value = False
    End If
       
End Sub
  1. Отображение содержимого

Не нужно настраивать, используйте готовый диалог

Используйте функцию InputBox для создания диалогового окна, в которое можно вводить данные.

Функция ввода имеет 5 параметров:

  1. Параметр подсказки используется для установки подсказки, отображаемой в диалоговом окне.
  2. title используется для установки заголовка диалога
  3. default используется для установки входного значения по умолчанию
  4. xpos используется для установки расстояния между левым концом диалогового окна и левым концом экрана
  5. ypos используется для установки расстояния между верхом диалогового окна и верхом экрана
Sub inbox()
    Dim c As Variant
         c = InputBox («Какие данные вы хотите ввести в ячейку A1?», Title: = «hint», по умолчанию: = « », xpos: = 200, ypos: = 250)
    Range("A1").Value = c
    
End Sub

Используйте метод ввода для создания интерактивного диалога

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

application.inputbox (prompt: = "Content", title: = "Title"
         default: = "значение по умолчанию", left: = "расстояние от левого края экрана"
         top: = "Расстояние от правого края экрана", type: = "Тип входных данных")

Настраиваемые элементы и описание параметра типа

Устанавливаемое значение параметра Тип результата, возвращаемого методом
0 формула
1 цифровой
2 Текст (строка)
4 Логическое значение (истина или ложь)
8 Ссылка на ячейку (объект диапазона)
16 Значение ошибки
64 Числовой массив
Sub rngpinput()
    Dim rng As Variant
    On Error GoTo cancel
         Установите rng = Application.InputBox («Выберите ячейку, в которой необходимо ввести значение», введите: = 8)
    rng.Value = 100
cancel:
    
End Sub

Используйте функцию msgbox для создания диалогового окна вывода

Sub msg()
         MsgBox "То, что вы редактируете:" & ThisWorkbook.Name, Buttons: = vbOKOnly + vbInformation, Title: = "Hint"
   
End Sub

Установите стиль кнопки, отображаемой в диалоговом окне

постоянный ценность Описание
vbOkonly 0 Показывать только кнопку 【OK】
vbOkcancel 1 Отображаются только кнопки [OK] и [Отмена].
vbAbortRetryIgnore 2 Отобразите три кнопки: [Завершение], [Повторить] и [Игнорировать]
vbYesNoCancel 3 Показать три кнопки: да, нет, отменить
vbYesNo 4 Показать две кнопки да или нет
vbRetryCancel 5 Показать повтор, отменить две кнопки

Настройки параметров различных иконок

постоянный ценность Описание
vbCritical 16 Отображение значка [Основная информация]
vbQuestion 32 Показать значок 【Предупреждение Спросить】
vbExclamation 48 Отображение значка [Предупреждение]
vbInformation 64 Отображение значка [Уведомление]

Установите кнопку по умолчанию в диалоговом окне
константа | значение | описание
vbDefaultButton1 | 0 | Первая кнопка — значение по умолчанию
vbDefaultButton2 | 256 | Вторая кнопка — значение по умолчанию
vbDefaultButton3 | 512 | Третья кнопка — значение по умолчанию
vbDefaultButton4 | 768 | Четвертая кнопка — значение по умолчанию

Укажите тип диалога

постоянный ценность Описание
vbApplicationModel 0 Приложение принудительно возвращается; приложение приостанавливает выполнение и не продолжает работу, пока пользовательское окно сообщения не ответит.
vbSystemModel 4096 Система принудительно возвращается; все приложения приостанавливаются до тех пор, пока пользователь не ответит на окно сообщения, прежде чем продолжить работу

Другие настройки параметра кнопок

постоянный ценность Описание
vbMsgBoxHelpButton 16384 Добавить кнопку справки в диалоговом окне
vbMsgBoxForeground 65536 Установите отображаемое диалоговое окно в качестве окна переднего плана
vbMsgBoxRight 524288 Задайте выравнивание текста, отображаемого в диалоговом окне, по правому краю
vbMsgBoxRtlReading 1048576 Укажите текст на иврите и системе Alibaba для чтения справа налево

Возвращаемое значение функции MsgBox

постоянный ценность Описание
vbOk 1 Когда вы нажимаете кнопку [OK]
vbCancel 2 При нажатии кнопки [Отмена]
vbAbort 3 Когда вы нажимаете кнопку [Завершить]
vbRetry 4 Когда вы нажимаете кнопку [Повторить]
vbIgnore 5 При нажатии кнопки [Игнорировать]
vbYes 6 Когда вы нажимаете кнопку [Да]
vbNo 7 Когда вы нажимаете кнопку [Нет]
Sub msgbut()
    Dim yn As Integer
         yn = MsgBox («Вы уверены, что хотите ввести сегодняшнюю дату в ячейку A1?», vbYesNo + vbQuestion)
    If yn = vbYes Then
        Range("A1").Value = Now()
    End If
    
End Sub

Используйте метод FindFile для отображения диалогового окна [Открыть]

Используйте метод FindFile объекта приложения для отображения диалогового окна [Открыть], выберите и откройте файл в диалоговом окне.

Sub openfile()
    If Application.FindFile = True Then
        MsgBox "the file you chosed has benn open"
    Else
                 MsgBox «Вы нажали [кнопку Отмена], операция не завершена»
    End If
        
End Sub

Используйте метод GetOpenFileName для отображения диалогового окна [Открыть]

В отличие от метода findfile,Используйте метод GetOpenFileName, чтобы получить имя файла (включая путь) для файла, выбранного в диалоговом окне, а findfile — для открытия файла, выбранного в диалоговом окне.

  1. Выбери любой файл
Sub getopen()
    Dim fil
    fil = Application.GetOpenFilename
    If fil = False Then
                 MsgBox "Нет файлов"
        Exit Sub
    Else
        Range("E6").Value = fil
    End If
End Sub
  1. Показывать в диалоговом окне только определенные типы файлов
Sub getopen()
    Dim fil
         fil = Application.GetOpenFilename (filefilter: = "Файл изображения, *. jpg")
    If fil = False Then
                 MsgBox "Нет файлов"
        Exit Sub
    Else
        Range("E6").Value = fil
    End If
End Sub
  1. Разрешить диалоговому окну отображать несколько файлов расширений одновременно
Sub getopen()
    Dim fil
         fil = Application.GetOpenFilename (filefilter: = "Файл изображения, *. jpg; * png")
    If fil = False Then
                 MsgBox "Нет файлов"
        Exit Sub
    Else
        Range("E6").Value = fil
    End If
End Sub
  1. Разрешить диалоговому окну выбрать отображение нескольких типов файлов
Sub getopen()
    Dim fil
         fil = Application.GetOpenFilename (filefilter: = "Файл изображения, *. jpg; * png, файл книги Excel, * xls; * xlsx")
    If fil = False Then
                 MsgBox "Нет файлов"
        Exit Sub
    Else
        Range("E6").Value = fil
    End If
End Sub
  1. Установите тип файла, отображаемый по умолчанию, с помощью параметра FilterIndex
    Если в раскрывающемся списке [Тип файла] задано несколько выбираемых типов файлов, вы можете использовать параметр FiterIndex метода GetOpenFileName, чтобы установить тип файла, отображаемый по умолчанию в диалоговом окне.
Sub getopen()
    Dim fil
         fil = Application.GetOpenFilename (filefilter: = "Файл изображения, *. jpg; * png, файл книги Excel, * xls; * xlsx", FilterIndex: = 2)
    If fil = False Then
                 MsgBox "Нет файлов"
        Exit Sub
    Else
        Range("E6").Value = fil
    End If
End Sub
  1. Настройки позволяют выбирать несколько файлов одновременно
    По умолчанию в диалоговом окне [Открыть], отображаемом методом GetOpenFileName, одновременно можно выбрать только один файл. Если вы хотите выбрать несколько файлов одновременно, вы можете установить для параметра MultiSelect значение TRUE.
Sub getopen()
    Dim fil
         fil = Application.GetOpenFilename (filefilter: = "Файл изображения, *. jpg; * png, файл книги Excel, * xls; * xlsx", FilterIndex: = 2, MultiSelect: = True)
     Range("E6").Value = fil
End Sub
  1. Изменить заголовок диалога
Sub getopen()
    Dim fil
         fil = Application.GetOpenFilename (filefilter: = "Файл изображения, *. jpg; * png, файл книги Excel, * xls; * xlsx", FilterIndex: = 2, MultiSelect: = True, Title: = "Выберите, что вы хотите Получите имя файла ")
     Range("E6").Value = fil
End Sub

Используйте метод GetSaveAsFilename для отображения диалогового окна [Сохранить как]

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

Sub getsaveas()
    Dim fil As String, filename As String, filter As String, tile As String
         filename = "пример"
         filter = "Книга Excel, * xls; * xlsx, документ Word, *. doc; *. docx"
         Title = "Выберите файл для получения информации"
    fil = Application.GetSaveAsFilename(InitialFileName:=filename, fileFilter:=filter, Title:=Title, FilterIndex:=2)
    Range("A10") = fil
End Sub

Используйте свойство FileDialog объекта приложения, чтобы получить имя каталога.

Если вам нужно не имя файла, а путь и имя указанного каталога, вы можете использовать свойство FileDialog объекта приложения.

Sub getfolder()
    With Application.FileDialog(filedialogtype:=msoFileDialogFilePicker)
        .InitialFileName = "D:"
                 .Title = "Пожалуйста, выберите каталог"
        .Show
        If .SelectedItems.Count > 0 Then
            Range("A1").Value = .SelectedItems(1)
        End If
    End With
End Sub

Константы, которые можно установить с помощью параметра msoFileDialogType

постоянный Описание
msoFileDialogFilePicker Разрешить выбор файла
msoFileDialogFolderPicker Разрешить выбор папки
msoFileDialogOpen Разрешить открыть файл
msoFileDialogSaveAs Разрешить сохранение файла

Используйте объект формы для установки интерактивного интерфейса

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

  1. Добавить пользовательскую форму в проект

  1. Задайте свойства для изменения внешнего вида формы

  1. Добавьте и установите функцию элемента управления в форме

Используйте код для управления созданной вами формой

Форма отображения

  1. Отображение формы вручную

Выберите форму в окне VBE и по очереди выполните команду [Run] -> [Run Sub-Process / Form], чтобы отобразить выбранную форму.

  1. Вывести форму с кодом в программе
sub showform()
    load inputform
    inputform.show
end sub

Отображение формы как немодальной формы

  1. Модальная форма не может управлять объектами вне формы

Чтобы отобразить форму как модальную, вы можете использовать код

InputForm.show

Или опустите параметр метода show или установите для параметра значение vModal, VBA будет говорить об окне как о модальном окне
2. В немодальной форме разрешены другие операции за пределами формы.

Для отображения формы как немодальной формы необходимо указать параметры с помощью метода show.

Inputform.show vmodeless

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

Закрыть или скрыть отображаемую форму

  1. Используйте команду выгрузки, чтобы закрыть форму
unload Inputform
  1. Используйте метод Hide, чтобы скрыть форму
inputform.hide

Заявка на событие пользовательской формы

Инициализируйте форму с помощью события Initialize

Событие Initialize происходит до отображения формы, когда мы используем оператор load для загрузки формы в программу или используем show для отображения формы, на этот раз будет срабатывать

Private Sub UserForm_Initialize()
         Gender.List = Array («Мужской», «Женский»)
End Sub

Используйте событие QueryClose, чтобы сделать недействительной кнопку [Close], которая поставляется с формой.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> vbFormCode Then Cancel = True
End Sub

Процедура события queryclose — это подпроцедура с двумя параметрами. Параметр cancel определяет, отвечать ли на нашу операцию по закрытию формы. Когда значение TRUE, программа не будет реагировать на нашу операцию по закрытию формы. Если значение отмены равно false, программа закроет форму.Параметр CloseMode — это способ закрытия формы, а значения, возвращаемые разными методами закрытия, не совпадают.

Описание возвращаемого значения параметра CloseMode

постоянный ценность Описание
vbFormControlMenu 0 Нажмите кнопку [Закрыть] в форме, чтобы закрыть форму.
vbFormCode 1 Закройте форму через оператор выгрузки
vbAppWindows 2 Процесс завершения текущей операционной среды Windows
vbAppTaskManagee 3 Windows [Диспетчер задач] закрывает все приложение

Задайте функции для элементов управления формы

Добавить процедуру события для кнопки [OK]

Private Sub cmd_OK_Click()
    Dim xrow As Long
    xrow = Range("A1").CurrentRegion.Rows.Count + 1
         Ячейки (xrow, "A"). Value = name.Value
    
         Ячейки (xrow, "B"). Значение = пол.Значение
    Cells(xrow, "C").Value = birth.Value
         Name.Value = ""
         Gender.Value = ""
    birth.Value = ""
End Sub

Установите сочетания клавиш для управления

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

Private Sub UserForm_Initialize()
         Gender.List = Array («Мужской», «Женский»)
    cmd_OK.Accelerator = "N"
End Sub

Изменить порядок табуляции элемента управления

Только когда объект активирован, можно сделать несколько вводов с клавиатуры. Порядок табуляции элементов управления определяет порядок, в котором элементы управления активируются после нажатия пользователем комбинации клавиш [Tab] или [Shift + Tab]. При разработке формы система определит порядок табуляции элементов управления в соответствии с порядком их добавления.Но этот порядок можно изменить. Выберите форму в VBE и последовательно выполните команду [View] -> [Tab Key Sequence]. Вызов диалогового окна последовательности клавиш Tab, вы можете настроить последовательность клавиш Tab для элементов управления в нем.

Создайте простую форму входа в систему с формой

  1. Отображение формы дизайна


2. Добавьте код, чтобы указать функции для элемента управления.



Private Sub cmd_cacel_Click()
         Выгрузить логин пользователя
    ThisWorkbook.Close savechanges:=False
End Sub

Private Sub cmd_ok_Click()
    Application.ScreenUpdating = False
    Static i As Integer
    If CStr(username.Value) = Right(Names("username").RefersTo, Len(Names(username).RefersTo) - 1) And CStr(pwd.Value) = Right(Names("userword").RefersTo, Len(Names("userword").RefersTo) - 1) Then
                 Выгрузить логин пользователя
    Else
        i = i + 1
        If i = 3 Then
                         MsgBox «У вас нет разрешения на открытие книги»
            ThisWorkbook.Close savechanges:=False
        Else
                         msg "Ошибка ввода, у вас все еще есть" & (3-i) & "Второй шанс для ввода"
            username.Value = ""
            pwd.Value = ""
        End If
    End If
    Application.ScreenUpdating = True
    
End Sub

Private Sub pwd_set_Click()
     Dim old As String, new1 As String, new2 As String
         old = InputBox ("Пожалуйста, введите пароль:", "Подскажите")
    If old <> Right(Names("userword").RefersTo, Len(Names("userword").referto) - 1) Then
                 MsgBox "Исходный пароль был введен неверно и не может быть изменен", vbCritical, "Неверный"
        Exit Sub
    End If
         new1 = InputBox («Пожалуйста, введите новый пароль:», «Подсказка»)
    If new1 = "" Then
                 MsgBox «Новый пароль не может быть пустым, модификация не завершена», vbCritical, «error»
        Exit Sub
    End If
    new2 = InputBox («Пожалуйста, введите новый пароль еще раз:», «Подсказка»)
    If new1 = new2 Then
        Names("userword").RefersTo = "=" & new1
        ThisWorkbook.Save
                 MsgBox "Изменение пароля завершено"
    Else
                 MsgBox «Две записи пароля несовместимы, и изменение не завершено», vbCritical, «error»
    End If
    
End Sub

Private Sub user_set_Click()
    Dim old As String, new1 As String, new2 As String
         old = InputBox ("Пожалуйста, введите имя пользователя:", "Подсказка")
    If old <> Right(Names("username").RefersTo, Len(Names("username").referto) - 1) Then
                 MsgBox "Исходное имя пользователя было введено неправильно и не может быть изменено", vbCritical, "error"
        Exit Sub
    End If
         new1 = InputBox ("Пожалуйста, введите новое имя пользователя:", "Подсказка")
    If new1 = "" Then
                 MsgBox «Новое имя пользователя не может быть пустым, модификация не завершена», vbCritical, «error»
        Exit Sub
    End If
         new2 = InputBox ("Пожалуйста, введите новое имя пользователя еще раз:", "Подсказка")
    If new1 = new2 Then
        Names("username").RefersTo = "=" & new1
        ThisWorkbook.Save
                 MsgBox "Изменение имени пользователя завершено"
    Else
                 MsgBox "Два имени пользователя несовместимы, и изменение не завершено", vbCritical, "error"
    End If
    
End Sub

Отлаживать и оптимизировать написанный код

При ошибке GoTo tags

При ошибке GoTo labelФактически, оператор GoTo добавляется после «при ошибке». «Метка» — это метка, установленная для оператора goto, которая представляет собой число или текст с двоеточием.Метка сообщает VBA, что, когда программа теряет сознание во время ошибки во время выполнения, код, который переходит к строке метки, продолжает выполнять программу. Фактически, программа пропускает код ошибки и перезапускает выполнение программы с другого места.

Sub test()
    On Error GoTo a
    Worksheets("abc").Select
   Exit Sub
 a: MsgBox "Нет листа для выбора"

End Sub

on error resume next

Resume Next сообщает VBA, что если в программе возникает ошибка, он игнорирует код ошибки, а затем выполняет код после строки ошибки.Если оператор On Error Resume Next добавлен в начало программы, VBA не прервет программу, если в программе возникла ошибка времени выполнения. Вместо этого он игнорирует все операторы с ошибками и продолжает выполнять код после оператора ошибки.

Sub test()
    On Error Resume Next
    Worksheets("abc").Select
    Exit Sub
         MsgBox «Нет листа для выбора»

End Sub

On Error GoTo 0

После использования оператора On Error GoTo 0Запись ошибок времени выполнения в программе будет отключена. Если программа имеет ошибку выполнения после оператора On Error GoTo 0, она не будет записана

Sub test()
    On Error GoTo 0
    Worksheets("abc").Select
   Exit Sub
         MsgBox «Нет листа для выбора»

End Sub

Понравилась статья? Поделить с друзьями:
  • Немецкий язык для word
  • Немецкий физик г фаренгейт в 1724 году предложил температурную шкалу excel
  • Немецкий готический шрифт для word
  • Немецкий алфавит в word
  • Нем могу объединить ячейки в excel 2010