Vba сделать окно активным

Обновлено: 24.04.2024

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

  • сообщить пользователю о выполнении кода;
  • получить от пользователя подтверждение на выполнение того или иного действия;
  • запросить какие-то данные(число, текст для поиска, диапазон поиска и т.п.).

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

Из основных можно выделить три типа:
MsgBox - окно информирования пользователя с возможностью запроса действия (Да, Нет, Отмена и т.п.);
InputBox - окно запроса текстовой информации от пользователя (текст для поиска, дата, число и т.п.);
Application.InputBox - чуть более расширенная версия InputBox с возможностью указания не только текста и чисел, но и выделения диапазона ячеек (например для указания ячеек, в которых осуществлять поиск значения или которые необходимо закрасить).

MsgBox "Обработка завершена"

Все остальные параметры указывать не обязательно, но их использование несколько расширяет возможности данного диалогового окна.
Buttons - указывается тип выводимых кнопок и стиль окна. По умолчанию применяется vbOKOnly - одна только кнопка Ок:

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

'--------------------------------------------------------------------------------------- ' Procedure : test ' DateTime : 19.10.2014 19:24 ' Author : The_Prist(Щербаков Дмитрий) ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' http://www.excel-vba.ru ' Purpose : Процедура показывает диалоговое окно с возможностью выбора одного из трех вариантов: ' Прервать, Повтор, Пропустить ' По умолчанию выделена кнопка Прервать, т.к. иное не указано '--------------------------------------------------------------------------------------- Sub test() Dim lRetVal As Long 'для получения выбранного значения Retry_: lRetVal = MsgBox("Обработка завершена", vbAbortRetryIgnore + vbQuestion) Select Case lRetVal Case vbAbort '3/Прервать/Abort Exit Sub 'выходим из процедуры Case vbRetry '4/Повтор/Retry GoTo Retry_ 'переход на метку Retry_ Case vbIgnore '5/Пропустить/Ignore End Select End Sub

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

'--------------------------------------------------------------------------------------- ' Procedure : test ' DateTime : 19.10.2014 19:24 ' Author : The_Prist(Щербаков Дмитрий) ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' http://www.excel-vba.ru ' Purpose : Процедура показывает диалоговое окно с возможностью выбора одного из трех вариантов: ' Прервать, Повтор, Пропустить ' По умолчанию выделена кнопка Пропустить(3-я по счету - значит vbDefaultButton3) '--------------------------------------------------------------------------------------- Sub test() Dim lRetVal As Long 'для получения выбранного значения Retry_: lRetVal = MsgBox("Обработка завершена", vbAbortRetryIgnore + vbQuestion + vbDefaultButton3) Select Case lRetVal Case vbAbort '3/Прервать/Abort Exit Sub 'выходим из процедуры Case vbRetry '4/Повтор/Retry GoTo Retry_ 'переход на метку Retry_ Case vbIgnore '5/Пропустить/Ignore End Select End Sub

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

Sub test() Dim lRetVal As Long 'для получения выбранного значения Retry_: lRetVal = MsgBox("Обработка завершена", 2 + 32 + 512) Select Case lRetVal Case 3 'vbAbort Exit Sub 'выходим из процедуры Case 4 'vbRetry GoTo Retry_ 'переход на метку Retry_ Case 5 'vbIgnore End Select End Sub

Нетрудно после этого предположить, что можно указать просто сумму данных чисел:

MsgBox "Обработка завершена", 546

Доступные константы значений возврата:

Константа Значение Нажатая кнопка
vboK 1 ОК
vbCancel 2 Отмена
vbAbort 3 Прервать
vbRetry 4 Повтор
vblgnore 5 Пропустить
vbYes 6 Да
vbNo 7 Нет

Title - указывается текст заголовка окна. Например, можно указать либо что это ошибка, либо имя своего приложения:

MsgBox "Обработка завершена", vbOKOnly, "Мое приложение"

HelpFile - указывается имя файла-справки в формате .HLP. Применяется, если параметр Buttons указан как vbMsgBoxHelpButton. Файл справки должен существовать.
Context - целое число. Указывается индекс страницы файла-справки, которую необходимо открыть. Указывается только если указан параметр HelpFile.

