Vba excel показать окно

В этой заметке описываются методы создания пользовательских диалоговых окон, которые существенно расширяют стандартные возможности Excel. Диалоговые окна – это наиболее важный элемент пользовательского интерфейса в Windows. Они применяются практически в каждом приложении Windows, и большинство пользователей неплохо представляет, как они работают. Разработчики Excel создают пользовательские диалоговые окна с помощью пользовательских форм (UserForm). Кроме того, в VBA имеются средства, обеспечивающие создание типовых диалоговых окон.[1]

Рис. 1. Работа процедуры GetName

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

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

Использование окон ввода данных

Окно ввода данных — это простое диалоговое окно, которое позволяет пользователю ввести одно значение. Например, можно применить окно ввода данных, чтобы предоставить пользователю возможность ввести текст, число или диапазон значений. Для создания окна ввода предназначены две функции InputBox: одна— в VBA, а вторая является методом объекта Application.

Функция InputBox в VBA

Функция имеет следующий синтаксис:

InputBox(запрос [, заголовок] [, по_умолчанию] [, xpos] [, ypos] [, справка, раздел])

  • Запрос. Указывает текст, отображаемый в окне ввода (обязательный параметр).
  • Заголовок. Определяет заголовок окна ввода (необязательный параметр).
  • По_умолчанию. Задает значение, которое отображается в окне ввода по умолчанию (необязательный параметр).
  • xpos, ypos. Определяют координаты верхнего левого угла окна ввода на экране (необязательные параметры).
  • Справка, раздел. Указывают файл и раздел в справочной системе (необязательные параметры).

Функция InputBox запрашивает у пользователя одно значение. Она всегда возвращает строку, поэтому результат нужно будет преобразовать в числовое значение. Текст, отображаемый в окне ввода, может достигать 1024 символов (длину допускается изменять в зависимости от ширины используемых символов). Если определить раздел справочной системы, то в диалоговом окне будет отображена кнопка Справка.

Процедура GetName запрашивает у пользователя полное имя (имя и фамилию). Затем программа выделяет имя и отображает приветствие в окне сообщения (см. рис. 1; код функции можно найти в файле VBA inputbox.xlsm).

Sub GetName()

    Dim UserName As String

    Dim FirstSpace As Integer

    Do Until UserName <> «»

        UserName = InputBox(«Укажите имя и фамилию: «, _

            «Назовите себя»)

    Loop

    FirstSpace = InStr(UserName, » «)

    If FirstSpace <> 0 Then

        UserName = Left(UserName, FirstSpace 1)

    End If

    MsgBox «Привет « & UserName

End Sub

Обратите внимание: функция InputBox вызывается в цикле Do Until. Это позволяет убедиться в том, что данные введены в окно. Если пользователь щелкнет на кнопке Отмена или не введет текст, то переменная UserName будет содержать пустую строку, а окно ввода данных появится повторно. Далее в процедуре будет предпринята попытка получить имя пользователя путем поиска первого символа пробела (для этого применяется функция InStr). Таким образом, можно воспользоваться функцией Left для получения всех символов, расположенных слева от символа пробела. Если символ пробела не найден, то используется все введенное имя.

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

В процедуре GetWord пользователю предлагается ввести пропущенное слово (рис. 2). Этот пример также иллюстрирует применение именованных аргументов (р и t). Текст запроса выбирается из ячейки А1 рабочего листа.

Sub GetWord()

    Dim TheWord As String

    Dim p As String

    Dim t As String

    p = Range(«A1»)

    t = «Какое слово пропущено?»

    TheWord = InputBox(prompt:=p, Title:=t)

    If UCase(TheWord) = «ВОДОКАЧКУ» Then

        MsgBox «Верно.»

    Else

        MsgBox «Не верно.»

    End If

End Sub

Рис. 2. Использование функции VBA inputBox, отображающей запрос

Метод Excel InputBox

Метод Excel InputBox по сравнению с функцией VBA InputBox предоставляет три преимущества:

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

Метод InputBox имеет следующий синтаксис.

InputBox(запрос, [, заголовок], [, по_умолчанию], [, слева], [, сверху], [, справка, раздел], [, тип])

  • Запрос. Указывает текст, отображаемый в окне ввода (обязательный параметр).
  • Заголовок. Определяет заголовок окна ввода (необязательный параметр).
  • По_умолчанию. Задает значение, которое отображается в окне ввода по умолчанию (необязательный параметр).
  • Слева, сверху. Определяют координаты верхнего левого угла окна ввода на экране (необязательные параметры).
  • Справка, раздел. Указывают файл и раздел в справочной системе (необязательные параметры).
  • Тип. Указывает код типа данных, который будет возвращаться методом (необязательный параметр; значения см. рис. 3).

Рис. 3. Коды типов данных, возвращаемые методом Excel InputBox

Используя сумму приведенных выше значений, можно возвратить несколько типов данных. Например, для отображения окна ввода, которое принимает текстовый или числовой тип данных, установите код равным 3 (1 + 2 или число + текст). Если в качестве кода типа данных применить значение 8, то пользователь сможет ввести в поле адрес ячейки или диапазона ячеек. Пользователь также можент выбрать диапазон на текущем рабочем листе.

В процедуре EraseRange используется метод InputBox. Пользователь может указать удаляемый диапазон (рис. 4). Адрес диапазона вводится в окно вручную, или выделяется мышью на листе. Метод InputBox с кодом 8 возвращает объект Range (обратите внимание на ключевое слово Set). После этого выбранный диапазон очищается (с помощью метода Clear). По умолчанию в поле окна ввода отображается адрес текущей выделенной ячейки. Если в окне ввода щелкнуть на кнопке Отмена, то оператор On Error завершит процедуру.

Sub EraseRange()

    Dim UserRange As Range

    On Error GoTo Canceled

    Set UserRange = Application.InputBox _

        (Prompt:=«Удаляемый диапазон:», _

        Title:=«Удаление диапазона», _

        Default:=Selection.Address, _

        Type:=8)

    UserRange.Clear

    UserRange.Select

