Бегущая строка, а также ползущая и танцующая строки в VBA Excel. Использование цикла For…Next и метода Application.Wait для задержки выполнения кода. Скачать файл с примером.
Для создания визуальных эффектов будем использовать цикл For…Next и метод Application.Wait. Также для этих целей отлично подойдет функция Timer, предложенная Андреем в комментариях. Использовать такие программы можно в учебных целях, а также для личного наблюдения и демонстрации визуальных эффектов. Приведенные здесь примеры лучше запускать с помощью кнопок из панели «Элементы управления формы», размещенных на рабочем листе.
Бегущая строка
Вариант №1
Этот вариант кода используется для создания бегущей строки в отдельной или объединенной ячейке, а также его можно применить для свойства Caption пользовательской формы.
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 |
Sub BegushchayaStroka() Dim stroka1 As String, stroka2 As String, _ probely As Integer, dlina As Integer, _ kolichestvo As Integer, zaderzhka As Long stroka1 = "Моя бегущая строка" probely = 10 kolichestvo = 3 zaderzhka = 500 stroka1 = space(probely) & stroka1 dlina = Len(stroka1) Dim i1 As Integer, i2 As Integer, i3 As Integer For i1 = 1 To kolichestvo For i2 = 1 To dlina stroka2 = Right(stroka1, dlina - i2) & Left(stroka1, i2) '--------------------------------- Cells(3, 5) = stroka2 '--------------------------------- For i3 = 1 To zaderzhka Cells(100, 1) = "" Next '--------------------------------- Next Next End Sub |
Описание переменных:
- stroka1 — исходный текст бегущей строки;
- stroka2 — меняющийся в цикле текст и присваиваемый ячейке с бегущей строкой;
- probely — количество пробелов, добавляемых перед исходным текстом, чтобы отделить одно бегущее словосочетание от следующего;
- dlina — длина исходной строки с добавленными пробелами;
- kolichestvo — количество пробегов исходной строки;
- zaderzhka — максимальное количество выполнений цикла задержки, используется для регулирования скорости движения бегущей строки;
- i1, i2, i3 — счетчики циклов.
В данном примере для задержки выполнения кода используется цикл с присваиванием сотой ячейке первого столбца пустой строки. Этот цикл дает большую задержку при одинаковом количестве итераций в отличие от пустого цикла, который часто используется в таких случаях.
Бегущая строка наблюдается в ячейке Cells(3, 5), которой циклом присваивается меняющееся значение переменной stroka2. Вы можете использовать любую фиксированную ячейку или ActiveCell. Для более качественного визуального эффекта используйте в ячейке с бегущей строкой моноширинный шрифт (Courier New, MS Reference Sans Serif), так как у пропорционального шрифта очень короткие пробелы и на них бегущая строка сильнее замедляется.
Остановить выполнение макроса до его завершения можно, дважды нажав клавишу «Esc», или сочетанием клавиш «Ctrl+Break» (протестировано в Excel 2016).
Вариант №2
Еще одну интересную бегущую строку можно наблюдать, когда каждому символу строки соответствует отдельная ячейка. Для этого необходимо в предыдущем коде заменить строку
1 |
Cells(3, 5) = stroka2 |
на строки
1 2 3 |
For i3 = 1 To dlina Cells(1, i3) = Mid(stroka2, i3, 1) Next |
Бегущая строка будет наблюдаться в первой строке рабочего листа. Цикл будет заполнять ячейки первой строки символами, содержащимися в значении переменной stroka2. Ничего страшного, что переменная счетчика i3 будет использоваться дважды, так как циклы не являются вложенными и выполняются отдельно друг от друга.
Для второго примера можно использовать любой шрифт в используемых ячейках, так как на скорость движения бегущей строки уже не будут влиять размеры символов.
Ползущая строка
Для замедления кода при создании визуальных эффектов можно использовать метод Application.Wait, который позволяет замедлить каждую итерацию цикла минимум на 1 секунду. С одной секундой задержки можно получить только ползущую строку, но никак не бегущую. Наблюдение за ползущей строкой в одной или объединенной ячейке сразу вызывает желание остановить макрос. Это можно сделать однократным нажатием клавиши «Esc» или сочетанием клавиш «Ctrl+Break».
Лучше смотрится ползущая строка, когда каждый символ занимает отдельную ячейку, поэтому на таком варианте можно продемонстрировать задержу с помощью метода Application.Wait. Для этого в коде первого варианта необходимо строки
1 2 3 4 5 6 7 |
'--------------------------------- Cells(3, 5) = stroka2 '--------------------------------- For i3 = 1 To zaderzhka Cells(100, 1) = "" Next '--------------------------------- |
заменить на строки
1 2 3 4 5 6 7 |
'--------------------------------- For i3 = 1 To dlina Cells(1, i3) = Mid(stroka2, i3, 1) Next '--------------------------------- Application.Wait (Now + TimeValue("0:00:01")) '--------------------------------- |
Не обращайте внимания на ставшую ненужной переменную zaderzhka, которая на работу кода не повлияет.
Танцующая строка
В этом примере будем использовать задержку с помощью цикла For…Next, так как метод Application.Wait здесь совершенно не подходит.
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 39 40 |
Sub TantsuyushchayaStroka() Dim stroka1 As String, stroka2(14) As Variant, _ probely As Integer, _ kolichestvo As Integer, zaderzhka As Long stroka1 = "Моя танцующая строка" probely = 15 kolichestvo = 3 zaderzhka = 500 stroka2(0) = space(probely / 2) & stroka1 _ & space(probely / 2) stroka2(1) = "" stroka2(2) = space(probely / 2) & stroka1 _ & space(probely / 2) stroka2(3) = "" stroka2(4) = space(probely / 2) & stroka1 _ & space(probely / 2) stroka2(5) = "" stroka2(6) = stroka1 & space(probely) stroka2(7) = "" stroka2(8) = stroka1 & space(probely) stroka2(9) = "" stroka2(10) = space(probely) & stroka1 stroka2(11) = "" stroka2(12) = space(probely) & stroka1 stroka2(13) = "" stroka2(14) = space(probely / 2) & stroka1 _ & space(probely / 2) Dim i1 As Byte, i2 As Integer, i3 As Integer For i1 = 1 To kolichestvo For i2 = 0 To 14 Cells(5, 5) = stroka2(i2) For i3 = 1 To zaderzhka Cells(100, 1) = "" Next Next Next End Sub |
Все расположения танцующей строки в ячейке записаны в массив stroka2() и регулируются количеством присоединенных пробелов. Если будете экспериментировать, сразу задайте заведомо большее количество элементов массива.
Файл для скачивания
Для ознакомления можете скачать по этой ссылке архив с файлом в формате Excel 2007-2016 (.xlsm), в котором есть процедуры (и кнопки для их запуска), создающие
- ползущую строку в первой строке рабочего листа;
- бегущую строку в 5 ячейке 3 строки;
- танцующую строку в 5 ячейке 5 строки.
Возможно, вам придется значительно уменьшить значение переменной zaderzhka, так как эти макросы тестировались на компьютере с высокой производительностью. Ползущая строка, независимо от внешних факторов, будет перемещаться со скоростью один знак в секунду благодаря применению для задержки метода Application.Wait.
Фразы для контекстного поиска: пауза, задержка, приостановка, задержка выполнения кода.
Здравствуйте. Для работы потребовалось изучить VBA и ваш сайт оказался в этом очень полезным. И теперь мне хотелось бы внести свой небольшой вклад.
В статье указано, что «В VBA Excel нет объекта «Таймер»». А как же функция Timer, которая возвращает количество секунд, прошедших после полуночи? Как-то мне потребовалось реализовать задержку в исполнении кода, которая в свою очередь не будет сильно грузить компьютер и не будет противно мигать курсором. При тщательном изучении функции Timer, мне удалось реализовать следующую функцию:
Где:
y — время задержки, причем, можно указать не только целое число (1, 2, 3 и т.д.), но и меньшие значения, например — 0,25;
z — количество отсчитанных циклов, после которых управление переход к ОС, что позволяет избежать зависания программы (уменьшение количества циклов может привести к увеличению нагрузки на CPU).
После замены метода задержки в вашем документе, удалось добиться более плавной и приятной работы скрипта 🙂
Добрый день, Андрей!
Спасибо за интересное решение, на которое я не обратил внимание, и за сообщение об ошибке при загрузке кода.
Я протестировал ваш код и пришел к выводу, что для бегущей строки и других случаев вполне подойдет его сокращенная версия (с объявлением переменных для тех, кто использует оператор «Option Explicit»):
Обсуждение закрыто.