Vba excel очистка окна immediate

Обновлено: 07.07.2024

Чтобы протестировать выполнение отдельных строк кода VBA Excel в окне Immediate необходимо:

  • ввести строку кода в окне Immediate,
  • нажать клавишу Enter.

Код в окне Immediate можно вводить с использованием контекстных подсказок и выбором из них объектов, свойств и методов, точно так же, как и непосредственно в модуле VBA. Можно строку кода скопировать из процедуры и вставить в окно Immediate из буфера обмена. При нажатии клавиши Enter курсор может находитmся в любом месте проверяемой строки.

Пример 1
Откройте окно Immediate, вставьте в него строку

и нажмите Enter. В первые пять ячеек первого столбца активного листа Excel будет записана строка «Тестируем окно Immediate». Таким же образом будет выполняться любая тестируемая строка вашего кода VBA.

Проверка значений переменных

Для отображения в окне Immediate значений переменных используется метод Print класса Debug (Debug.Print). Рассмотрим работу этого метода сразу на примере.

Пример 2

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

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

Проверка значений переменных

Проверка значений переменных

Если при размещении нескольких элементов после ключевой фразы Debug.Print не указать разделитель, редактор VBA при запуске кода на выполнение автоматически вставит между элементами разделитель «точка с запятой». Сравните с результатом использования в качестве разделителя символа «запятая».

При работе с переменными можно изменять их значение непосредственно в окне Immediate. Введите строку с присвоением переменной нового значения и нажмите клавишу Enter. Значение переменной будет перезаписано.

Пример 3
Пример изменения значения переменной в окне Immediate во время исполнения кода VBA Excel:

кто-нибудь знает, как очистить окно immediate с помощью VBA?

хотя я всегда могу очистить его вручную, мне интересно, есть ли способ сделать это программно.

Ниже приведено решение из здесь

гораздо труднее сделать то, что я предполагал. Я нашел версию здесь keepitcool, который избегает страшного Sendkeys

запустите это из обычного модуля.

Обновлено, поскольку начальный пост пропустил объявления частной функции-плохое копирование и вставка задания вашим покорным

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

способ WinAPI + VBE действительно сложный, но вы можете не предоставлять VBA доступ к VBE (возможно, даже ваша групповая политика компании не будет).

вместо очистки вы можете очистить его содержимое (или часть его. ) С холостыми:

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

вот комбинация идей (протестирована с excel vba 2007):

' * (это может заменить ваш ежедневный вызов для отладки)

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

Это обрабатывает проблему, о которой пишет Akos Groller выше: "к сожалению, это работает только если позиция каре в конце of этот Немедленное окно"

код открывает окно Immediate (или помещает на него фокус), отправляет CTRL+END, за которым следует поток новых строк, таким образом, предыдущего содержимого отладки не видно.

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

после некоторых экспериментов я сделал несколько модов для кода mehow следующим образом:

  1. ошибки Trap (исходный код падает из-за не установки ссылки на "VBE", которую я также изменил на myVBE для ясности)
  2. установите немедленное окно видимым (на всякий случай!)
  3. прокомментировал строку, чтобы вернуть фокус в исходное окно, поскольку именно эта строка вызывает удаление содержимого окна кода на машинах, где возникают проблемы с синхронизацией (I проверено это с помощью PowerPoint 2013 x32 на Win 7 x64). Кажется, фокус переключается обратно до завершения SendKeys, даже если Wait установлен в True!
  4. измените состояние ожидания на SendKeys, поскольку оно, похоже, не соблюдается в моей тестовой среде.

Я также отметил, что проект должен иметь доверие для включенной объектной модели проекта VBA.

Кто-нибудь знает, как очистить немедленное окно с помощью VBA?

Хотя я всегда могу очистить его вручную, мне любопытно, есть ли способ сделать это программно.

Ниже представлено решение от здесь

