|
DjAlex77 Пользователь Сообщений: 102 |
#1 21.07.2022 04:40:40 Уважаемые знатоки VBA, здравствуйте. По команде:
окно закрывается но не сразу, а только после выполнения всех макросов. В предыдущей версии Excel это не было проблемой, а в 13-м не закрывшееся диалоговое окно перекрывает
Из-за этого не нажать кнопку и приходится щёлкать все вкладки чтоб увидеть «MsgBox» либо чтоб увидеть то, что должен вывести макрос. Оба файла положить в одно место. Прикрепленные файлы
Изменено: DjAlex77 — 21.07.2022 04:42:52 |
||||
|
БМВ Модератор Сообщений: 21383 Excel 2013, 2016 |
#2 21.07.2022 06:18:16 Ну раз так
то что-то ускользнуло от разработчиков и обратная совместимость не поддерживается полностью. DialogSheets — это древний аналог форм появившийся еще со времен Excel Macro 4. Сделайте форму, это не сложно. По вопросам из тем форума, личку не читаю. |
||
|
DjAlex77 Пользователь Сообщений: 102 |
БМВ, у меня там в диалоговом окне куча ссылок, большая таблица (копирующаяся в буфер обмена) с меняющимся размером и количеством строк, в зависимости от условий. В форме некоторые необходимые возможности не реализовать, или я не знаю как. Если и получится сделать такое окно через форму то минимум за месяц. В своё время пробовал через форму, не получилось. |
|
БМВ Модератор Сообщений: 21383 Excel 2013, 2016 |
#4 21.07.2022 07:52:38
По вопросам из тем форума, личку не читаю. |
||
|
RAN Пользователь Сообщений: 7091 |
#5 21.07.2022 12:21:21
Не могли бы вы выложить файлик, где все это можно посмотреть? Как вставить таблицу в лист диалога? Как прописать ссылки? |
||
|
DjAlex77 Пользователь Сообщений: 102 |
#6 22.07.2022 02:44:15
Оригинальный файл огромный, почистить от ком. информации очень трудоёмко, поэтому только так: А это окно использую как информационное и как меню для запуска необходимых макросов. Прикрепленные файлы
|
||
|
DjAlex77 Пользователь Сообщений: 102 |
#7 22.07.2022 02:46:02 БМВ, Спасибо Вам Огромное!!
Пришлось добавить «Application.ScreenUpdating» оригинальный файл тяжёлый и на экране отображался процесс автоматического заполнения «111 BDR.xlsm» (мелькание на экране лишнее). Попробую ещё прописать автоматическое прыгание с листа на лист, действие лишнее но вручную так получается увидеть «MsgBox». Возможно так код будет быстрее работать. Или может есть способ задать свойства «MsgBox» отображаться поверх ВСЕХ окон? Может кто-то подскажет какой-то костыль без использования задержки по времени, чтоб диалоговое окно закрывалось моментально)? |
||
|
DjAlex77 Пользователь Сообщений: 102 |
#8 22.07.2022 03:54:50
Не помогает. Почему-то 13-й Excel диалоговое окно открывает как будто в новом файле. Прикрепленные файлы
|
||
|
DjAlex77 Пользователь Сообщений: 102 |
#9 26.07.2022 01:24:09
Уважаемые знатоки, подскажите пожалуйста, как принудительно закрыть диалоговое окно без задержки по времени? |
||
Работа с диалогами
Несомненно каждый разработчик делает работу простого пользователя хоть немного, но проще. И конечно, порой просто необходима обратная связь от пользователя при выполнении некоторых программ. О ней и хочу сегодня рассказать.
Что я имею ввиду: есть ситуации, когда необходимо:
- сообщить пользователю о выполнении кода;
- получить от пользователя подтверждение на выполнение того или иного действия;
- запросить какие-то данные(число, текст для поиска, диапазон поиска и т.п.).
Простейшие запросы и подтверждения можно сделать при помощи уже встроенных диалоговых окон.
Из основных можно выделить три типа:
MsgBox — окно информирования пользователя с возможностью запроса действия (Да, Нет, Отмена и т.п.);
InputBox — окно запроса текстовой информации от пользователя (текст для поиска, дата, число и т.п.);
Application.InputBox — чуть более расширенная версия InputBox с возможностью указания не только текста и чисел, но и выделения диапазона ячеек (например для указания ячеек, в которых осуществлять поиск значения или которые необходимо закрасить).
ИНФОРМАЦИОННЫЙ ДИАЛОГ MSGBOX 
Самый простой тип. Используется для информирования пользователя. Как правило применяется по окончании выполнения кода:
MsgBox Promt, [Buttons], [Title], [HelpFile], [Context]
Обязательным к указанию является только первый параметр — Promt , в котором указывается непосредственно сообщение для вывода:
MsgBox «Обработка завершена»
Все остальные параметры указывать не обязательно, но их использование несколько расширяет возможности данного диалогового окна.
Buttons — указывается тип выводимых кнопок и стиль окна. По умолчанию применяется vbOKOnly — одна только кнопка Ок:
‘показываем окно с кнопкой по умолчанию и типом важного сообщения MsgBox «Обработка завершена», vbCritical
| Значение | Числовая константа | Описание |
|---|---|---|
| vbOKOnly | 0 | Отображает только кнопку OK |
| vbOKCancel | 1 | Отображает кнопки ОК и Отмена |
| vbAbortRetryIgnore | 2 | Отображает кнопки Прервать, Повтор и Пропустить |
| vbYesNoCancel | 3 | Отображает кнопки Да, Нет и Отмена |
| vbYesNo | 4 | Отображает кнопки Да и Нет |
| vbRetryCancel | 5 | Отображает кнопки Повтор и Отмена |
| vbCritical | 16 | Отображает значок важного сообщения |
| vbQuestion | 32 | Отображает значок важного запроса |
| vbExclamation | 48 | Отображает значок предупреждающего сообщения |
| vbInformation | 64 | Отображает значок информационного сообщения |
| vbDefaultButton1 | 0 | По умолчанию выделена первая кнопка |
| vbDefaultButton2 | 256 | По умолчанию выделена вторая кнопка |
| vbDefaultButton3 | 512 | По умолчанию выделена третья кнопка |
| vbDefaultButton4 | 768 | По умолчанию выделена четвертая кнопка |
| vbApplicationModal | 4098 | Все приложения приостанавливают свою работу до момента, пока пользователь ответит на запрос в окне сообщения (работает не во всех случаях) |
| vbMsgBoxHelpButton | 16384 | Показываются кнопки Ок и Help |
Константы 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
это и есть сама функция, создающая MsgBox.
Главное: эта строка должна располагаться в самом верху стандартного модуля(в области объявлений, перед всеми процедурами и функциями).
Так же следует помнить, что это функция API и в некоторых версиях Excel именно в таком виде может не работать — вся строка будет подсвечена красным. Если проявился такой эффект, то можно просто добавить ключевое слово PtrSafe, отвечающее за совместимость функции с 64-битными ОС:
Declare PtrSafe 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
Помимо очевидного текста сообщения и заголовка, который можно заменить на свой, главное внимание уделим константе lSeconds . Она отвечает за количество секунд показа сообщения. В примере выше сообщение будет показано на 5 секунд, после чего закроется само собой, если ранее не была нажата кнопка Ок.
Если необходимо показать сообщение на 10 секунд, то надо лишь заменить 5 на 10:
Const lSeconds As Long = 10
Параметр uType работает точно так же, как параметр Buttons у стандартного MsgBox. Т.е. можно комбинировать различные виды кнопок и использовать этот MsgBox как стандартный, но при этом закрыть его автоматически, если пользователь случайно «уснул» или ему лень/некогда что-то нажимать:
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
А вот еще один пример применения — запрос имени пользователя и запись его в лист LOG, чтобы можно было отследить кто и когда открывал файл. При этом если пользователь нажал Отмена, то книга закроется, а если не укажет имя пользователя — появится сообщение и заново запрос. И так до тех пор, пока имя пользователя не будет введено или не будет нажата кнопка Отмена:
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 тип данных, которые предполагается получить от пользователя. Ниже приведен листинг кода, демонстрирующий запрос данных всех типов с описанием ограничений и нюансов.
Dim vRetVal ‘для получения выбранного значения ‘запрос формулы — Type:=0 ‘возвращает либо произвольный текст, указанный в поле или ссылку на указанную ячейку в стиле R1C1 vRetVal = Application.InputBox(«Укажите формулу:», «Запрос данных», «», Type:=0) ‘запрос числа — Type:=1 ‘возвращает число. Не даст ввести текст, выдав сообщение об ошибке vRetVal = Application.InputBox(«Укажите любое число:», «Запрос данных», «», Type:=1) ‘запрос текст — Type:=2 ‘возвращает указанный текст. При указании числа оно будет в виде текста: 1=»1″ vRetVal = Application.InputBox(«Укажите любой текст:», «Запрос данных», «», Type:=2) ‘запрос логического значения True или False — Type:=4 ‘значение указывает в текущей локализации офиса ‘для русской это ИСТИНА или ЛОЖЬ ‘так же можно указать универсальные числовые константы — 1 или 0. 1 — ИСТИНА; 0 — ЛОЖЬ ‘Не даст ввести иные значения, выдав сообщение об ошибке ‘возвращает указанное логическое значение в английской локализации vRetVal = Application.InputBox(«Укажите ИСТИНА или ЛОЖЬ:», «Запрос данных», «», Type:=4) ‘запрос диапазона — Type:=8 ‘возвращает ссылку на диапазон ‘При получении такого значения обязательно следует использовать оператор Set ‘В противном случае вернет значение массива(Array), содержащего значения указанных ячеек ‘при указании через Set и нажатии Отмена будет ошибка VBA Set vRetVal = Application.InputBox(«Укажите диапазон для очистки ячеек:», «Запрос данных», «», Type:=8) ‘запрос значения ошибки #Н/Д — Type:=16 ‘всегда возвращает значение ошибки #Н/Д независимо от введенного значения vRetVal = Application.InputBox(«Укажите диапазон для очистки ячеек:», «Запрос данных», «», Type:=16) ‘запрос диапазона ячеек для создания массива — Type:=64 ‘возвращает массив ячеек с границами начала от 1(Option Base 1) ‘если указать всего одну ячейку vRetVal будет содержать значение этой ячейки, а не массив vRetVal = Application.InputBox(«Укажите диапазон для создания массива:», «Запрос данных», «», Type:=64)
Конечно, чаще всего используют Type:=8 , т.к. это избавляет от необходимости рисования своих форм и прочих заморочек для запроса указания диапазона от пользователя. Еще раз обращаю внимание, что для Type:=8 необходим ключевой оператор присвоения Set , т.к. в результате необходимо получить именно диапазон(т.е. объект). Ниже приведена процедура, которая запрашивает диапазон для очистки и корректно обрабатывает ситуацию при нажатии кнопки Отмена(т.е. не показывает никаких ошибок пользователю, а просто не выполняется). Стандартно при нажатии Отмена процедура завершается с ошибкой VBA вида Type Mismatch , что не очень грамотно с точки зрения взаимодействия с пользователем — он не должен видеть внутренние ошибки:
Источник
Как закрыть Эксель, если не закрывается? Воспользуйтесь комбинацией Alt+F4, запустите «Диспетчер задач» и удалите процесс Excel, снимите задачу для приложения или просто перезагрузите компьютер / ноутбук (рекомендуется в крайнем случае). Ниже подробно рассмотрим, как действовать при возникновении подобных проблем, и какими методами можно закрыть программу.
Причины, почему не закрывается Excel
Существует множество причин, почему не закрывается Эксель, как и в случае с другими программами. К основным объяснениям можно отнести:
- Ошибка в программном коде.
- Конфликты с другими ПО.
- Загрязненная операционная система.
- Применение не подходящей версии Виндовс.
- Сбои работы жесткого диска.
- Дефицит оперативной памяти.
- Действие вирусов.
- Прочие причины.
Что делать
При возникновении зависания нужно сначала разобраться, как закрыть программу, если при нажатии на «крестик» Эксель не закрывается. Рассмотрим основные варианты.
Используйте горячие клавиши
Первое, что стоит сделать при возникновении подобных проблем — попробовать закрыть приложение с помощью комбинации горячих кнопок. Чаще всего работает Alt+F4. В ее задачи входит принудительное прекращение работы процесса.
Закройте приложение через специальную панель
Если рассмотренный метод не помогает, можно использовать еще один метод, как закрыть Эксель — сделать это с помощью вызова специальной панели. Для этого жмите на Ctrr+Alt+Del, после чего войдите в «Диспетчер задач» и во вкладку «Процессы». Здесь найдите нужный вариант с названием Excel, жмите правой кнопкой мышки и кликните «Снять задачу». Как вариант, можно зайти в раздел «Служба приложений» и отключить нужный софт там.
Специальная программа
Бывают ситуации, когда не закрывается файл Эксель из-за отсутствия процесса в списке. В таком случае может потребоваться специальная программа — Process Exprorer. Она не требует установки. Достаточно скачать ее с официального сайта docs.microsoft.com/ru-ru/previous-versions/bb896653(v=msdn.10)?redirectedfrom=MSDN, запустить и найти нужный процесс. В отличие от «Диспетчера задач» здесь отображаются все процессы. Найдите интересующий, кликните на него правой кнопкой мышки и выберите кнопку удаления.
Альтернативный вариант
Крайний метод, что делать, если не закрывается Эксель при выполнении всех рассмотренных выше шагов — принудительно перезапустить компьютер / ноутбук. После запуска программа будет закрыта, и ее можно будет снова запустить. При этом сохраняется риск сбоев во время работы, поэтому нужно определить причину.
Что еще сделать после закрытия / во время работы
Ситуация, когда не закрываются файлы Excel, нужно разобраться с дальнейшими шагами. Важно выявить причину и избежать подобных ситуаций в будущем. Сделайте следующие шаги.
Убедитесь, что Эксель не пользуется другим процессом
В ситуации, когда Excel занята другим процессом, эти данные будут отображаться в нижней части окна. Если параллельно какие-то приложения пытаются выполнить действия, Эксель не будет отвечать, и закрыть его не получится. В таком случае дождитесь, пока задание выполниться, после чего сделайте еще одну попытку.
Проверьте систему на вирусы
Если Excel не закрывается, проверьте ПК / ноутбук на вирусы. Проблемы с прекращением работы могут возникнуть на фоне действия вредоносного ПО. В случае его удаления можно попробовать закрыть контент, и это происходит без проблем.
Решение проблем с надстройками
Применение надстроек упрощает работу с Эксель, но параллельно могут возникать конфликты. Попробуйте запустить приложение без надстроек и проверьте, удастся ли закрыть приложение. При работе в Виндовс 10 кликните на Win+R, а после — Excel / safe. Далее жмите «ОК». Если проблему удалось устранить, кликните на «Файл», а далее «Параметры» и «Надстройки».
Выберите «Надстройки СОМ» и жмите на кнопку «Перейти». После очистки флажков жмите «ОК». После откройте и попробуйте закрыть Эксель. Если он все равно не закрывается, причина может быть в другом.
Убедитесь, что файл не создается другим приложением. В таком случае некоторые функции Excel могут работать некорректно.
Дополнительные советы
Жалобы, мол, не могу закрыть Эксель, часто встречаются в Интернете. Пользователи не могут разобраться с зависанием и часто решают вопрос кардинально и путем отключения ПК / ноутбука. Но в большинстве случаев проблему можно решить более простым путем:
- Убедитесь, что софт не закрывается именно из-за внутренних проблем. Бывают ситуации, что неисправность именно в компьютере. Распространенная ситуация, когда закрыть Эксель не удается из-за дефицита оперативной памяти или сбоях в работе процессора. В таком случае нужно попробовать закрыть другое «тяжелое» ПО и повторить попытку.
- Переустановите программу. Если с Excel регулярно возникают проблемы, возможно, он установился некорректно и требует перестановки. Попробуйте удалить и установить заново программу.
- Обновите Excel, если он регулярно не закрывается, до последней версии.
- Убедитесь, что версия и разрядность Виндовс соответствуют требованиям.
- Выждите время. Многие пользователи слишком торопятся и хотят, чтобы ПО закрывалось мгновенно. Но иногда программа немного зависает. Нужно просто подождать и закрыть ее через несколько минут.
Зная, как закрыть Эксель, и почему он не закрывается, вы сможете решить проблему с программой и исключить ее появление в будущем. Для начала перепробуйте приведенные выше методы, а перезапуск / выключение оставьте на крайний случай. Это связано с тем, что при грубой перезагрузки многая информация может быть утеряна. Также не забывайте сохраняться перед попыткой закрытия, чтобы не допустить потери важных файлов.
В комментариях расскажите, какой из приведенных советов вам действительно помог, и какие еще шаги можно реализовать для решения ситуации.
Отличного Вам дня!
Хитрости »
19 Октябрь 2014 101536 просмотров
Работа с диалогами
Несомненно каждый разработчик делает работу простого пользователя хоть немного, но проще. И конечно, порой просто необходима обратная связь от пользователя при выполнении некоторых программ. О ней и хочу сегодня рассказать.
Что я имею ввиду: есть ситуации, когда необходимо:
- сообщить пользователю о выполнении кода;
- получить от пользователя подтверждение на выполнение того или иного действия;
- запросить какие-то данные(число, текст для поиска, диапазон поиска и т.п.).
Простейшие запросы и подтверждения можно сделать при помощи уже встроенных диалоговых окон.
Из основных можно выделить три типа:
MsgBox — окно информирования пользователя с возможностью запроса действия (Да, Нет, Отмена и т.п.);
InputBox — окно запроса текстовой информации от пользователя (текст для поиска, дата, число и т.п.);
Application.InputBox — чуть более расширенная версия InputBox с возможностью указания не только текста и чисел, но и выделения диапазона ячеек (например для указания ячеек, в которых осуществлять поиск значения или которые необходимо закрасить).
- Информационный диалог MsgBox
- MsgBox, автоматически закрываемый по истечении указанного времени
- Диалог ввода информации пользователем InputBox
- Диалог выбора диапазона Application.InputBox
Самый простой тип. Используется для информирования пользователя. Как правило применяется по окончании выполнения кода:
MsgBox Promt, [Buttons], [Title], [HelpFile], [Context]
Обязательным к указанию является только первый параметр —
Promt
, в котором указывается непосредственно сообщение для вывода:
MsgBox "Обработка завершена"
Все остальные параметры указывать не обязательно, но их использование несколько расширяет возможности данного диалогового окна.
Buttons — указывается тип выводимых кнопок и стиль окна. По умолчанию применяется vbOKOnly — одна только кнопка Ок:
'показываем окно с кнопкой по умолчанию и типом важного сообщения MsgBox "Обработка завершена", vbCritical
Доступны значения:
| Значение | Числовая константа | Описание |
|---|---|---|
| vbOKOnly | 0 | Отображает только кнопку OK |
| vbOKCancel | 1 | Отображает кнопки ОК и Отмена |
| vbAbortRetryIgnore | 2 | Отображает кнопки Прервать, Повтор и Пропустить |
| vbYesNoCancel | 3 | Отображает кнопки Да, Нет и Отмена |
| vbYesNo | 4 | Отображает кнопки Да и Нет |
| vbRetryCancel | 5 | Отображает кнопки Повтор и Отмена |
| vbCritical | 16 | Отображает значок важного сообщения |
| vbQuestion | 32 | Отображает значок важного запроса |
| vbExclamation | 48 | Отображает значок предупреждающего сообщения |
| vbInformation | 64 | Отображает значок информационного сообщения |
| vbDefaultButton1 | 0 | По умолчанию выделена первая кнопка |
| vbDefaultButton2 | 256 | По умолчанию выделена вторая кнопка |
| vbDefaultButton3 | 512 | По умолчанию выделена третья кнопка |
| vbDefaultButton4 | 768 | По умолчанию выделена четвертая кнопка |
| vbApplicationModal | 4098 | Все приложения приостанавливают свою работу до момента, пока пользователь ответит на запрос в окне сообщения (работает не во всех случаях) |
| vbMsgBoxHelpButton | 16384 | Показываются кнопки Ок и Help |
Константы 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 удобен, если надо проинформировать пользователя о каких-то событиях или предоставить ему выбор Да или Нет. Но в тоже время есть один недостаток: этот диалог не закроется, пока пользователь не нажмет хоть какую-то кнопку. Но бывает необходимо просто проинформировать и закрыть окно независимо от реакции пользователя. Показали окно, подождали секунд 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
это и есть сама функция, создающая MsgBox.
Главное: эта строка должна располагаться в самом верху стандартного модуля(в области объявлений, перед всеми процедурами и функциями).
Так же следует помнить, что это функция API и в некоторых версиях Excel именно в таком виде может не работать — вся строка будет подсвечена красным. Если проявился такой эффект, то можно просто добавить ключевое слово PtrSafe, отвечающее за совместимость функции с 64-битными ОС:
Declare PtrSafe 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
Помимо очевидного текста сообщения и заголовка, который можно заменить на свой, главное внимание уделим константе lSeconds. Она отвечает за количество секунд показа сообщения. В примере выше сообщение будет показано на 5 секунд, после чего закроется само собой, если ранее не была нажата кнопка Ок.
Если необходимо показать сообщение на 10 секунд, то надо лишь заменить 5 на 10:
Const lSeconds As Long = 10
Параметр uType работает точно так же, как параметр Buttons у стандартного MsgBox. Т.е. можно комбинировать различные виды кнопок и использовать этот MsgBox как стандартный, но при этом закрыть его автоматически, если пользователь случайно «уснул» или ему лень/некогда что-то нажимать:
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 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
А вот еще один пример применения — запрос имени пользователя и запись его в лист LOG, чтобы можно было отследить кто и когда открывал файл. При этом если пользователь нажал Отмена, то книга закроется, а если не укажет имя пользователя — появится сообщение и заново запрос. И так до тех пор, пока имя пользователя не будет введено или не будет нажата кнопка Отмена:
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 тип данных, которые предполагается получить от пользователя. Ниже приведен листинг кода, демонстрирующий запрос данных всех типов с описанием ограничений и нюансов.
Dim vRetVal 'для получения выбранного значения 'запрос формулы - Type:=0 'возвращает либо произвольный текст, указанный в поле или ссылку на указанную ячейку в стиле R1C1 vRetVal = Application.InputBox("Укажите формулу:", "Запрос данных", "", Type:=0) 'запрос числа - Type:=1 'возвращает число. Не даст ввести текст, выдав сообщение об ошибке vRetVal = Application.InputBox("Укажите любое число:", "Запрос данных", "", Type:=1) 'запрос текст - Type:=2 'возвращает указанный текст. При указании числа оно будет в виде текста: 1="1" vRetVal = Application.InputBox("Укажите любой текст:", "Запрос данных", "", Type:=2) 'запрос логического значения True или False - Type:=4 'значение указывает в текущей локализации офиса 'для русской это ИСТИНА или ЛОЖЬ 'так же можно указать универсальные числовые константы - 1 или 0. 1 - ИСТИНА; 0 - ЛОЖЬ 'Не даст ввести иные значения, выдав сообщение об ошибке 'возвращает указанное логическое значение в английской локализации vRetVal = Application.InputBox("Укажите ИСТИНА или ЛОЖЬ:", "Запрос данных", "", Type:=4) 'запрос диапазона - Type:=8 'возвращает ссылку на диапазон 'При получении такого значения обязательно следует использовать оператор Set 'В противном случае вернет значение массива(Array), содержащего значения указанных ячеек 'при указании через Set и нажатии Отмена будет ошибка VBA Set vRetVal = Application.InputBox("Укажите диапазон для очистки ячеек:", "Запрос данных", "", Type:=8) 'запрос значения ошибки #Н/Д - Type:=16 'всегда возвращает значение ошибки #Н/Д независимо от введенного значения vRetVal = Application.InputBox("Укажите диапазон для очистки ячеек:", "Запрос данных", "", Type:=16) 'запрос диапазона ячеек для создания массива - Type:=64 'возвращает массив ячеек с границами начала от 1(Option Base 1) 'если указать всего одну ячейку vRetVal будет содержать значение этой ячейки, а не массив vRetVal = Application.InputBox("Укажите диапазон для создания массива:", "Запрос данных", "", Type:=64)
Конечно, чаще всего используют 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
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Вы также можете дважды щелкнуть одну из вкладок на ленте или нажать Ctrl + F1, чтобы скрыть ленту.
Другой способ свернуть или скрыть ленту — щелкнуть правой кнопкой мыши по ленте и выбрать « Свернуть ленту» . Галочка рядом с параметром Свернуть ленту указывает, что лента разрушается, когда вы ее не используете.
Когда лента скрыта, видны только вкладки.
Нажмите на вкладку, чтобы временно показать ленту. Когда вы нажимаете кнопку или команду на вкладке, лента снова скрывается.
Показать ленту Excel
Чтобы снова постоянно показывать ленту, дважды щелкните вкладку или снова нажмите Ctrl + F1 .
Вы также можете нажать на вкладку, чтобы временно показать ленту. Затем щелкните значок чертежной кнопки в правом нижнем углу ленты.
Другой способ постоянного показа ленты — щелкнуть правой кнопкой мыши на панели вкладок и снова выбрать « Свернуть ленту», чтобы снять флажок с этой опции.
Автоматически скрыть ленту
Если у вас мало места на экране, вы можете автоматически скрыть всю ленту, включая вкладки.
Чтобы автоматически скрыть ленту и вкладки, нажмите кнопку « Параметры отображения ленты» в верхнем правом углу окна Excel и выберите « Автоскрытие ленты» .
Параметр « Показать вкладки» скрывает ленты, но показывает вкладки.
Чтобы снова отобразить вкладки и ленту, выберите « Показать вкладки и команды» .
Чтобы показать ленту, когда она автоматически скрыта, наведите указатель мыши на верхнюю часть окна Excel, пока не увидите зеленую полосу и не щелкните ее.
Лента опускается на лист. Нажмите на вкладку, а затем нажмите на команду.
Лента автоматически скрывается снова.
Опять же, чтобы постоянно показывать ленту и вкладки, выберите « Показать вкладки и команды» из кнопки « Параметры отображения ленты» .
2. Что делать, если лента Excel отсутствует
Если ваша лента Excel исчезнет, скорее всего, она просто скрыта.
Вы можете отобразить ленту в Excel, как описано в разделе « Показать ленту Excel » выше, если вы видите только имена вкладок.
Если ваш рабочий лист занимает весь экран, и вы не видите ленту или вкладки, лента находится в режиме автоматического скрытия. См. Раздел « Автоматически скрывать ленту » выше, чтобы узнать, как вернуть ленту назад.
3. Настройка ленты Excel
Microsoft добавила возможность настраивать ленту в Excel 2010. Вы можете делать такие вещи, как:
- Переименование и изменение порядка вкладок и групп на вкладках
- Скрыть вкладки
- Добавить и удалить группы на существующих вкладках
- Добавьте пользовательские вкладки и группы, содержащие команды, к которым вы хотите иметь легкий доступ
Но вы не можете вносить изменения в команды по умолчанию, такие как изменение их имен или значков, удаление команд по умолчанию или изменение порядка команд по умолчанию.
Чтобы настроить ленту, щелкните ее правой кнопкой мыши и выберите « Настроить ленту» . Вы также можете перейти в Файл> Параметры> Настроить ленту .
Добавить новую группу на вкладку на ленте
Все команды на ленте должны быть в группе. Чтобы добавить команды в существующую встроенную вкладку, сначала необходимо создать новую группу на этой вкладке. Вы также можете добавлять команды в группы на своих собственных вкладках, и мы покажем вам, как это сделать.
На экране « Настройка ленты» в диалоговом окне « Параметры Excel » выберите « Команды, отсутствующие на ленте», в раскрывающемся списке « Выбрать команды из» . В этом списке могут быть некоторые команды, которые вы хотите использовать на ленте.
Убедитесь, что в раскрывающемся списке « Настройка ленты» справа выбраны главные вкладки .
Чтобы добавить команду в существующую вкладку, вы должны сначала создать новую группу на этой вкладке. Вы не можете добавлять команды в существующие группы на главных вкладках . Например, мы собираемся добавить команду на вкладку « Главная ». Итак, мы выбираем вкладку « Главная » в списке справа и затем нажимаем « Новая группа» под списком.
Новая группа добавляется внизу списка групп на вкладке « Главная » с именем по умолчанию « Новая группа» . Слово Custom добавляется в конец имени новой группы, чтобы помочь вам отслеживать созданные вами пользовательские группы. Но Custom не будет отображаться на вкладке.
Чтобы переименовать новую группу, выберите ее и нажмите « Переименовать» .
Введите имя для новой группы в поле « Отображаемое имя» в диалоговом окне « Переименовать ».
Когда окно Excel слишком узкое для отображения названий групп на ленте, отображаются только символы. Вы можете выбрать символ, который отображается для вашей новой группы, в поле Символ .
Нажмите ОК .
Добавить команду в новую группу
Теперь вы можете добавлять команды в новую группу.
Убедитесь, что ваша новая группа выбрана справа. Затем нажмите на команду, которую вы хотите добавить в список команд слева.
Нажмите Добавить .
Команда добавляется на вкладку в новой группе, которую вы создали.
Нажмите кнопку ОК, чтобы закрыть диалоговое окно « Параметры Excel ».
Поскольку мы добавили нашу новую группу внизу списка групп на вкладке « Главная », она отображается в правом нижнем углу вкладки.
Вы можете добавлять новые группы в любом месте на вкладке, и мы покажем вам, как. Но сначала мы покажем вам, как добавить новую, настраиваемую вкладку на ленту.
Добавьте свои собственные вкладки
Помимо добавления групп и команд к существующим встроенным вкладкам, вы можете создавать свои собственные пользовательские вкладки. Например, если вы создали несколько часто используемых макросов, вы можете создать собственную вкладку для своих макросов, чтобы сделать их легко доступными.
См. Нашу статью о создании настраиваемой панели инструментов Excel для макросов VBA. чтобы узнать, как добавить новую вкладку на ленту Excel в дополнение к созданию некоторых полезных макросов.
Вы также можете использовать настраиваемую вкладку для сбора часто используемых команд в одном месте.
Изменить порядок вкладок, групп и команд
Вы можете расположить вкладки и группы в любом порядке. Команды, уже находящиеся на встроенных вкладках, не могут быть переставлены. Но вы можете изменить порядок команд, добавленных в пользовательские группы, на встроенных или пользовательских вкладках.
Чтобы переместить вкладку, группу или команду, откройте экран « Настройка ленты» в диалоговом окне « Параметры Excel ».
В списке справа выберите вкладку, группу или команду в пользовательской группе, которую вы хотите переместить. Затем щелкните стрелку вверх или стрелку вниз справа от списка, чтобы переместить его в любом случае. Вкладка вверху списка отображается в крайнем левом углу ленты, а вкладка внизу в крайнем правом углу.
Вы можете разместить свою пользовательскую вкладку в наиболее удобном для вас месте на ленте.
Скрыть вкладки на ленте Excel
Если есть какие-то вкладки, которые вы не используете, вы можете их скрыть.
Щелкните правой кнопкой мыши на ленте и выберите « Настроить ленту» .
Справа снимите флажки для любых вкладок, которые вы хотите скрыть. Затем нажмите ОК .
Переименовать элементы на ленте
Помимо предоставления собственных вкладок и групп своим собственным именам, вы также можете переименовывать существующие группы на встроенных вкладках. Вы не можете переименовать существующие команды на ленте.
В правой части экрана « Настройка ленты» в диалоговом окне « Параметры Excel » выберите группу, которую хотите переименовать, и нажмите « Переименовать» под списком.
В диалоговом окне « Переименовать » введите нужное имя и нажмите « ОК» .
Теперь группа отображается с именем, которое вы выбрали.
Используйте значки вместо текста на ленте
Если вы используете ноутбук с небольшим экраном, вы можете сэкономить место на вкладках ленты, удалив текст из команд, добавляемых в пользовательские группы, и используя только значки. Вы не можете удалить текст из встроенных команд на основных вкладках. Кроме того, вы должны удалить текст из всех значков в пользовательской группе, а не только из некоторых.
На экране « Настройка ленты» в диалоговом окне « Параметры Excel» щелкните правой кнопкой мыши группу, которую хотите изменить, и выберите « Скрыть метки команд» .
Команды в вашей пользовательской группе теперь отображаются без текста.
4. Сброс настроек в Excel
Если вы внесли много изменений в ленту Excel и хотите вернуться к настройкам по умолчанию, вы можете сбросить настройки.
Чтобы сбросить одну вкладку, выберите эту вкладку в списке справа на экране « Настройка ленты» в диалоговом окне « Параметры Excel ». Затем нажмите « Сброс» и выберите « Сбросить только выбранную вкладку ленты» .
Чтобы сбросить все вкладки на ленте, нажмите « Сброс» и выберите « Сбросить все настройки» . Обратите внимание, что этот параметр также сбрасывает панель быстрого доступа.
Нажмите Да в диалоговом окне подтверждения.
Экономьте время с настроенной лентой Excel
Настройка ленты Excel помогает сэкономить время и повысить производительность. Но это всего лишь один из простых путей повышения производительности. У нас также есть дополнительные советы по экономии времени при использовании Excel по экономии по экономии
