Небольшой практический пример применения простого диалогового окна MsgBox.
Цель процедуры(макроса): очистить все ячейки листа.
Согласитесь, что неплохо бы перед этим запросить у пользователя решение - он согласен с этим и это является обдуманным решением или случайностью?

'--------------------------------------------------------------------------------------- ' Procedure : ClearRange ' DateTime : 19.10.2014 20:06 ' Author : The_Prist(Щербаков Дмитрий) ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' http://www.excel-vba.ru ' Purpose : '--------------------------------------------------------------------------------------- Sub ClearRange() Dim lRetVal As Long 'для получения выбранного значения lRetVal = MsgBox("Все данные выделенных ячеек будут удалены." & _ Chr(10) & "Действительно хотите продолжить?", _ vbYesNo + vbQuestion, "Запрос на выполнение") If lRetVal = vbNo Then Exit Sub 'выходим из процедуры без выполнения End If Selection.Clear End Sub

Так же на странице Полезные программы для Excel и VBA можно найти программу MsgBox Generator, которая просто и наглядно формирует коды показа MsgBox.

MsgBox, автоматически закрываемый по истечении указанного времени
Диалог MsgBox удобен, если надо проинформировать пользователя о каких-то событиях или предоставить ему выбор Да или Нет. Но в тоже время есть один недостаток: этот диалог не закроется, пока пользователь не нажмет хоть какую-то кнопку. Но бывает необходимо просто проинформировать и закрыть окно независимо от реакции пользователя. Показали окно, подождали секунд 5-7 и даже если пользователь ничего не нажал - закрыли окно и продолжили выполнение кода. Стандартно такой опции в MsgBox нет. Однако можно использовать функции API(это встроенные в ОС Windows функции, которые можно вызывать из любого языка программирования).
Код такого диалога:

Declare Function MessageBoxTimeOut Lib "User32" Alias "MessageBoxTimeoutA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As VbMsgBoxStyle, ByVal wLanguageId As Long, ByVal dwMilliseconds As Long) As Long Sub AutoCloseMsgBox() Const lSeconds As Long = 5 MessageBoxTimeOut 0, "Отчет сформирован. Это окно закроется автоматически через 5 секунд", "www.excel-vba.ru", _ vbInformation + vbOKOnly, 0&, lSeconds * 1000 End Sub

Основную роль здесь играет строка:

Declare Function MessageBoxTimeOut Lib "User32" Alias "MessageBoxTimeoutA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As VbMsgBoxStyle, ByVal wLanguageId As Long, ByVal dwMilliseconds As Long) As Long

Sub AutoCloseMsgBox() Const lSeconds As Long = 10 Dim retval retval = MessageBoxTimeOut(0, "Файлы обработаны. Вывести список?" & vbNewLine & _ "Если действие не будет выбрано окно закроется через 10 секунд", "www.excel-vba.ru", _ vbInformation + vbYesNo, 0&, lSeconds * 1000) If retval = 6 Then 'была нажата кнопка Да(Yes) 'выводим отчет Else 'была нажата кнопка Нет(No) или окно закрылось само 'другое действие End If End Sub

ДИАЛОГ ВВОДА ИНФОРМАЦИИ ПОЛЬЗОВАТЕЛЕМ - INPUTBOX
InputBox позволяет запросить от пользователя любую текстовую информацию.

InputBox Promt, [Title], [DefaultValue], [XPos], [YPos], [HelpFile], [Context]
Так же как и с MsgBox обязательным аргументом для указания является только Promt - это тот текст, который будет расположен непосредственно на самой форме диалога. Как правило это пояснение, что должен ввести пользователь.

Dim vRetVal 'для получения выбранного значения vRetVal = InputBox("Укажите значение для поиска:", "Запрос данных", "") If vRetVal = "" Then Exit Sub 'завершаем процедуру, если строка пуста

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