Нет SendKeys, проверьте
Нет расширяемости VBA, проверьте
Нет сторонних исполняемых файлов, проверьте
Одна небольшая проблема:

В локализованных версиях Office для непосредственного окна используется другой заголовок. По-голландски он называется "Прямой".
Я добавил одну строку, чтобы получить локализованный заголовок в случае сбоя FindWindowExA. Для тех, кто использует английскую и голландскую версии MS-Office.

+1 за вас за большую часть работы!

Я протестировал этот код на основе всех приведенных выше комментариев. Вроде работает безупречно. Комментарии?

Ранее использовался Debug.Print String(200, chr(10)) , который использует ограничение переполнения буфера в 200 строк. Не очень понравился этот метод, но он работает.

  • Нет SendKeys?
  • Нет расширяемости VBA?
  • Нет сторонних исполняемых файлов?
  • Нет проблем!

Если вы используете Autohotkey, вот сценарий, который я использую.

Ключевая команда: Ctrl+Delete . Это работает, только если VBE активен.
При нажатии он немедленно очищает окно, а затем активирует редактор кода через F7 .

Когда я пишу код, я хочу немедленно очистить его, поэтому теперь я могу просто нажать Ctrl-Delete и продолжить кодирование. 👍

Только что проверил в Excel 2016, и этот фрагмент кода у меня сработал:

Для очистки окна Немедленное я использую (VBA Excel 2016) следующую функцию:

А вот прямой вызов ClrImmediate() вот так:

Работает, только если я поставил точку останова на Debug.Print , в противном случае очистка будет выполнена после выполнения ShowCommandBarNames() - НЕ до Debug.Print . К сожалению, вызов DoEvents() мне не помог . И неважно: TRUE или FALSE установлен для SendKeys .

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

Мне кажется, что использование Application.OnTime может быть очень полезным при программировании для VBA IDE. В этом случае можно использовать даже TimeSerial (0, 0, 0 ) .

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

Поэкспериментировав, я сделал несколько модификаций кода mehow следующим образом:

  1. Ошибки ловушки (исходный код не работает из-за того, что не установлена ​​ссылка на "VBE", которую я также изменил на myVBE для ясности)
  2. Сделайте окно Immediate видимым (на всякий случай!)
  3. Закомментировал строку, чтобы вернуть фокус в исходное окно, поскольку именно эта строка приводит к удалению содержимого окна кода на машинах, на которых возникают проблемы с синхронизацией (я проверил это с помощью PowerPoint 2013 x32 на Win 7 x64). Кажется, что фокус снова переключается до завершения работы SendKeys, даже если для параметра Wait установлено значение True!
  4. Измените состояние ожидания на SendKeys, поскольку оно не соблюдается в моей тестовой среде.

Я также отметил, что в проекте должно быть включено доверие для объектной модели проекта VBA.

Отмеченный ответ не работает, если запускается кнопкой на листе. Он открывает диалоговое окно «Перейти в Excel», поскольку это сочетание клавиш CTRL + G. Раньше вы должны установить фокус в окне немедленного доступа. Вам также может понадобиться DoEvent , если вы хотите Debug.Print сразу после очистки.

Для полноты, как заметил @Austin D:

Для тех, кто задается вопросом, горячие клавиши: Ctrl + G (для активации окна Immediate), затем Ctrl + A (для выбора всего), затем Del (для очистки).

Вот комбинация идей (проверена с помощью excel vba 2007):

'* (это может заменить ваш повседневный вызов для отладки)

