MyTetra Share
Делитесь знаниями!
Работа с диалогами
Время создания: 30.07.2020 21:15
Текстовые метки: Диалоги, InputBox, vba, диалоги, MsgBox
Раздел: !Закладки - VBA - MsgBox
Запись: xintrea/mytetra_db_adgaver_new/master/base/15149899497j96hgjcz2/text.html на raw.githubusercontent.com

Работа с диалогами

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

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

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

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



 
ИНФОРМАЦИОННЫЙ ДИАЛОГ MSGBOX

Самый простой тип. Используется для информирования пользователя. Как правило применяется по окончании выполнения кода:
MsgBox Promt, [Buttons], [Title], [HelpFile], [Context]
Обязательным к указанию является только первый параметр -
Promt, в котором указывается непосредственно сообщение для вывода:

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


1

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

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

'показываем окно с кнопкой по-умолчанию и типом важного сообщения MsgBox "Обработка завершена", vbCritical


1

2

'показываем окно с кнопкой по-умолчанию и типом важного сообщения

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

'---------------------------------------------------------------------------------------

' 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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

'---------------------------------------------------------------------------------------

' 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


1

2

3

4

5

6

7

8

9

10

11

12

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


1

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

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

Константа

Значение

Нажатая кнопка

vboK

1

ОК

vbCancel

2

Отмена

vbAbort

3

Прервать

vbRetry

4

Повтор

vblgnore

5

Пропустить

vbYes

6

Да

vbNo

7

Нет

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

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


1

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

'---------------------------------------------------------------------------------------

' 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


1

2

3

4

5

6

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


1

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. Главное: эта строка должна располагаться в самом верху стандартного модуля(в области объявлений, перед всеми процедурами и функциями).
Помимо очевидного текста сообщения и заголовка, который можно заменить на свой, главное внимание уделим константе
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


1

2

3

4

5

6

7

8

9

10

11

12

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 'завершаем процедуру, если строка пуста


1

2

3

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


1

2

3

4

5

6

7

8

9

10

11

12

13

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


1

2

3

4

5

6

vRetVal = InputBox("Укажите номер столбца для удаления(целое число):", "Запрос данных", "")

    

If StrPtr(vRetVal) = 0 Then

    MsgBox "Нажата кнопка Отмена. Процедура прервана", vbCritical, "DelCols"

    Exit Sub

End If

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

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

Sub ClearAllCells() 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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Sub ClearAllCells()

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

Так же примеры применения 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)


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

30

    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, что не очень грамотно с точки зрения взаимодействия с пользователем - он не должен видеть внутренние ошибки:

'--------------------------------------------------------------------------------------- ' 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


'---------------------------------------------------------------------------------------

' 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

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

 
MyTetra Share v.0.59
Яндекс индекс цитирования