Sub DelCols() Dim vRetVal 'для получения выбранного значения vRetVal = InputBox("Укажите номер столбца для удаления(целое число):", "Запрос данных", 5) 'используем Val для преобразования текста vRetVal в число 'Val() преобразует число как текст в число. 'Если указан текст(например "третий") - он будет преобразован в 0 vRetVal = Val(vRetVal) If Val(vRetVal) = 0 Then MsgBox "Номер столбца должен быть целым числом больше нуля!", vbCritical, "DelCols" Exit Sub End If Columns(vRetVal).Delete End Sub

Важно знать: InputBox всегда возвращает только текст. Даже если указать - 5 - он вернет "5". В некоторых случаях это может привести к ошибке типов данных, поэтому я привел выше один из примеров преобразования типов данных к нужному.
Так же по прошествии какого-то времени появится вопрос, как отследить нажатие кнопки Отмена. Ведь ориентир на vRetVal = "" не всегда верен, иногда надо принять пустое значение(в случаях, скажем, замены значений) и отследить именно нажатие Отмена. Сделать это можно так:

vRetVal = InputBox("Укажите номер столбца для удаления(целое число):", "Запрос данных", "") If StrPtr(vRetVal) = 0 Then MsgBox "Нажата кнопка Отмена. Процедура прервана", vbCritical, "DelCols" Exit Sub End If

Больше всего вопросов здесь явно вызовет StrPtr . Эта специальная функция VBA, которая указывает, что переданы некие строковые данные. Если никаких данных не передавалось(а в случае с нажатием кнопки Отмена так и есть) указатель вернет 0. Если какие-то данные были переданы или нажата кнопка Ок(автоматом будет передана строка нулевой длины) - указатель StrPtr вернет значение отличное от нуля.

XPos - положение окна InputBox в твипах по горизонтали относительно левого края экрана. Следует учитывать, что именно относительно экрана, а не окна Excel.
YPos - положение окна InputBox в твипах по вертикали относительно верхнего края экрана.
HelpFile - указывается имя файла-справки в формате .HLP. В отличие от MsgBox указание файла допускается при любых значениях. При этом к уже имеющимся в InputBox кнопкам добавляется еще одна - Help, которая и отвечает за вызов справки.
Context - целое число. Указывается индекс страницы файла-справки, которую необходимо открыть при нажатии кнопки Help. Указывается только если указан параметр HelpFile.

В дополнение приведу классический пример применения InputBox - выполнение процедуры только после введения пароля:

Sub ClearAllCells() Dim vRetVal vRetVal = InputBox("Введите пароль:", "Авторизация", "") If StrPtr(vRetVal) = 0 Then 'Нажата кнопка Отмена Exit Sub End If 'если пароль неверный - завершаем процедуру без выполнения действий If vRetVal <> "1234" Then MsgBox "Введенный пароль неверный", vbCritical, "ClearAllCells" Exit Sub End If 'будет выполнено только если введен правильный пароль - 1234 'полная очистка всех ячеек активного листа ActiveSheet.Cells.Clear End Sub

Private Sub Workbook_Open() 'ThisWorkbook - Обращение к книге с кодом 'Но из модуля самой книги можно обращаться и проще - Me ThisWorkbook.Visible = False Dim user As String, lastrow As Long 'цикл, пока не будут указаны данные пользователя Do While user = "" user = InputBox("Введите имя пользователя:", "Авторизация", "") If StrPtr(user) = 0 Then MsgBox "Приложение будет закрыто", vbCritical, "Авторизация" ThisWorkbook.Close Exit Sub End If If user = "" Then MsgBox "Не указано имя пользователя!", vbCritical, "Авторизация" End If Loop With ThisWorkbook.Worksheets("LOG") 'получаем последнюю заполненную ячейку на листе "LOG" lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row 'записываем имя пользователя .Cells(lastrow + 1, 1) = user 'записываем время входа .Cells(lastrow + 1, 2) = Now End With End Sub

Что важно: этот код записывается в модуль ЭтаКнига(ThisWorkbook) и тогда при любом открытии книги будет появляться запрос на имя пользователя.

Так же некоторые примеры применения InputBox можно найти в статьях на сайте. Например:
Как удалить строки по условию?
Как массово изменить гиперссылки?

ДИАЛОГ ВВОДА ИНФОРМАЦИИ ПОЛЬЗОВАТЕЛЕМ - APPLICATION.INPUTBOX


