Полезная информация в строке состояния

Кому-как, а мне лично строка состояния бывает нужна только в 2-3 случаях:

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

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

Общие принципы управления строкой состояния

Управление строкой состояния с помощью Visual Basic очень несложно. Чтобы вывести в нее свой текст, можно использовать простой макрос:

Sub MyStatus()
    Application.StatusBar = "Привет!"
End Sub

После его запуска получим:

Свой текст в строке состояния

Чтобы восстановить исходное состояние строки статуса нужен будет такой же короткий "антимакрос":

Sub MyStatus_Off()
    Application.StatusBar = False
End Sub 

В базовом варианте, как видите, все очень просто. Теперь давайте попробуем развить идею...

Адрес выделенного диапазона в строке состояния

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

status-bar2.png

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

Откройте редактор Visual Basic с помощью одноименной кнопки на вкладке Разработчик (Developer) или сочетания клавиш левый Alt+F11. Найдите в левом верхнем углу на панели Project свою книгу и откройте в ней двойным щелчком модуль ЭтаКнига (ThisWorkbook):

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

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Application.StatusBar = "Выделено: " & Selection.Address(0, 0)
End Sub

Теперь при выделении любого диапазона (в том числе и не одного!), в строке состояния будет отображаться его адрес:

status-bar3.png

Чтобы адреса нескольких выделенных с Ctrl диапазонов не сливались, можно добавить небольшое улучшение - заменить с помощью функции Replace запятую на запятую с пробелом:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Application.StatusBar = "Выделено: " & Replace(Selection.Address(0, 0), ",", ", ")
End Sub

Количество выделенных ячеек в строке состояния

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

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim CellCount As Variant, rng As Range

    For Each rng In Selection.Areas     'перебираем все выделенные области
        RowsCount = rng.Rows.Count                          'число строк
        ColumnsCount = rng.Columns.Count                    'число столбцов
        CellCount = CellCount + RowsCount * ColumnsCount    'накапливаем общее число ячеек
    Next
    'выводим в строку состояния
    Application.StatusBar = "Выделено: " & CellCount & " ячеек"
End Sub

Этот макрос перебирает все выделенные с Ctrl области (если их несколько), сохраняет количество строк и столбцов в каждой области в переменных RowsCount и ColumnsCount и накапливает количество ячеек в переменной CellCount, которая затем и выводится в строку состояния. В работе это будет выглядеть следующим образом:

status-bar4.png

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

Application.StatusBar = "Выделено: " & Replace(Selection.Address(0, 0), ",", ", ") & " - итого " & CellCount & " ячеек"

Тогда картина будет совсем замечательная:

status-bar5.png

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

Ссылки по теме




30.06.2015 18:37:39
Спасибо.
1 - в строке статуса, соответственно информация о статусе листа, книги
Количество объектов на листе, типы объектов на листе, ...  (перечисление через точку с запятой)

2 - вычисления для диаграммы Эйлера - Венна

3 - настраиваемую "Настройка строки статуса" с доп. возможностями которых там нет
01.07.2015 10:17:53
Николай, спасибо большое! Уже частично пользуюсь данной возможностью отображать больше полезной информации на экране без лишних действий.
Было бы очень удобно также в выделенном диапазоне отображать количество #N/A. Это очень актуально для больших файлов, так как фильтрация и антифильтрация по #N/A для их подсчёта иногда занимает достаточно много времени:(
13.07.2015 11:11:30
Количество уникальных значений в диапазоне выделения
1
1
2
3
4
4
3
количество уникальных: 4
20.07.2015 16:09:50
В строке состояния можно указать условия фильтра на листе.
29.07.2015 13:24:32
Я у себя буду курсы указывать - постоянно под руками требуются
31.07.2015 14:57:18
Мега полезно.
В PLEX однозначно.:)
Можно указывать есть ли например проверки данных на листе и где.
06.08.2015 21:32:45
Для определения количества выделенных ячеек можно использовать всего лишь одну строку, скорость выполнения макроса в разы быстрее

Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
      Application.StatusBar = "Выделено: " & Selection.Cells.Count & " ячеек"
End Sub
07.08.2015 09:17:47
Роман, попробуйте свой макрос вставить в книгу и выделить лист полностью, щелкнув в левый верхний угол.
07.08.2015 15:05:29
Хорошее замечание, но для таких случаев есть схожее свойство ;)

Selection.Cells.CountLarge
Кстати в версии Excel 2016 все эти фишки со статус баром не работают, в автономном режиме не отображает, через F5 макрос не запускает и даже не находит в списке, при удалении аргументов процедуры срабатывает, но уже надо каждый раз макрос запускать, проблемма в чем, не доработали?
11.08.2015 17:39:31
Подскажите как добавить информацию в строку статуса - подсчет НДС (18%) из выделенных ячеек?
26.08.2015 02:15:53
Дебаговое окно при попытке выделять поля (всю группу) в сводных таблицах
09.09.2015 09:14:49
Подскажите как этот код можна вставить в свою надстройку что-бы во всех файлах использовать? Спасибо
Дисклеймер: я не специалист, то есть совсем.

