Перейти к содержимому

VBA Excel. Бегущая, ползущая и танцующая строки

Бегущая, ползущая и танцующая строки в VBA Excel. Использование цикла For...Next и метода Application.Wait для задержки выполнения кода. Скачать файл с примером.

  1. Бегущая строка
  2. Ползущая строка
  3. Танцующая строка
  4. Файл для скачивания

Для создания визуальных эффектов будем использовать цикл For...Next и метод Application.Wait. Также для этих целей отлично подойдет функция Timer, предложенная Андреем в комментариях. Использовать такие программы можно в учебных целях, а также для личного наблюдения и демонстрации визуальных эффектов. Приведенные здесь примеры лучше запускать с помощью кнопок из панели «Элементы управления формы», размещенных на рабочем листе.

Бегущая строка

Вариант №1

Этот вариант кода используется для создания бегущей строки в отдельной или объединенной ячейке, а также его можно применить для свойства Caption пользовательской формы.

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

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

Cells(3, 5) = stroka2

на строки

For i3 = 1 To dlina
Cells(1, i3) = Mid(stroka2, i3, 1)
Next

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

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

Ползущая строка

Для замедления кода при создании визуальных эффектов можно использовать метод Application.Wait, который позволяет замедлить каждую итерацию цикла минимум на 1 секунду. С одной секундой задержки можно получить только ползущую строку, но никак не бегущую. Наблюдение за ползущей строкой в одной или объединенной ячейке сразу вызывает желание остановить макрос. Это можно сделать однократным нажатием клавиши «Esc» или сочетанием клавиш «Ctrl+Break».

Лучше смотрится ползущая строка, когда каждый символ занимает отдельную ячейку, поэтому на таком варианте можно продемонстрировать задержу с помощью метода Application.Wait. Для этого в коде первого варианта необходимо строки

'---------------------------------
Cells(3, 5) = stroka2
'---------------------------------
For i3 = 1 To zaderzhka
Cells(100, 1) = ""
Next
'---------------------------------

заменить на строки

'---------------------------------
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 здесь совершенно не подходит.

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.

Во всех предложенных здесь примерах цикл For...Next и метод Application.Wait, использующиеся для приостановки процедур, можно заменить на код с функцией Timer.
Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

VBA Excel. Бегущая, ползущая и танцующая строки: 2 комментария

  1. Андрей

    Здравствуйте. Для работы потребовалось изучить VBA и ваш сайт оказался в этом очень полезным. И теперь мне хотелось бы внести свой небольшой вклад.

    В статье указано, что "В VBA Excel нет объекта «Таймер»". А как же функция Timer, которая возвращает количество секунд, прошедших после полуночи? Как-то мне потребовалось реализовать задержку в исполнении кода, которая в свою очередь не будет сильно грузить компьютер и не будет противно мигать курсором. При тщательном изучении функции Timer, мне удалось реализовать следующую функцию:

    Sub Пауза(ByVal y)
     
        x = Timer
        Do While Timer < x + y
            If y > 0.1 Then
                Do While z < 10000
                    DoEvents
                    z = z + 1
                Loop
                z = Empty
            Else
                DoEvents
            End If
        Loop
     
    End Sub
    

    Где:
    y - время задержки, причем, можно указать не только целое число (1, 2, 3 и т.д.), но и меньшие значения, например - 0,25;
    z - количество отсчитанных циклов, после которых управление переход к ОС, что позволяет избежать зависания программы (уменьшение количества циклов может привести к увеличению нагрузки на CPU).

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

    1. Евгений (автор статьи)

      Добрый день, Андрей!
      Спасибо за интересное решение, на которое я не обратил внимание, и за сообщение об ошибке при загрузке кода.

      Я протестировал ваш код и пришел к выводу, что для бегущей строки и других случаев вполне подойдет его сокращенная версия (с объявлением переменных для тех, кто использует оператор «Option Explicit»):

      Sub Пауза(ByVal y As Single)
      Dim x As Single
        x = Timer
          Do While Timer < x + y
            DoEvents
          Loop  
      End Sub
      

Добавить комментарий

Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора. При добавлении в комментарий кода VBA Excel, вставьте перед его началом тег [vb] и по окончании кода - [/vb].