В общем-то данный диалог мало отличается от обычного InputBox, за исключением типов возвращаемых данных. У данного диалога намного богаче функционал определения типов данных.

InputBox Promt, [Title], [DefaultValue], [Left], [Top], [HelpFile], [HelpContextID], [Type]
почти все параметры аналогичны таким же параметрам в InputBox.
Promt - текст, отображаемый на самой форме. Иначе говоря - сама суть показа диалога.
Title - текст, отображаемый в заголовке окна. В приведенном выше примере это "Запрос данных".
DefaultValue - значение, которое будет показано в поле ввода до указания значения пользователем.
Left - положение окна InputBox в поинтах по горизонтали относительно левого края экрана. В отличие от простого InputBox положение определяется на основании расположения самого окна Excel, а не экрана.
Top - положение окна InputBox в твипах по вертикали относительно верхнего края экрана.
HelpFile - указывается имя файла-справки в формате .HLP. В отличие от MsgBox указание файла допускается при любых значениях. При этом к уже имеющимся в InputBox кнопкам добавляется еще одна - Help, которая и отвечает за вызов справки. Сам вызов справки осуществляется путем нажатия на иконку со знаком вопроса в заголовке диалога.
HelpContextID - целое число. Указывается индекс страницы файла-справки, которую необходимо открыть при нажатии кнопки Help. Указывается только если указан параметр HelpFile.
Type - целое число. Указывается одно из предустановленных значений, указывающих диалогу Application.InputBox тип данных, которые предполагается получить от пользователя. Ниже приведен листинг кода, демонстрирующий запрос данных всех типов с описанием ограничений и нюансов.

Конечно, чаще всего используют Type:=8 , т.к. это избавляет от необходимости рисования своих форм и прочих заморочек для запроса указания диапазона от пользователя. Еще раз обращаю внимание, что для Type:=8 необходим ключевой оператор присвоения Set , т.к. в результате необходимо получить именно диапазон(т.е. объект). Ниже приведена процедура, которая запрашивает диапазон для очистки и корректно обрабатывает ситуацию при нажатии кнопки Отмена(т.е. не показывает никаких ошибок пользователю, а просто не выполняется). Стандартно при нажатии Отмена процедура завершается с ошибкой VBA вида Type Mismatch , что не очень грамотно с точки зрения взаимодействия с пользователем - он не должен видеть внутренние ошибки:

'--------------------------------------------------------------------------------------- ' Procedure : ClearCells ' DateTime : 19.10.2014 22:53 ' Author : The_Prist(Щербаков Дмитрий) ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' http://www.excel-vba.ru ' Purpose : ' Запрашиваем диапазон ячеек для очистки. ' По умолчанию заносится диапазон выделенных на момент запуска ячеек '--------------------------------------------------------------------------------------- Sub ClearCells() Dim vRetVal 'для получения выбранного значения On Error Resume Next Set vRetVal = Application.InputBox("Укажите диапазон для очистки ячеек:", "Запрос данных", Selection.Address, Type:=8) If vRetVal Is Nothing Then 'нажата кнопка Отмена - диапазон не выбран MsgBox "Отмена выполнения", vbCritical, "Нет данных" Exit Sub 'завершаем процедуру, т.к. ячейки не выбраны End If 'диапазон выбран - очищаем ячейки vRetVal.Clear End Sub

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

Синтаксис оператора AppActivate состоит из следующих именованных аргументов:

Часть Описание
заголовок Обязательно. Строковое выражение, указывающее заголовок в строке заголовка окна приложения, которое необходимо сделать активным. Для активации приложения на месте заголовка может использоваться идентификатор задачи, возвращаемый функцией Shell.
wait Не обязательно указывать. Логическое значение, указывающее наличие фокуса в вызывающем приложении перед активацией другого. При значении False (по умолчанию) указанное приложение сразу становится активным, даже если вызывающее приложение не имеет фокуса. Если true, вызываемого приложения ждет, пока он имеет фокус, а затем активирует указанное приложение.

Комментарии

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

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

Пример