Задался таким же вопросом. Как я понял, проблема в том, что событие это имеется на уровне листа или книги, а вот на уровне приложения я такого не нашел. Поэтому гуглим "vba events on application level" - у мелкомягких есть подробный мануал на эту тему. Я повторил действия, но суть понял не очень.

Получилось вот такое решение, у меня работает.

1. В персональную книгу макросов вставляем Class Module (Class1- так называется по умолчанию).
2. В этот модуль такой код:

Private Sub appevent_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)Application.StatusBar = "Выделено: " & Replace(Selection.Address(0, 0), ",", ", ") & " - итого" & Format(Selection.Cells.CountLarge, "#,##0") & " ячеек"End Sub 


3. в обычный модуль (тот где у вас Auto_open) персональной книги макросов, в объявления модуля
 Dim myobject As New Class1


4. В тот же модуль  добавляю Sub

 Sub application_selection()
Set myobject.appevent = Application
End Sub



5. В том же модуле вызываем подпрограмму из пункта 4 через Auto_open (чтоб запускалась при открытии Эксель)


 Sub Auto_Open()application_selectionEnd Sub


PS пункты 3,4,5 хотелось поместить в Auto_open сразу, но что то не пошло.

Как то так.
22.10.2015 15:25:23
Проблемка-с, auto_open находится не в книге макросов, а в надстройке. и при запуске получаю ошибку "Method or data member not found" на APPEVENT

Sub application_selection()
Set myobject.APPEVENT = Application
End Sub
Ну как и предупреждал, я не спец, поэтому не очень вас понимаю. Не знаю, что такое надстройка.

Насколько я понимаю:
1. Все что я описал нужно поместить в одно место. У меня это персональная книга макросов, у вас может быть что-то другое.
2. Замечания по пункту 2 из моей схемы выше. Во-первых название этого самого Class module - такое же как и в пункте 3. Ну чтобы объявлилось что-то конкрентное. Во-вторых, я конечно забыл кусок кода (собственно событие). Его необходимо вставить первой сторокой (пункт 2 схемы)

Public WithEvents appevent As Application 
3. Попробуйте тогда просто запустить подпрограмму из пункта 4, если заработает (должно все-таки). Тогда уже решите как автозапускать.
29.10.2015 15:27:27
Все работает. Судя по всема проблема не в том что auto_open в надстройке, а в "забытом" куске кода. Спасибо за подсказку!
22.01.2016 21:34:07
Простенько, кому был нужен НДС:


Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
On Error Resume Next
Dim rn As Range
Dim Summ1 As Currency, Summ2 As Currency, Summ3 As Currency, Summ4 As Currency
For Each rn In Selection
  If IsNumeric(rn.Value) Then
    Summ = Summ + rn
  Else
   Application.StatusBar = ""
    Exit Sub
  End If
Next
 Summ1 = Summ / 1.18
  Summ2 = Summ - Summ1
  Summ3 = Summ * 1.18
  Summ4 = Summ * 1.18 - Summ
    Application.StatusBar = "Без НДС: " & Summ1 & " НДС: " & Summ2 & " C+НДС " & Summ3 & " +НДС " & Summ4
End Sub
 
03.03.2016 12:54:06
Подскажите, где в данном случае взять кнопку Макрорекордера?
26.04.2016 08:37:02
Евгений, там же где и всегда - в меню Экселя, конкретно у меня в разделе Developer третья слева кнопка по верхнему краю, или первая сверху по правому.

Для Николая - нужно дообъявить переменные, возник вопрос на форуме по коду "Количество выделенных ячеек в строке состояния"
Dim RowsCount As Long, ColumnsCount As Long
06.09.2016 15:20:46
Подскажите, сталкивался ли кто-нибудь с тем, что если при суммировании значений в нескольких ячейках  полученная сумма представляет собой длинное (многозначное) число, то оно отражается не полностью в отведенном для него пространстве в строке состояния. В моем случае число
€ 144 300 003,63
, которое является суммой значений в нескольких ячейках, отображается в строке состояния не полностью и выглядит, как € 144 300 003,
Т.е. не видны цифры после запятой.
Понимаю, что могу воспользоваться автосуммированием и увижу число полностью, но, может быть, есть возможность менять размер служебного окна в строке состояния или размер шрифта в служебном окне?
25.10.2017 13:32:30
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
   Application.StatusBar = "Выделено: " & Selection.Address(0, 0)
End Sub
В Excel 2016 не работает
26.10.2017 08:24:57
Все отлично работает - не мутите воду. Код вставили в модуль ЭтаКнига (ThisWorkbook) или в модуль листа?
01.10.2019 09:25:17
как все-таки превратить данный макрос в надстройку?
11.12.2019 21:28:18
Так и не получилось использовать для любой открытой книги. Ладно, буду вставлять в каждую макрос учителя, геморройно, но что делать
22.01.2021 13:35:33
Николай, спасибо большое за Вашу работу!

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