Canceled:

End Sub

Рис. 4. Пример использования метода InputBox для выбора диапазона

Если в процедуре EraseRange ввести не диапазон адресов, то Excel отобразит сообщение (рис. 5) и позволит пользователю повторить ввод данных.

Рис. 5. Метод InputBox автоматически проверяет вводимые данные

Функция VBA MsgBox

Функция VBA MsgBox служит для отображения сообщения. Также она передает результат щелчка на кнопке ОК или Отмена). Синтаксис функции:

MsgBox(запрос[, кнопки][, заголовок][, справка, раздел])

  • Запрос. Определяет текст, который будет отображаться в окне сообщения (обязательный параметр).
  • Кнопки. Содержит числовое выражение (или константу), которое определяет кнопки, отображаемые в окне сообщения (необязательный параметр; рис. 6). Также можно задать кнопку по умолчанию.
  • Заголовок. Содержит заголовок окна сообщения (необязательный параметр).
  • Справка, раздел. Указывают файл и раздел справочной системы (необязательные параметры).

Рис. 6. Константы и значения, используемые для выбора кнопок в функции MsgBox

Первая группа значений (0–5) описывает номер и тип кнопок в диалоговом окне. Вторая группа (16, 32, 48, 64) описывает стиль значка. Третья группа (0, 256, 512) определяет, какая кнопка назначена по умолчанию. Четвертая группа (0, 4096) определяет модальность окна сообщения. Пятая указывает, показывать ли окно сообщений поверх других окон, устанавливает выравнивание и направление текста. В процессе сложения чисел для получения окончательного значения аргумента Buttons следует использовать только одно число из каждой группы.

Можно использовать функцию MsgBox в качестве процедуры (для отображения сообщения), а также присвоить возвращаемое этой функцией значение переменной. Функция MsgBox возвращает результат, представляющий кнопку, на которой щелкнул пользователь. В следующем примере отображается сообщение и не возвращается результат (код функций, приведенных в этом разделе см. также в файле VBA msgbox.xlsm).

Sub MsgBoxDemo()

    MsgBox «При выполнении макроса ошибок не произошло.»

End Sub

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

Sub GetAnswer()

    Dim Ans As Integer

    Ans = MsgBox(«Продолжать?», vbYesNo)

    Select Case Ans

        Case vbYes

            ‘ … [код при Ans равно Yes]

        Case vbNo

            ‘ ... [код при Ans равно No]

    End Select

End Sub

Рис. 7. Константы, возвращаемые MsgBox

Функция MsgBox возвращает переменную, имеющую тип Integer. Вам необязательно использовать переменную для хранения результата выполнения функции MsgBox. Следующая процедура представляет собой вариацию процедуры GetAnswer.

Sub GetAnswer2()

    If MsgBox(«Продолжать?», vbYesNo) = vbYes Then

‘ … [код при Ans равно Yes]

    Else

... [код при Ans равно No]

    End If

End Sub

В следующем примере функции используется комбинация констант для отображения окна сообщения с кнопками Да, Нет и знаком вопроса (рис. 8). Вторая кнопка (Нет) используется по умолчанию. Для простоты константы добавлены в переменную Config.

Private Function ContinueProcedure() As Boolean

   Dim Config As Integer

   Dim Ans As Integer

   Config = vbYesNo + vbQuestion + vbDefaultButton2

   Ans = MsgBox(«Произошла ошибка. Продолжить?», Config)

   If Ans = vbYes Then ContinueProcedure = True _

      Else ContinueProcedure = False

End Function

Рис. 8. Параметр Кнопки функции MsgBox определяет кнопки, которые отображаются в окне сообщения

В файле VBA msgbox.xlsm функция ContinueProcedure в демонстрационных целях представлена в виде процедуры. Функция ContinueProcedure может вызываться из другой процедуры. Например, оператор

If Not ContinueProcedure() Then Exit Sub

вызывает функцию ContinueProcedure (которая отображает окно сообщения). Если функция возвращает значение ЛОЖЬ (т.е. пользователь щелкнул на кнопке Нет), то процедура будет завершена. В противном случае выполняется следующий оператор.

Если в сообщении необходимо указать разрыв строки (рис. 9), воспользуйтесь константой vbCrLf (или vbNewLine):

Sub MultiLine()

    Dim Msg As String

    Msg = «Это первая строка.» & vbCrLf & vbNewLine

    Msg = Msg & «Вторая строка.» & vbCrLf

    Msg = Msg & «Третья строка.»

    MsgBox Msg

End Sub

Рис. 9. Разбиение сообщения на несколько строк

Для включения в сообщение символа табуляции применяется константа vbTab. В процедуре ShowRange окно сообщения используется для отображения диапазона значений размером 10 строк на 3 столбца — ячейки А1:С10 (рис. 10). В этом случае столбцы разделены с помощью константы vbTab. Новые строки вставляются с помощью константы vbCrLf. Функция MsgBox принимает в качестве параметра строку, длина которой не превышает 1023 символов. Такая длина задает ограничение на количество ячеек, которое можно отобразить в сообщении.

Sub ShowRange()

    Dim Msg As String

    Dim r As Integer, c As Integer

    Msg = «»

    For r = 1 To 10

        For c = 1 To 3

            Msg = Msg & Cells(r, c).Text

            If c <> 3 Then Msg = Msg & vbTab

            Next c

            Msg = Msg & vbCrLf

        Next r

    MsgBox Msg

End Sub

Рис. 10. Текст в этом окне сообщения содержит символы табуляции и разрыва строк

Метод Excel GetOpenFilename

Если приложению необходимо получить от пользователя имя файла, то можно воспользоваться функцией InputBox, но этот подход часто приводит к возникновению ошибок. Более надежным считается использование метода GetOpenFilename объекта Application, который позволяет удостовериться, что приложение получило корректное имя файла (а также его полный путь). Данный метод позволяет отобразить стандартное диалоговое окно Открытие документа, но при этом указанный файл не открывается. Вместо этого метод возвращает строку, которая содержит путь и имя файла, выбранные пользователем. По окончании данного процесса с именем файла можно делать все что угодно. Синтаксис (все параметры необязательные):

Application.GetOpenFilename(фильтр_файла, индекс_фильтра, заголовок, множественный_выбор)

  • Фильтр_файла. Содержит строку, определяющую критерий фильтрации файлов (необязательный параметр).
  • Индекс_фильтра. Указывает индексный номер того критерия фильтрации файлов, который используется по умолчанию (необязательный параметр).
  • Заголовок. Содержит заголовок диалогового окна (необязательный параметр). Если этот параметр не указать, то будет использован заголовок Открытие документа.
  • Множественный_выбор. Необязательный параметр. Если он имеет значение ИСТИНА, можно выбрать несколько имен файлов. Имя каждого файла заносится в массив. По умолчанию данный параметр имеет значение ЛОЖЬ.

Аргумент Фильтр_файла определяет содержимое раскрывающегося списка Тип файлов, находящегося в окне Открытие документа. Аргумент состоит из строки, определяющей отображаемое значение, а также строки действительной спецификации типа файлов, в которой находятся групповые символы. Оба элемента аргумента разделены запятыми. Если этот аргумент не указывать, то будет использовано значение, заданное по умолчанию: "Все файлы (*.*),*.*". Первая часть строки Все файлы (*.*) – то текст, отображаемый в раскрывающемся списке тип файлов. Вторая часть строки *.* указывает тип отображаемых файлов.

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

Filt = «Текстовые файлы (*.txt),*.txt,» & _

   «Файлы Lotus (*.prn),*.prn,» & _

   «Файлы, разделенные запятой (*.csv),*.csv,» & _

   «Файлы ASCII (*.asc),*.asc,» & _

   «Все файлы (*.*),*.*»

В следующем примере у пользователя запрашивается имя файла. При этом в поле типа файлов используются пять фильтров (код содержится в файле prompt for file.xlsm).

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

31

32

33

34

Sub GetImportFileName()

    Dim Filt As String

    Dim FilterIndex As Integer

    Dim FileName As Variant

    Dim Title As String

‘   Настройка списка фильтров

    Filt = «Text Files (*.txt),*.txt,» & _

            «Lotus Files (*.prn),*.prn,» & _

            «Comma Separated Files (*.csv),*.csv,» & _

            «ASCII Files (*.asc),*.asc,» & _

            «Все файлы (*.*),*.*»

   Отображает *.* по умолчанию

    FilterIndex = 3

‘   Настройка заголовка диалогового окна

    Title = «Выберите файл для импорта»

   Получение имени файла

    FileName = Application.GetOpenFilename _

        (FileFilter:=Filt, _

         FilterIndex:=FilterIndex, _

         Title:=Title)

‘   При отмене выйти из окна

    If FileName = False Then

        MsgBox «Файл не выбран.»

        Exit Sub

    End If

   Отображение полного имени и пути

    MsgBox «Вы выбрали « & FileName

End Sub

На рис. 11 показано диалоговое окно, которое выводится на экран после выполнения этой процедуры (по умолчанию предлагается фильтр *.csv).

Рис. 11. Метод GetOpenFilename отображает диалоговое окно, в котором выбирается файл

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

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

31

32

33

34

35

36

37

38

Sub GetImportFileName2()

    Dim Filt As String

    Dim FilterIndex As Integer

    Dim FileName As Variant

    Dim Title As String

    Dim i As Integer

    Dim Msg As String

‘   Установка списка фильтров файлов

    Filt = «Text Files (*.txt),*.txt,» & _

            «Lotus Files (*.prn),*.prn,» & _

            «Comma Separated Files (*.csv),*.csv,» & _

            «ASCII Files (*.asc),*.asc,» & _

            «All Files (*.*),*.*»

   Отображает *.* по умолчанию

    FilterIndex = 5

‘   Настройка заголовка диалогового окна

    Title = «Выберите файл для импорта»

   Получение имени файла

    FileName = Application.GetOpenFilename _

        (FileFilter:=Filt, _

         FilterIndex:=FilterIndex, _

         Title:=Title, _

         MultiSelect:=True)

‘   Выход в случае отмены работы с диалоговым окном

    If Not IsArray(FileName) Then

        MsgBox «Файл не выбран.»

        Exit Sub

    End If

   Отображение полного пути и имени файлов

    For i = LBound(FileName) To UBound(FileName)

        Msg = Msg & FileName(i) & vbCrLf

    Next i

    MsgBox «Было выбрано:» & vbCrLf & Msg

End Sub

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

Метод Excel GetSaveAsFilename

Данный метод отображает диалоговое окно Сохранение документа и дает пользователю возможность выбрать (или указать) имя сохраняемого файла. В результате возвращается имя файла, но никакие действия не предпринимаются. Синтаксис (все параметры необязательные):

Application.GetSaveAsFilename(начальное_имя, фильтр_файла, индекс_фильтра, заголовок, текст_кнопки)

  • Начальное_имя. Указывает предполагаемое имя файла.
  • Фильтр_файла. Содержит критерий фильтрации отображаемых в окне файлов.
  • Индекс_фильтра. Код критерия фильтрации файлов, который используется по умолчанию.
  • Заголовок. Определяет текст заголовка диалогового окна.

Получение имени папки

Для того чтобы получить имя файла, проще всего воспользоваться описанным выше методом GetOpenFileName. Но если нужно получить лишь имя папки (без названия файла), лучше воспользоваться методом объекта Excel FileDialog. Следующая процедура отображает диалоговое окно, в котором можно выбрать папку (см. также файл get directory.xlsm). С помощью функции MsgBox отображается имя выбранной папки (или сообщение Отменено).

Sub GetAFolder()

    With Application.FileDialog(msoFileDialogFolderPicker)

        .InitialFileName = Application.DefaultFilePath & «»

        .Title = «Выберите местоположение резервной копии.«

        .Show

        If .SelectedItems.Count = 0 Then

            MsgBox «Отменено»

        Else

            MsgBox .SelectedItems(1)

        End If

    End With

End Sub

Объект FileDialog позволяет определить начальную папку путем указания значения свойства InitialFileName. В примере в качестве начальной папки применяется путь к файлам Excel, заданный по умолчанию.

Отображение диалоговых окон Excel

Создаваемый вами код VBA может вызывать на выполнение многие команды Excel, находящиеся на ленте. И если в результате выполнения команды открывается диалоговое окно, ваш код может делать выбор в диалоговом окне (даже если само диалоговое окно не отображается). Например, следующая инструкция VBA эквивалентна выбору команды Главная –> Редактирование –> Найти и выделить –> Перейти и указанию диапазона ячеек А1:СЗ с последующим щелчком на кнопке ОК. Но само диалоговое окно Переход при этом не отображается (именно это и нужно).

Application.Goto Reference:=Range("А1:СЗ")

Иногда же приходится отображать встроенные окна Excel, чтобы пользователь мог сделать свой выбор. Для этого используется коллекция Dialogs объекта Application. Учтите, что в настоящее время компания Microsoft прекратила поддержу этого свойства. В предыдущих версиях Excel пользовательские меню и панели инструментов создавались с помощью объекта CommandBar. В версиях Excel 2007 и Excel 2010 этот объект по-прежнему доступен, хотя и работает не так, как раньше. Начиная с версии Excel 2007 возможности объекта CommandBar были существенно расширены. В частности, объект CommandBar можно использовать для вызова команд ленты с помощью VBA. Многие из команд, доступ к которым открывается с помощью ленты, отображают диалоговое окно. Например, следующая инструкция отображает диалоговое окно Вывод на экран скрытого листа (рис. 12; см. также файл ribbon control names.xlsm):

Application.CommandBars.ExecuteMso("SheetUnhide")

Рис. 12. Диалоговое окно, отображаемое в результате выполнения указанного выше оператора

Метод ExecuteMso принимает лишь один аргумент, idMso, который представляет элемент управления ленты. К сожалению, сведения о многих параметрах в справочной системе отсутствуют.

В файле ribbon control names.xlsm описаны все названия параметров команд ленты Excel. Поэкспериментируйте с параметрами, перечисленными в этой рабочей книге. Многие из них вызывают команды немедленно (без промежуточных диалоговых окон). Но большинство из них генерирует ошибку при использовании в неправильном контексте. Например, Excel отображает сообщение об ошибке, если команда Functionwizard вызывается в случае выбора диаграммы.

В результате выполнения следующего оператора отображается вкладка Шрифт диалогового окна Формат ячеек:

Application.CommandBars.ExecuteMso("FormatCellsFontDialog")

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

Отображение формы ввода данных

Многие пользователи применяют Excel для управления списками, информация в которых ранжирована по строкам. В Excel поддерживается простой способ работы с подобными типами данных с помощью встроенных форм ввода данных, которые могут создаваться автоматически. Подобная форма предназначена для работы как с обычным диапазоном, так и с диапазоном, оформленным в виде таблицы (с помощью команды Вставка –> Таблицы –> Таблица). Пример формы ввода данных показан на рис. 13 (см. также файл data form example.xlsm).

Рис. 13. Некоторые пользователи предпочитают применять встроенные формы ввода данных Excel для ввода сведений; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке

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

  1. Щелкните правой кнопкой мыши на панели быстрого доступа и в контекстном меню выберите параметр Настройка панели быстрого доступа.
  2. На экране появится вкладка Панель быстрого доступа диалогового окна Параметры Excel.
  3. В раскрывающемся списке Выбрать команды из выберите параметр Команды не на ленте.
  4. В появившемся списке выберите параметр Форма.
  5. Щелкните на кнопке Добавить для добавления выбранной команды на панель быстрого доступа.
  6. Щелкните на кнопке ОК для закрытия диалогового окна Параметры Excel.

После выполнения перечисленных выше действий на панели быстрого доступа появится новый значок.

Для работы с формой ввода данных следует структурировать данные таким образом, чтобы Excel распознавал их в виде таблицы. Начните с указания заголовков столбцов в первой строке диапазона вводимых данных. Выделите любую ячейку в таблице и щелкните на кнопке Форма панели быстрого доступа. Excel отображает диалоговое окно, в котором будут вводиться данные. Для перемещения между текстовыми полями в целях ввода информации используйте клавишу <Tab>. Если ячейка содержит формулу, результат вычислений отображается в виде текста (а не в формате поля ввода данных). Другими словами, невозможно изменить формулы с помощью формы ввода данных.

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

Используйте метод ShowDataForm для отображения формы ввода данных Excel. Единственное требование заключается в том, что активная ячейка должна находиться в диапазоне. Следующий код активизирует ячейку А1 (в таблице), а затем отображает форму ввода данных.

Sub DisplayDataForm()

    Range(«A1»).Select

    ActiveSheet.ShowDataForm

End Sub

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

Содержание

  • Что такое немедленное окно в Excel VBA?
  • Где найти непосредственное окно?
  • Примеры использования немедленного окна в Excel VBA
  • Закрепление / открепление немедленного окна
  • Немедленное окно не отображается — вот несколько способов его получить

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

Окно «Немедленное» позволяет быстро выполнять такие действия, как:

  • Получить информацию о файлах Excel (например, количество листов в книге или название книги)
  • Получите отладку и быстро распечатайте информацию
  • Выполнить строку кода за секунды
  • Запустить макрос (или вызвать функцию)
  • Получить информацию о переменных (или установить значение или переменные)

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

В этом уроке я расскажу все, что вам нужно знать о немедленном окне и о том, как его лучше всего использовать (объяснено с примерами).

Давайте начнем!

Immediate Window — это часть редактора VB, которую вы можете использовать для быстрых действий.

В качестве примера: если у вас есть книга с некоторыми скрытыми листами, и вы хотите быстро узнать общее количество листов, вы можете сделать это за несколько секунд с помощью окна «Немедленное».

Immediate Window делает гораздо больше (как вы увидите позже в этом руководстве). Но для начала давайте представим себе немедленное окно как инструмент, который поможет вам ускорить работу в Excel VBA.

Где найти непосредственное окно?

Когда вы открываете Excel VB-Editor, вы уже можете видеть непосредственное окно как часть VB Editor. И если вы его еще не видите, вы можете легко заставить его появиться.

Ниже приведены шаги, чтобы открыть редактор VB и сделать видимым окно Immediate Window:

  1. Перейдите на вкладку «Разработчик» на ленте Excel (если вы не видите вкладку «Разработчик», нажмите здесь, чтобы узнать, как ее получить)
  2. В группе кода нажмите «Visual Basic». Это откроет редактор VB
  3. В редакторе VB нажмите на опцию «Просмотр» в меню.
  4. Щелкните Немедленное окно. Это приведет к немедленному отображению окна в редакторе VB.

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

  • Чтобы открыть редактор VB — ALT + F11 (это работает, даже если у вас нет вкладки Разработчик на ленте)
  • Чтобы показать ближайшее окно — Ctrl + G (используйте это, редактор VB открыт)

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

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

Получите информацию о файлах / книгах

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

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

? ActiveWorkbook.Sheets.Count

Это мгновенно сообщит вам общее количество листов в активной книге.

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

? (знак вопроса) предполагается использовать перед запросом, чтобы VBA мог понять, что вы задаете вопрос. Если вы не используете этот вопросительный знак, немедленное окно не даст вам подробностей / ответа.

Это действительно простой пример, в котором Immediate Window дает вам некоторую информацию и экономит время.

Ниже приведены еще несколько примеров:

Чтобы получить имя активной книги

? ActiveWorkbook.Name

Чтобы получить имя активного листа

? Activesheet.Name

Чтобы получить путь к Рабочей книге (адрес, где она сохранена)

? ActiveWorkbook.Path

Поэтому, если вам что-то нужно об объекте (например, рабочая книга, листы, диаграммы, фигуры, диапазон и т. Д.), Вы можете использовать немедленное окно, чтобы быстро получить эту информацию.

Получить информацию об отладке.

В Excel VBA Debug.Print используется для мгновенного отображения значения переменной в непосредственном окне.

Например, приведенный ниже код мгновенно отобразит сообщение «Доброе утро» в ближайшем окне.

Sub DisplayMessage () Debug.Print "Доброе утро" End Sub

Вы можете использовать строку Debug.Print в своем коде, чтобы быстро получить некоторые данные в непосредственном окне или для отладки кода.

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

Sub GetSheetNames () Для каждого sh в ActiveWorkbook.Sheets Debug.Print sh.Name Next sh End Sub

Приведенный выше код просматривает каждый лист в активной книге и дает имя в ближайшем окне.

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

Если вы используете Отладка.Печать чтобы отладить код, не забудьте удалить его, когда закончите.

Запустить макрос (или функцию)

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

Чтобы запустить макрос, все, что вам нужно сделать, это ввести имя макроса в непосредственном окне и нажать клавишу ввода (чтобы это работало, в конце имени макроса должен быть курсор).

Ниже приведен пример, в котором, как только вы вводите имя макроса в непосредственном окне, он запускает код (где код отображает сообщение «Доброе утро» в непосредственном окне).

Это может быть полезно, если у вас есть код и вы хотите проверить, работает ли он должным образом или нет. У вас может быть одна или несколько строк Debug.Print в коде и запускать макрос прямо из окна.

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

Вы также можете использовать непосредственное окно для выполнения пользовательских функций.

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

Выполнить строку кода (или несколько строк кода)

В немедленном окне вы также можете запустить строку кода (или несколько строк кода).

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

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

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

Для каждого листа в Thisworkbook.Sheets: Sheet.Visible = True: Next Sheet

Обратите внимание: хотя это выглядит как одна строка кода, она состоит из трех частей.

Каждая часть отделяется: (двоеточием), который действует как разрыв строки. Это позволяет вам использовать цикл For Next в непосредственном окне для просмотра каждого листа и изменения свойства visible на TRUE (которое показывает любой скрытый лист).

Получить значения переменных

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

Переменная — это то, что содержит значение, и это значение может изменяться во время выполнения кода. Вы можете использовать немедленное окно для проверки значений этих переменных.

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

Sub AddFirstTenNumbers () Dim Var As Integer Dim i As Integer Dim k As Integer For i = 1 To 10 k = k + i Next i Debug.Print i, k End Sub

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

Если это не дает ожидаемых результатов, вы можете отладить код.

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

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

Установить значение переменной при отладке

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

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

Например, если у вас есть цикл, который выполняется 10 раз, и вы хотите проверить, что происходит, когда цикл выполняется в 8-й раз, вам не нужно выполнять цикл семь раз, чтобы перейти к восьмым итерациям. Вы можете просто добавить точку останова перед циклом и изменить переменную цикла на 8. Теперь, когда вы запустите код, он покажет вам, что происходит, когда цикл запускается в 8-й раз.

Это становится намного более полезным, когда вы пишете сложные коды и хотите отлаживать определенные циклы.

Предположим, у вас есть код, показанный ниже:

Sub Показать таблицы () For i = 1 To Worksheets.Count Debug.Print Sheets (i). Name Next i End Sub

Приведенный выше код просто перечисляет имена всех листов в книге в непосредственном окне.

Если вы не хотите перечислять имена всех листов, а только листы после 10-го листа, вы можете разместить точку останова во второй строке цикла (чтобы ничего не выполнялось после этой строки), а затем изменить переменная ‘i’ равняется 11.

Чтобы изменить имя переменной в непосредственном окне, введите следующую строку:

я = 11

Это гарантирует, что первые 10 раз цикла будут проигнорированы, а значение вашей переменной будет установлено на 11.

Закрепление / открепление немедленного окна

Вы можете сразу же прикрепить окно к редактору VB — это означает, что оно остается в одном месте в редакторе VB и перемещается и изменяется вместе с ним.

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

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

  1. Выберите пункт «Инструменты» в меню редактора VB.
  2. Нажмите «Параметры».
  3. В диалоговом окне «Параметры» щелкните последнюю вкладку — «Стыковка».
  4. Установите флажок «Немедленное окно», чтобы сделать его закрепляемым, и снимите флажок, чтобы его нельзя было закрепить.
  5. Нажмите ОК.

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

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

Немедленное окно не отображается — вот несколько способов его получить

Это могло произойти по нескольким причинам.

Самая распространенная причина, по которой вы не видите окно сразу, — это то, что оно не стало видимым. Он может быть не виден по умолчанию, и чтобы он появился, вам нужно перейти к опции «Просмотр» в меню и выбрать опцию «Немедленное окно». Это сделает его видимым в редакторе VB.

Вы также можете использовать клавиатуру Control + G, чтобы немедленно отобразить окно. Используйте это сочетание клавиш, пока вы находитесь в редакторе VB.

Другая причина, по которой вы можете не видеть это окно, заключается в том, что оно было свернуто и теперь настолько закрыто, что вы не можете его видеть (как указано здесь). Просто сделайте быстрое сканирование и проверьте, не видите ли вы где-то маленький синий / красный квадрат. Вы можете навести на него курсор, и вы увидите возможность изменить его размер.

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

  1. Откройте редактор VB
  2. Нажмите Ctrl-G, чтобы переключить фокус на немедленное окно (или выберите опцию View в меню, а затем щелкните на немедленном окне)
  3. Удерживая клавишу ALT, нажмите клавишу пробела. Это покажет раскрывающиеся варианты для немедленного окна.
  4. Нажмите M (для перемещения)
  5. Используйте клавиши со стрелками для перемещения окна
  6. Как только вы выясните, где он находится, увеличьте его

Я получил это на форуме здесь, а также заметил, что то же самое, что предлагается в качестве решения для немедленного окна VBA, не отображается.

Еще одна вещь, которую вы можете попробовать, — это сделать немедленное окно отключаемым (перейдите в Инструменты -> Параметры -> Закрепление и снимите флажок с опции немедленного окна). У некоторых это сработало.

Вам также могут понравиться следующие статьи:

  • Персональная книга макросов Excel | Сохранение и использование макросов во всех книгах
  • Циклы Excel VBA: для «Далее», «Сделать пока», «Сделать до», «Для каждого» (с примерами)
  • Работа с листами с использованием Excel VBA
  • Создание пользовательской функции (UDF) в Excel VBA

Свернуть окно Excel, а форму показать

devilkurs

Дата: Четверг, 18.02.2016, 13:10 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 167


Репутация:

43

±

Замечаний:
0% ±


Excel 2007, 2010

День добрый.

Что-то я никак не соображу. Подскажите плиз. При вызове формы надо свернуть окно Excel, но чтобы форма осталась видна.
.visible=false не катит
При
[vba]

Код

Application.WindowState = xlMinimized

[/vba]
сворачивает и окно Ecxel и форму. Причем не важно в какой последовательности выполнить WindowState и UserForm1.Show ИЛИ WindowState засунуть в UserForm_Initialize.

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

К сообщению приложен файл:

0404920.xlsm
(15.2 Kb)


 

Ответить

Manyasha

Дата: Четверг, 18.02.2016, 13:20 |
Сообщение № 2

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

devilkurs, можно сначала свернуть окно, а потом форму показать:

не важно в какой последовательности

не увидела :(


ЯД: 410013299366744 WM: R193491431804

Сообщение отредактировал ManyashaЧетверг, 18.02.2016, 13:21

 

Ответить

_Boroda_

Дата: Четверг, 18.02.2016, 13:29 |
Сообщение № 3

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Посмотрите вот так.
Ваш родной файл у меня не работал, а вот если сделать форму немодальной, то заработал. Свойство ShowModal


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

devilkurs

Дата: Четверг, 18.02.2016, 13:49 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 167


Репутация:

43

±

Замечаний:
0% ±


Excel 2007, 2010

Грандиозно! ))))))))))))))) Про свойство ShowModal совсем забыл. На других компах тоже норм начало отображать форму.

Чисто наблюдение: Если открыты окна разных программ, то при сворачивании Excel, инициативу перехватывают окна некоторых программ. А форма под ними остается. Но мне это сейчас непринципиально. Если пользователи просить начнут — потом буду думать )))))) наверно в сторону API смотреть надо будет.

Спасибо Александр. И Марине за участие )))))


 

Ответить

al-Ex

Дата: Четверг, 18.02.2016, 18:05 |
Сообщение № 5

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 190


Репутация:

59

±

Замечаний:
0% ±


Excel 2010

наверно в сторону API смотреть надо будет.

Ну да, в сторону API , примерно так: «HWND_TOPMOST» — всегда поверх всех окон
[vba]

Код

Option Explicit

Private Declare Function FindWindow Lib «user32» Alias «FindWindowA» (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private 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

Const SWP_NOSIZE = &H1
Const HWND_TOPMOST = -1
Dim Hwnd As Long

Private Sub UserForm_Initialize()

CommandButton1.Caption = «Lya Lya»

Application.WindowState = xlMinimized
Hwnd = FindWindow(vbNullString, «UserForm1»)
SetWindowPos Hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE

End Sub

[/vba]

К сообщению приложен файл:

5284118.xlsm
(19.9 Kb)

Сообщение отредактировал al-ExПятница, 19.02.2016, 02:11

 

Ответить

devilkurs

Дата: Пятница, 19.02.2016, 00:35 |
Сообщение № 6

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 167


Репутация:

43

±

Замечаний:
0% ±


Excel 2007, 2010

al-Ex, завтра на работе посмотрю. Спасибо!


 

Ответить

Gustav

Дата: Пятница, 19.02.2016, 12:51 |
Сообщение № 7

Группа: Друзья

Ранг: Старожил

Сообщений: 2398


Репутация:

985

±

Замечаний:
0% ±


начинал с Excel 4.0, видел 2.1

ПрИмите в тусовку? Я решал похожую задачу в 2000 году. С тех пор вроде работало как надо во всех последующих версиях Excel, вот уже 15 лет:
[vba]

Код

Sub Макрос1()
    UserForm1.Show
End Sub

[/vba]

У формы свойство ShowModal = True и такие обработчики событий:
[vba]

Код

Private Sub UserForm_Initialize()
    …
    Application.Visible = False
    …    
End Sub

Private Sub UserForm_Terminate()
    …
    Application.Visible = True
    …
End Sub

[/vba]С деталями можно поиграться (в буквальном смысле — там «Игра в 15») по ссылке: http://www.axforum.info/forums/showpost.php?p=107513&postcount=5


МОИ: Ник, Tip box: 41001663842605

 

Ответить

SLAVICK

Дата: Пятница, 19.02.2016, 14:33 |
Сообщение № 8

Группа: Модераторы

Ранг: Старожил

Сообщений: 2290


Репутация:

766

±

Замечаний:
0% ±


2019

У формы свойство ShowModal = True и такие обработчики событий

И я так делаю ^_^ beer .
У такого подхода есть несколько плюсов:
Обработка данных происходит быстрее(в моей программе примерно на 20% — проверял для интереса)
Пользователи не видят окно программы и как следствие не могут там ничего менять пока запущена форма. Это иногда очень важно — а то бывает понаклацают всякое :D


Иногда все проще чем кажется с первого взгляда.

 

Ответить

StoTisteg

Дата: Воскресенье, 21.02.2016, 00:55 |
Сообщение № 9

Группа: Авторы

Ранг: Старожил

Сообщений: 1161


Репутация:

103

±

Замечаний:
0% ±


Excel 2010

[offtop]О, да… Юзвери, которых надо Мелкософту в рабство продавать в качестве тестеров — глубоко отдельная тема :) [/offtop]


Интуитивно понятный код — это когда интуитивно понятно, что это код.

 

Ответить

StoTisteg

Дата: Понедельник, 22.02.2016, 22:28 |
Сообщение № 10

Группа: Авторы

Ранг: Старожил

Сообщений: 1161


Репутация:

103

±

Замечаний:
0% ±


Excel 2010

У формы свойство ShowModal = True и такие обработчики событий

Gustav, а зачем, кстати? Если ShowModal = True даёт возможность тыкаться по Экселю, а Application.Visible = False как раз его-то и скрывает?


Интуитивно понятный код — это когда интуитивно понятно, что это код.

 

Ответить

На чтение 8 мин. Просмотров 5.3k.

VBA Immediate Window является удивительным инструментом, который позволяет получить моментальные ответы о ваших файлах Excel, и быстро выполнить код. Он встроен в редактор Visual Basic и имеет множество различных применений, которые могут быть очень полезны при написании макросов, отладке кода и отображении результатов кода.

VBA Immediate Window Excel. Определяем количество листов а книге

Каждый пользователь Excel может получить выгоду от Immediate Window, даже если вы не пишете макросы. Эта статья расскажет про 5 различных применений Immediate Window. Как только вы поймете возможности этого инструмента, вы будете использовать его постоянно.

Содержание

  1. Где находитсяImmediate Window?
  2. Эта пустая коробка волшебна!
  3. Открепить Immediate Window
  4. Заключение

Immediate Window
находится в окне редактора Visual Basic.

Как открыть Visual Basic Editor и Immediate Window в Excel и Mac

Самый быстрый способ добраться до Immediate Window — это:

  1. Нажмите Alt + F11 (удерживая клавишу Alt, затем нажмите клавишу F11) из любой места Excel. Откроется окно редактора Visual Basic. (Mac версия Fn + Alt + F11)
  2. Нажатие Ctrl + G открывает окно Immediate и помещает текстовый курсор в него. Начните вводить свой код. (Версия для Mac — Ctrl + Cmd + G)

Когда вы откроете VB Editor (Alt + F11 ), вы можете увидеть, что Immediate Window автоматически появляется в правом нижнем углу. Это его местоположение по умолчанию. Если его там нет, вы можете нажать Ctrl + G или
меню View> Immediate Window.

Эта пустая коробка волшебна!

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

Что делает окно Immediate

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

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

# 1 — Получить информацию об активной книге

Простейшее использование Immediate Window — это быстрое получение информации о Excel-файле, который в данный момент открыт и активен в фоновом режиме. Вы можете проверить любую строку кода VBA в Immediate Window, и она сразу же даст вам результат.

Например, чтобы узнать, сколько листов в активной книге, введите следующую строку кода в Immediate Window и нажмите клавишу «Enter».

?Activeworkbook.Worksheets.Count

Ответ будет отображен в следующей строке Immediate Window,
прямо под кодом.

VBA Immediate Window Excel определяем количество листов через Worksheets.Count

Задайте вопрос, любой вопрос …

Помещение знака вопроса (?) в начале оператора говорит Immediate Window, что мы задаем ему вопрос и ожидаем результата.

В следующем скриншоте показано несколько примеров того, как мы можем использовать Immediate Window для получения значения, формата чисел и цвета заливки активной ячейки.

Excel VBA Immediate Window примеры использования вопросительно знака

Обратите внимание, что Immediate Window отображает интеллектуальные подсказки в тот момент, когда я печатаю. Intellisense — это раскрывающееся меню, в котором отображаются свойства и методы объекта, на который я ссылаюсь. Это позволяет очень быстро и легко вводить код в Immediate Window.

# 2 — Выполнить строку кода VBA

Вам не нужно писать целый макрос, если вам достаточно выполнить одну строку кода в вашей книге.

Удалите знак вопроса в начале оператора, и Immediate Window выполнит эту строку кода.

Выполняем строку кода в VBA Immediate Window

 Selection.HorizontalAlignment = xlCenterAcrossSelection 

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

Вы также можете использовать следующую строку кода, чтобы сделать лист «очень скрытым».

Worksheets("Лист1").Visible = xlVeryHidden 

Другой пример — скрыть содержимое ячейки, сделав цвет шрифта
таким же, как цвет заливки (фона).

 Range("A1").Font.Color = Range("A1").Interior.Color

Скрывает значение ячеек с помощью цвета шрифта (Font и Interior.Color)

Я использую эту строку кода в инструменте оглавления Tab Hound, чтобы скрыть некоторые настройки, хранящиеся в ячейке A1. Даже если пользователь изменит цвет заливки листа, содержимое в ячейке A1 все равно будет скрыто после выполнения кода.

# 3 — Запустить макрос

Вы можете запустить макрос из Immediate Window, введя имя
макроса (процедура) и нажав Enter.

Конечно, вы также можете сделать это, нажав клавишу F5 или
кнопку «Выполнить макрос» в VB Editor, но что если ваш макрос содержит
аргументы?

Макрос не может быть запущен изнутри процедуры, если он содержит аргументы. Тем не менее, вы можете вызвать макрос из непосредственного окна.

Пример ниже представляет собой простой макрос, который вводит текущую дату (сейчас) в ячейку и меняет цвет шрифта на синий (Color = vbBlue). Этот макрос требует, чтобы для запуска ему было передано два аргумента: имя листа и адрес ячейки, где будет введена отметка даты.

Запуск VBA Макроса из Immediate Window с использованием аргументов из Excel

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

Это отлично подходит для написания и отладки кода. Возможно,
вы не захотите запускать весь стек процедур (макросов) в коде, но вы можете
использовать Immediate Window, чтобы вызывать только тот конкретный макрос, над
которым вы работаете.

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

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

# 4 — Просмотр информации об отладке

Вы когда-нибудь видели в Интернете код VBA, в котором есть строка, подобная следующей?

Debug.Print xxxxx

«xxxxx» являются некоторой переменной, которую код вычисляет или производит.

Debug.Print говорит VBA напечатать эту информацию в Immediate Window. Это может быть полезно, когда вы хотите увидеть значение переменной в определенной строке вашего кода, без необходимости хранить переменную где-то в рабочей книге или показывать ее в окне сообщения. Это особенно полезно, когда вы пишете или отлаживаете код.

Пример ниже представляет собой макрос, который проходит по всем листам в книге и проверяет, является ли каждый лист пустым (не используется). Если лист пустой, он отображается в окне Immediate Window с помощью Debug.Print.

Пример работы Debug.Print в VBA Immediate Window

Конечная цель этого макроса может состоять в том, чтобы удалить все пустые листы в книге, но мы могли бы сначала протестировать код перед тем, как фактически удалить какие-либо листы.

Строка Debug.Print создает список пустых листов в Immediate Window, и затем мы можем вручную проверить каждый из этих листов, чтобы убедиться, что они действительно пустые.

# 5 — Получить или установить значение переменной

Immediate
Window также можно использовать для получения ответов о выполняемой в данный
момент процедуре (макросе). Если вы просматриваете свой код (F8) или добавляете
точку останова (F9) или добавляете строку STOP в свой код, тогда код будет
приостановлен. Когда код приостановлен, вы можете использовать Immediate
Window, чтобы получить информацию о любых переменных или объектах, на которые
есть ссылки в коде.

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

Excel Макрос вывода списка всех листов - вычисляем значение переменной в Immediate Window

Я добавил точку останова (F9) в коде, чтобы приостановить
код при выполнении этой строки. Когда код приостановлен, Immediate Window можно
использовать для оценки или изменения переменных. На изображении выше я
использовал знак вопроса, чтобы проверить значение переменной lSht. Затем я
использовал переменную, чтобы получить имя листа, который в данный момент
обрабатывается в цикле.

Наконец, я изменил переменную lSht на 5, используя знак равенства (lSht = 5). Это эффективно пропустит некоторые листы в цикле, потому что я изменил переменную с 2 на 5.

Это простой пример, но Immediate Window может пригодиться при пошаговом выполнении кода.

Если вы хотите узнать, как я заставил Immediate Window
плавать поверх приложения Excel на некоторых скриншотах.

Этот скринкаст покажет вам, как вы можете отсоединить
Immediate Window.

Закрепление VBA Immediate Window

Вот
пошаговые инструкции:

  1. Щелкните левой кнопкой мыши и удерживайте
    верхнюю панель Immediate Window.
  2. Перетащите его из окна VB Editor. Immediate
    Window становится свободным плавающим окном, которое вы можете поместить поверх
    Excel.
  3. Чтобы повторно закрепить его, дважды щелкните на
    верхней панели окна.

Вы можете сделать это с любым из окон в редакторе VB,
включая окна Project, Properties, Locals и Watch. Многие разработчики
настраивают VB Editor не так, как макет по умолчанию. Некоторые предпочитают,
чтобы окна проекта и свойств располагались справа, а не слева. Окно VB Editor
дает вам большую гибкость для настройки вашего представления.

Заключение

Immediate Window — очень универсальный инструмент, который действительно может помочь при написании и отладке макросов. Это отличный способ получить быстрые ответы о вашем файле или приложении. Если вы новичок в VBA, Immediate Window будет очень полезен, когда вы начнете изучать и писать код.

Хитрости »

19 Октябрь 2014              101502 просмотров


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

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

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

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

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

  • Информационный диалог MsgBox
  • MsgBox, автоматически закрываемый по истечении указанного времени
  • Диалог ввода информации пользователем InputBox
  • Диалог выбора диапазона Application.InputBox

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

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

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

 Applicatoin.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
ссылки
статистика

Понравилась статья? Поделить с друзьями:
  • Vba excel показать все скрытые листы
  • Vba excel поиск ячейки по содержимому
  • Vba excel поиск ячейки в строке
  • Vba excel поиск ячейки в столбце по значению
  • Vba excel поиск файла по маске