В этом примере показаны различные варианты использования оператора AppActivate для активации окна приложения. В утверждениях Shell предполагается, что приложения находятся в указанных путях. В macOS диск по умолчанию обозначается "HD", а части аргумента "путь" отделяются друг от друга двоеточиями вместо обратной косой черты.

См. также

Поддержка и обратная связь

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

Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Const HWND_NOTOPMOST = -2
Public Const HWND_TOPMOST = -1
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1

Public Sub SetFormPosition(frmHandl As Long, TopPosition As Boolean)
If TopPosition Then
SetWindowPos frmHandl, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOMOVE
Else
SetWindowPos frmHandl, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
End If
End Sub

Поместите эту строку на форму в процедуре загрузки

SetFormPosition Me.hwnd, True

Как в Visual Basic сделать форму неподвижной?

Присвойте свойству формы Moveable значение False, и вашу форму нельзя будет перетаскивать в другое место

Как в Visual Basic скрыть или показать окно?

Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Флаги функции,определяющие вид окна:

SW_HIDE = 0 ' Скрыть окно и активизировать другое окно
SW_MAXIMIZE = 3 ' Развернуть окно
SW_MINIMIZE = 6 ' Свернуть окно и активизировать следующее окно в Z-порядке(следующее под свернутым окном)
SW_RESTORE = 9 ' Активизировать и отобразить окно.Если окно свернуто или развернуто,Windows восстанавливает его исходный размер и положение
SW_SHOW = 5 ' Активизировать окно
SW_SHOWMAXIMIZED = 3 ' Отобразить окно в развернутом виде
SW_SHOWMINIMIZED = 2 ' Отобразить окно в свернутом виде
SW_SHOWMINNOACTIVE = 7 ' Отобразить окно в свернутом виде. Активное окно остается активным
SW_SHOWNA = 8 ' Отобразить окно в текущем состоянии.Активное окно остается активным
SW_SHOWNOACTIVATE = 4 ' Отобразить окно в соответствии с последними значениями позиции и размера.Активное окно остается активным
SW_SHOWNORMAL = 1 ' Активизировать и отобразить окно. Если окно свернуто или развернуто,Windows восстанавливает его исходный размер и положение.Приложение должно указывать этот флаг при первом отображении окна

Как в Visual Basic скрыть программу в Менеджере задач?

Правда в процессах программа присутствовать будет :/

Как в Visual Basic сменить логическое значение?

Самый логичный способ изменить логическое значение:

Dim A as Boolean
A = Not A

Как в Visual Basic сменить фон Рабочего стола?

Const SPI_SETDESKWALLPAPER = 20
Const SPIF_SENDWININICHANGE = &H2
Const SPIF_UPDATEINIFILE = &H1

Public Declare Function SystemParametersInfo Lib "User" (ByVal uAction as Long, ByVal uParam as Long, lpvParam As Any, ByVal fuWinIni as Long) As Integer

Private Sub SetDeskTop(ByVal strFileName as String)
Dim a as Long 'результирующее значение
а = SystemParametersInfo (SPI_SETDESKTOPWALLPAPER, 0, ByVal strFileName, intSPIFlags)
End Sub

'здесь:
'intSPIFlags = 0 тогда установка wallpaper будет на одну сессию Windows
'intSPIFlags = SPIF_UPDATEINIFILE или SPI_SENDWININICHANGE тогда установка сохранится

метод AppActivate объекта Wscript.Shell

И так, давайте рассмотрим метод AppActivate объекта WScript_Shell, который позволяет сделать активное окно Window заданной программы. Давайте мысленно подумаем, где метод AppActivate может пригодиться: у нас работает три разных приложения, каждое из них находится в состоянии ожидания ввода данных. Задача – написать сценарий, который обработает нужную информацию, и в зависимости от ее типа, передаст ее той или иной программе.

Как активировать окно Windows программным путем

Что бы имитировать ввод данных с клавиатуры можно использовать функцию SendKeys, вот только есть одна беда, данные будут отправляться в слепую, по принципу, кто активен – тот и получил. Вот тут-то нам и пригодится функция AppActivate, которая позволяет активировать Windows окно, давайте посмотрим на ее синтаксис:

AppActivate (String | ProcessID) – Видим, что метод может принимать только один параметр, который, в свою очередь, может быть или строкой (String), или целым числом (ProcessID). В первом случае, мы передаем методу AppActivate имя диалогового окна того приложения, которое хотим сделать активным, во втором случае – идентификатор процесса заданной программы.

Вроде всё понятно, но есть один подводный камень. Если мы одновременно запустим несколько экземпляров одной программы , например, программу Блокнот, то мы увидим, что заголовки окон идентичны, в этом случае, метод AppActivate сделает активное окно того экземпляр, который первый в его внутреннем списке, грубо говоря, мы не сможем активировать окно ОС Windows для нужной нам копии . Но, зато, для активации Windows окна можно использовать идентификатор процесса – его можно узнать, запустив диспетчер задач и перейдя на вкладку процессы, имя процесса для программы _Блокнот_ – notepad.exe.

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

активное окно приложения Windows

Хорошо, давайте посмотрим на следующий пример на языке vbscript:

'*********************************************************************************** ' Wscript_Shell_метод_AppActivate ' Как активировать окно Windows приложения ' AppActivate1.vbs '*********************************************************************************** Option Explicit dim WshShell dim note_1, note_2, note_3 ' Создаем ссылку на объект WScript_Shell set WshShell = WScript.CreateObject("WScript.Shell") '----------------------------------------------------------------------- ' запускаем три копии _блокнота_ '----------------------------------------------------------------------- ' первый экземпляр set note_1 = WshShell.Exec("notepad.exe") ' ждем 500 миллисекунд WScript.Sleep 500 ' отправляем строку WshShell.SendKeys ("первая копия") '----------------------------------------------------------------------- ' второй экземпляр set note_2 = WshShell.Exec("notepad.exe") ' ждем 500 миллисекунд WScript.Sleep 500 ' отправляем строку WshShell.SendKeys ("вторая копия") '----------------------------------------------------------------------- ' третий экземпляр set note_3 = WshShell.Exec("notepad.exe") ' ждем 500 миллисекунд WScript.Sleep 500 With WshShell ' отправляем строку .SendKeys ("третья копия") '----------------------------------------------------------------------- ' запускаем калькулятор .Exec("calc.exe") ' пробуем активировать окно Windows по его имени ' потерпим неудачу. .AppActivate ("Безымянный - Блокнот") MsgBox "Какой экземпляр активирован?" ' активное окно второй копии _блокнота_ .AppActivate (note_2.ProcessID) End With MsgBox "Какой экземпляр активирован?"

В данном примере, мы трижды запускаем программу Блокнот, причем, сразу после запуска, симулируем ввод текста, причем, для каждого экземпляра разный, это позволит нам видеть, действительно ли мы смогли активировать нужное окно Windows. Мы дважды используем метод _AppActivate_, сперва пробуем активировать окно программы по имени ( тут нет никакой логики, так как все три окна имеют одинаковое имя ), а потом пробуем активировать окно программы Windows для второй копии по его идентификатору.

Как активировать окно ОС Windows

А вот аналогичный пример, но уже на языке jscript:

И так, в этой статье мы рассмотрели объект Wscript_Shell сервера Windows Script Host, а именно: метод _AppActivate_, который позволяет активировать окно Windows приложения.

Спасибо за внимание. Автор блога Владимир Баталий

Довольно часто при создании макросов может понадобиться придать им некой “динамичности”. Как и рядовые приложения, редактор VBA предоставляет объект UserForm, который отвечает за создание формы.

userform vba - класс для работы с формой

По своей природе, объект vba UserForm представляет из себя пустое диалоговое окно, на поверхность которого можно добавить различные элементы управления (кнопки, списки и так далее). В отличии от тех объектов, с которыми мы работали в сценариях сервера Windows Script Host, объекты VBA помимо свойств и методом, обладают еще и событиями, кроме этого, объекты класса UserForm vba содержат в себе модуль класса, который может хранить собственные методы и свойства, или код для обработки событий.