Мне не нравится удалять Немедленное содержимое (опасаюсь удалить код случайно, поэтому приведенное выше - это взлом некоторого кода, который вы все написали.

Это решает проблему, о которой Акос Гроллер пишет выше: "К сожалению, это работает, только если позиция курсора находится в конце Немедленное окно "

Код открывает окно Immediate (или переводит на него фокус), отправляет CTRL + END, за которым следует поток новых строк, поэтому предыдущее содержимое отладки не видно.

Обратите внимание, что DoEvents имеет решающее значение , иначе логика не сработает. (позиция каретки не сдвинется вовремя до конца окна Immediate).

Я предполагал, что сделать это будет намного сложнее. Я нашел версию здесь от keepitcool, который избегает ужасных Sendkeys

Запустите это из обычного модуля.

SendKeys является прямым, но вам он может не понравиться (например, он открывает окно Immediate, если оно было закрыто, и перемещает фокус).

Способ WinAPI + VBE действительно сложен, но вы можете не предоставлять VBA доступ к VBE (это может быть даже политика группы вашей компании, чтобы не делать этого).

Вместо очистки вы можете удалить его содержимое (или его часть . ) с помощью пробелов:

Киска » 13.12.2006 (Ср) 2:43

Привет всем! Кто знает, как программно очищать Immediate перед распечаткой нужных данных Debug.Print?Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь.

FaKk2 » 13.12.2006 (Ср) 2:46

Хакер » 13.12.2006 (Ср) 6:46

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

lister » 13.12.2006 (Ср) 13:41

Поставь AxTools CodeSMART, там кнопка очистки Immediate Window есть

Или самостоятельно напиши надстройку с поиском и очисткой нужного окна IDE
Типа того.

Код: Выделить всё
Dim objWnd As Window

For Each objWnd In VBInstance.Windows
If objWnd.Type = vbext_wt_Immediate Then
objWnd .SetFocus
SendKeys "^^"

Хакер » 13.12.2006 (Ср) 16:15

lister ты не понял. Ей надо програмно очищать. Смысла я в этом не вижу, ибо в скомпиленном EXE всё равно не будет никаких Immidiate. —We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sergeant Pepper » 13.12.2006 (Ср) 17:28

Хакер писал(а): lister ты не понял. Ей надо програмно очищать. Смысла я в этом не вижу, ибо в скомпиленном EXE всё равно не будет никаких Immidiate.

Хакер » 13.12.2006 (Ср) 18:04

Причём здесь Add-in. Автору надо программно. Add-in это чисто UI возможность. Т.е. доступ к Add-in возможен только через пользовательский интерфейс, но никак ни через программный. —We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

yaklit » 13.12.2006 (Ср) 18:35

Киска
если что то надо распечатать на экране, не лучше ли создать отдельное окно, скажем, с Textbox и если свойствами пользоваться не удобно, написать можуль для работы с ним?

Sergeant Pepper » 13.12.2006 (Ср) 21:04

Хакер писал(а): Причём здесь Add-in. Автору надо программно. Add-in это чисто UI возможность. Т.е. доступ к Add-in возможен только через пользовательский интерфейс, но никак ни через программный.
Если автор пишет VBE Add-In в котором требуется очистить Immediate Window, естественно это должно быть программно. Что я сказал непонятного?

lister » 14.12.2006 (Чт) 1:07

Причём здесь Add-in. Автору надо программно. Add-in это чисто UI возможность. Т.е. доступ к Add-in возможен только через пользовательский интерфейс, но никак ни через программный.

Смысла я в этом не вижу, ибо в скомпиленном EXE всё равно не будет никаких Immidiate.

Хакер , что-то ты намудрил. Ей просто нужно "очищать Immediate перед распечаткой нужных данных Debug.Print"
Уж наверное она понимает, что "в скомпиленном EXE всё равно не будет никаких Immidiate"

(заполненное старыми данными Immediate иногда просто бесит)

А "программно", по-моему, это значит не вручную, а автоматически, т.е. не ручками Ctrl-A, Delete

Если автор пишет VBE Add-In в котором требуется очистить Immediate Window, естественно это должно быть программно.

Вот именно. Что такое программа. по-моему, набор комманд. Add-In - в этом смысле тоже программа.

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

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

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

Где находится Immediate Window?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Открепить Immediate Window

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

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

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

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

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

Заключение

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