Что бы добавить новую форму к vba проекту, воспользуйтесь меню Insert , пункт UserForm . Обратите внимание: в окне Проектов есть папка Forms, в которой хранятся все формы, добавленные в проект, имя для формы назначается автоматически, например, UserForm1, UserForm2,…,UserFormN. Если вы случайно закроете окно формы, то его можно вновь запустить, выбрав нужную форму в окне Проектов. Можете также прочитать предыдущую стать "Знакомство с редактором VBA"

Некоторые свойства класса UserForm vba языка

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

BackColor – содержит цвет фона.

BorderColor – цвет рамки

BorderStyle – стиль рамки, принимает только два возможных значения.

Caption – свойство определяет заголовок формы, фактически, это то т же заголовок окна программы. По умолчанию, данное свойство содержит то же значение, что и свойство Name.

Enabled – принимает логическое True или False, и определяет, доступна ли форма. Если значение свойства ровно False, то ни один из элементов управления не доступен.

ShowModal – как и предыдущее свойство, ShowModal может принимать логические значения. True – по умолчанию, “модальный” режим, пока не будет закрыта текущая форма, другая форма или возврат в документ будут недоступны.

Font – определяет шрифт.

ForeColor – определяет цвет переднего плана формы, например, цвет текста.

Некоторые методы класса UserForm vba языка

Hide – данный метод убирает из видимости форму, делая ее скрытой. Все ее параметры и элементы управления остаются неизменными.

Repaint – позволяет перерисовать отображаемую форму.

Show – метод противоположен методу Hide, он делает форму видимой, если она еще не загружена в память, то происходит ее загрузка.

И так, что бы не томить душу, давайте создадим простую форму, назовем ее “Первая программа” (свойство Caption), у меня имя формы UserForm1. Хорошо, теперь нам нужно написать макрос, при запуске которого будет выводиться форма. Для этого добавляем в проект новый модуль и в окне кода пишем следующее:

Sub Module1() UserForm1.Show End Sub

Тут Module1 – имя процедуры, оно совпадает с именем модуля, оно хранится в свойстве Name. Sub … End Sub – это блок процедуры. UserForm1.Show – тут мы вызываем метод Show объекта UserForm1 для отображения формы, помните, UserForm1 – имя моей формы, его тоже можно изменить.

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

Некоторые события класса UserForm vba языка

Редактор кода для userform vba и модуля

Activate – событие возникает каждый раз, когда окно формы становится активным.

Click – происходит клик мышью по поверхности, не занятой элементами управления.

DblClick – аналог предыдущему событию, только тут происходит двойной клик по форме.

Deactivate – событие возникает каждый раз, как окно формы переходит в неактивное состояние.

Initialize – возникает как только происходит загрузка формы в память с помощью метода Show или оператора Load.

Resize – происходит изменение размеров формы

Terminate – событие происходит каждый раз, как только форма выгружается из памяти.

Помним, что для вызова метода или события, сперва идет имя объекта, а потом, после точки, имя метода или свойства. С событиями все по-другому: нам нужно создать процедуру и присвоить ей имя в стиле “Объект_Событие”, то есть, сначала мы пишем имя объекта (например, UserForm1), потом идет символ подчеркивания и имя события.

Ладно, откройте редактор формы и дважды щелкнете по полю формы, вас сразу перенаправит в редактор кода, где содержатся следующие строки:

Private Sub UserForm_Click() End Sub

Видим, что данная процедура рассчитана для события Click, давайте в ней пропишем:

MsgBox "Вы кликнули по форме. "

Обратите внимание, что у вас в проекте есть форма и два редактора кода, один содержит строки:

Sub Module1() UserForm1.Show End Sub

Это фактически и есть наш макрос, он отображается в окне проекта. Что бы получить доступ к редактору кода для самой формы, выберите в редакторе vba, в окне Проекта нужную форму и нажмите на крайнюю левую кнопку вверху (View Code), или просто выберите аналогичный пункт в меню View. Также, обратите внимание, что теперь вы можете выбрать нужное событие в окне кода для данной формы, список находится вверху справа.

Ладно, на этом пока все, тут мы рассмотрели класс языка vba UserForm, впереди нас ждет еще много материала, поэтому, я не хочу сразу впихивать все подробности в одну статью.

Спасибо за внимание. Автор блога Владимир Баталий

Читайте также: