Хитрости »
26 Февраль 2016 56362 просмотров
Отобразить процесс выполнения
Часто при создании кодов в VBA используется обращение к ячейкам, листам, книгам и т.д. и их обработка в циклах. Пара примеров подобных циклов:
- Просмотреть все файлы в папке — цикл по файлам в папке — Do While sFiles <> «» и For Each objFile In objFolder.Files
- Массовая замена слов — цикл по ячейкам(массивам) — For lr = 1 To UBound(avArr, 1)
- Не работают/пропали меню — цикл по всем панелям — For Each cmdBar In Application.CommandBars
Если операция в цикле выполняется за пару секунд — это вполне приемлемо и отражать графически подобные действия нет нужды. Но, если циклы «крутятся» по полчаса — вполне неплохо иметь возможность видеть на какой стадии цикл. Здесь есть один нюанс: циклы могут быть как с заранее известным кол-вом итераций, так и без этого понимания.
Цикл Do While из первого кода статьи Просмотреть все файлы в папке является циклом условия. Т.е. заранее неизвестно сколько файлов будет обработано и следовательно невозможно отразить прогресс выполнения задачи в процентах.
Циклы вроде For Each и For … Next как правило дают возможность определить общее кол-во элементов к обработке, т.к. применяются как правило к коллекциям и объектам, у которых есть свойство .Count. Углубляться в этой статье не стану — это лишь предисловие, чтобы было ясно, почему и зачем далее в статье продемонстрированы разные подходы отображения процесса выполнения.
Отобразить же процесс можно двумя способами:
- Использование Application.StatusBar
- Использование UserForm
Использование Application.StatusBar
Самый простой вариант отображения процесса выполнения кода. Он может быть без проблем использован на любом ПК.
Application.StatusBar
— это специальный элемент интерфейса, расположенный в левой нижней части окна Excel и который может показывать дополнительную информацию в зависимости от действий пользователя. Все не раз видели его в работе. Например, после того как мы скопировали ячейки StatusBar покажет нам доп.информацию:
И из VBA есть доступ к этому элементу. Чтобы написать слово привет в StatusBar надо выполнить всего одну строку кода:
Application.StatusBar = "Привет"
Чтобы сбросить значения StatusBar и передать управление им обратно самому Excel необходимо выполнить строку:
Application.StatusBar = False
делать это обязательно, т.к. в противном случае вместо системных доп.сообщений будет постоянно показываться то значение, которое мы задали. Конечно, можно перезапустить Excel, но куда правильнее дописать в код строку, приведенную выше.
Как я уже упоминал — циклы могут быть с заранее неизвестным кол-вом итераций. В таких случаях очень удобно показывать стадию выполнения хотя бы из тех побуждений, чтобы пользователь видел, что программа не «зависла». на примере кода из статьи Просмотреть все файлы в папке:
Sub Get_All_File_from_Folder() Dim sFolder As String, sFiles As String 'диалог запроса выбора папки с файлами With Application.FileDialog(msoFileDialogFolderPicker) If .Show = False Then Exit Sub sFolder = .SelectedItems(1) End With sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) 'отключаем обновление экрана, чтобы наши действия не мелькали Application.ScreenUpdating = False sFiles = Dir(sFolder & "*.xls*") Do While sFiles <> "" 'показываем этап выполнения Application.StatusBar = "Обрабатывается файл '" & sFiles & "'" 'открываем книгу Workbooks.Open sFolder & sFiles 'действия с файлом 'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru ActiveWorkbook.Sheets(1).Range("A1").Value = "www.excel-vba.ru" 'Закрываем книгу с сохранением изменений ActiveWorkbook.Close True 'если поставить False - книга будет закрыта без сохранения sFiles = Dir Loop 'возвращаем ранее отключенное обновление экрана Application.ScreenUpdating = True 'сбрасываем значение статусной строки Application.StatusBar = False End Sub
Если запустить код, то перед открытием каждой книги в строке StatusBar будет показано какой именно файл отрывается и обрабатывается. И так с каждым файлом:
В случае же с циклами, количество итераций которых есть возможность определить, можно показывать этап выполнения в процентах. Например, цикл по всем выделенным ячейкам:
Sub ShowProgressBar() Dim lAllCnt As Long, lr as Long Dim rc As Range 'кол-во ячеек в выделенной области lAllCnt = Selection.Count 'цикл по всем ячейкам в выделенной области For Each rc In Selection 'прибавляем 1 при каждом шаге lr = lr + 1 Application.StatusBar = "Выполнено: " & Int(100 * lr / lAllCnt) & "%" DoEvents 'чтобы форма перерисовывалась Next 'сбрасываем значение статусной строки Application.StatusBar = False End Sub
В строке статуса это будет выглядеть так:
Но можно показывать информацию и в чуть более изощренных формах:
Вариант отображения % и блоками-цифрами от 1 до 10(1 = 10% выполнения)
Sub StatusBar1() Dim lr As Long, lrr As Long, lp As Double Dim lAllCnt As Long 'кол-во итераций Dim s As String lAllCnt = 10000 'основной цикл For lr = 1 To lAllCnt lp = lr 100 'десятая часть всего массива s = "" 'формируем строку символов(от 1 до 10) For lrr = 10102 To 10102 + lp 10 s = s & ChrW(lrr) Next 'выводим текущее состояние выполнения Application.StatusBar = "Выполнено: " & lp & "% " & s: DoEvents DoEvents Next 'очищаем статус-бар от значений после выполнения Application.StatusBar = False End Sub
Вариант отображения % и стрелками ->(1 стрелка = 10% выполнения)
Sub StatusBar2() Dim lr As Long, lp As Double Dim lAllCnt As Long 'кол-во итераций Dim s As String lAllCnt = 10000 For lr = 1 To lAllCnt lp = lr 100 'десятая часть всего массива 'формируем строку символов(от 1 до 10) s = String(lp 10, ChrW(10152)) & String(11 - lp 10, ChrW(8700)) Application.StatusBar = "Выполнено: " & lp & "% " & s: DoEvents DoEvents Next 'очищаем статус-бар от значений после выполнения Application.StatusBar = False End Sub
Вариант отображения % и квадратами (кол-во квадратов можно изменять. Если lMaxQuad=20 — каждый квадрат одна 20-я часть всего массива)
Sub StatusBar3() Dim lr As Long Dim lAllCnt As Long 'кол-во итераций Const lMaxQuad As Long = 20 'сколько квадратов выводить lAllCnt = 10000 For lr = 1 To lAllCnt Application.StatusBar = "Выполнено: " & Int(100 * lr / lAllCnt) & "%" & String(CLng(lMaxQuad * lr / lAllCnt), ChrW(9632)) & String(lMaxQuad - CLng(lMaxQuad * lr / lAllCnt), ChrW(9633)) DoEvents Next 'очищаем статус-бар от значений после выполнения Application.StatusBar = False End Sub
Этот вариант мне нравится больше всего.
При желании можно сделать и иные варианты — главное найти символы, которые будут показываться и определить их числовой код.
Использование UserForm
Использование стандартного элемента ProgressBar
Для Userform можно использовать стандартный контрол ProgressBar, но я лично не люблю добавлять на формы элементы, которые надо подключать отдельно. Потому как впоследствии контрол может отказаться работать, т.к. нужной версии не окажется на конечном ПК пользователя. Например в моем офисе 2010 для 64-битных систем его нет.
Поэтому про него кратко и в файле примере его нет. Как его создать:
- создаем UserForm (в меню VBE —Insert —UserForm. Подробнее про вставку модулей и форм — Что такое модуль? Какие бывают модули?)
- отображаем окно конструктора(если не отображено): View —Toolbox
- далее в меню Tools —Additional Controls
- там ищем что-то имеющее в названии ProgressBar и отмечаем его. Жмем Ок.
Теперь в окне Toolbox появится элемент ProgressBar. Просто перетаскиваем его на форму. В свойствах можно задать цвет и стиль отображения полосы прогресса. Останется лишь при необходимости программно показывать форму и задавать для элемента ProgressBar значения минимума и максимума. Примерно это выглядеть будет так:
Практический код
Например, надо обработать все выделенные ячейки. Если форма называется UserForm1, а ProgressBar — ProgressBar1, то код будет примерно такой:
Sub ShowProgressBar() Dim lAllCnt As Long Dim rc As Range 'кол-во ячеек в выделенной области lAllCnt = Selection.Count 'показываем форму прогресс-бара UserForm1.Show UserForm1.ProgressBar1.Min = 1 UserForm1.ProgressBar1.Max = lAllCnt 'цикл по всем ячейкам в выделенной области For Each rc In Selection 'прибавляем 1 при каждом шаге UserForm1.ProgressBar1.Value = UserForm1.ProgressBar1.Value + 1 DoEvents 'чтобы форма перерисовывалась Next 'закрываем форму Unload UserForm1 End Sub
Использование своего собственного прогресс-бара
Я использую в своих приложениях свой прогресс-бар с процентами. Для этого я использую стандартную UserForm, на которой располагаю два элемента Caption. Первый отвечает за визуальную составляющую в виде синей полосы заполнения, а так же за отображение процентов белыми цифрами на синем фоне. Второй Caption прозрачный и на нем в том же месте, что и у первого, отображаются проценты цифрами, но уже черным шрифтом. В результате в работе это выглядит так:
Как использовать эту форму и коды
Первоначально надо скачать файл, приложенный к статье, и в свой проект перенести форму frmStatusBar и модуль mCustomProgressBarModule.
Далее просто внедряем нужные строки в свои коды с циклами:
- До начала цикла необходимо вызывать процедуру инициализации формы:
Call Show_PrBar_Or_No(lAllCnt, «Обрабатываю данные…»)
первым аргументом задается общее кол-во обрабатываемых элементов, а вторым заголовок формы. Если второй аргумент не указан, то по умолчанию будет показан заголовок «Выполнение…». Так же внутри кодов есть кусок кода, отвечающий за минимальное кол-во элементов к обработке. По умолчанию задано 10. Это значит, что если обрабатывается менее 10 ячеек, то форма прогресс-бара показана не будет. Нужно для случаев, когда производятся разные действия над ячейками, но неизвестно сколько их будет. Но зато известно, что с ними будет делать код. Часто для кол-ва ячеек менее 100 нет смысла отображать прогресс выполнения, т.к. это и так секундное дело.
Чтобы изменить минимальное кол-во достаточно в строке bShowBar = (lCnt > 10) заменить 10 на нужное число. - Далее в каждом проходе цикла вызвать перерисовку формы под новое значение цикла:
If bShowBar Then Call MyProgresBar - и в конце не забыть закрыть форму, чтобы не висела:
If bShowBar Then Unload frmStatusBar
Пример применения формы:
Sub Test_ProgressForm() Dim lr As Long Dim lAllCnt As Long 'кол-во итераций lAllCnt = 10000 'инициализируем форму прогресс-бара Call Show_PrBar_Or_No(lAllCnt, "Обрабатываю данные...") 'сам цикл For lr = 1 To lAllCnt If bShowBar Then Call MyProgresBar Next 'закрываем форму, если она была показана If bShowBar Then Unload frmStatusBar End Sub
Так же все описанные примеры и коды можно найти в приложенном файле:
Скачать пример:
Tips_ShowProgressBar.xls (79,0 KiB, 6 154 скачиваний)
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
отсутствует progressbar |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
- Remove From My Forums
-
Question
-
It’s even so that I can’t find any ProgressBar-object in Excel2010 «More Controls». Is that a object that is «discontinnued» or what? Can I find it somewhere else in the «VBA Excel range» (I don’t even know what that could mean myself
Any help or explanation would be appreciated!
/Krajan
Answers
-
-
Proposed as answer by
danishani
Tuesday, January 31, 2012 3:58 AM -
Marked as answer by
danishani
Tuesday, February 7, 2012 7:55 PM
-
Proposed as answer by
All replies
-
hi,
—
isabelle
Le 2011-10-03 07:55, Krajan at Work a écrit :
> It’s even so that I can’t find any ProgressBar-object in Excel2010 «More Controls». Is that a object that is «discontinnued» or what? Can I find it somewhere else in the «VBA Excel range» (I don’t even know what that
could mean myself>
> Any help or explanation would be appreciated!
>
> /Krajan
>
-
You haven’t by any chance installed the 64 bit version of Office 2010?
Regards, Jan Karel Pieterse|Excel MVP|http://www.jkp-ads.com
-
-
Proposed as answer by
danishani
Tuesday, January 31, 2012 3:58 AM -
Marked as answer by
danishani
Tuesday, February 7, 2012 7:55 PM
-
Proposed as answer by
Данный прогресс-бар позволяет отображать ход выполнения любого макроса.
Для использования этого индикатора перетащите из файла-примера в свой файл модуль класса ProgressIndicator и форму F_Progress
Использовать прогресс бар сравнительно просто — достаточно добавить в макрос несколько строк кода:
Sub ПростейшийПримерИспользованияПрогрессБара() Dim pi As New ProgressIndicator ' создаём новый прогресс-бар pi.Show "Подождите, работает макрос" ' отбражаем индикатор ' здесь код вашего макроса pi.Hide ' закрываем индикатор End Sub
Sub ПримерИспользованияПрогрессБара() КоличествоЗапусковВнешнегоМакроса = 3000 Dim pi As New ProgressIndicator ' создаём новый прогресс-бар pi.Show "Форматирование ячеек" ' отбражаем индикатор ' первое действие (на шкале индикатора от 0 до 95 процентов) - это окраска ячеек pi.StartNewAction 0, 95, "Окраска ячеек", , , КоличествоЗапусковВнешнегоМакроса ' цикл с вызовом внешнего макроса "ФорматированиеЯчейки" For i = 1 To КоличествоЗапусковВнешнегоМакроса ' инициируем очередное действие в индикаторе pi.SubAction , "Обрабатывается ячейка $index из $count", "$time" ' собственно, код цикла ФорматированиеЯчейки i Next ' всё покрасили - теперь пора чистить ячейки ) pi.StartNewAction 95, 100, "Очистка ячеек" Cells.Clear pi.Hide ' закрываем индикатор End Sub Sub ФорматированиеЯчейки(ByVal n As Long) ' вызываемый макрос Cells(n).Interior.ColorIndex = 15: Cells(n).BorderAround xlContinuous End Sub
Давайте рассмотрим подробнее работу с индикатором.
Прогресс-бар выполнен в виде модуля класса, поэтому, для начала работы с ним,
надо прежде всего создать экземпляр этого класса:
Dim pi As New ProgressIndicator ' создаём новый прогресс-бар
Итак, прогресс-бар создан, и теперь надо его отобразить.
Для этого мы используем метод Show объекта типа ProgressIndicator:
pi.Show "Форматирование ячеек" ' отбражаем индикатор
При использовании метода Show мы сразу задаём заголовок индикатора (можно здесь указать название вашего макроса)
Индикатор появился на экране — но полоса не отображается, ибо процент выполнения по-умолчанию равен нулю.
Для каждого действия мы будем задавать начальный и конечный процент выполнения задачи
К примеру, если первое действие вашего макроса занимает по времени примерно пятую часть от времени выполнения всего макроса,
то мы укажем интервал для индикатора от 0% до 20%:
Как вы заметили, для запуска очередного действия используется метод StartNewAction объекта ProgressIndicator.
При вызове этого метода можно сразу задать текст для каждой из 3 текстовых строк индикатора:
pi.StartNewAction 0, 20, "Текст первой строки", "Текст строки 2", "Текст строки 3"
Если действие состоит из нескольких отдельных «поддействий», то можно также сразу задать и количество этих «поддействий»
(например, основное действие — это форматирование ячеек (от 0% до 20% индикатора), а поддействия — это окраска отдельных ячеек (первая строка — от 0% до 1% индикатора, вторая строка — от 1% до 2%, и т.д.))
Чтобы нам не мучиться с расчётами этих процентов, мы просто задаём количество действий (например, количество форматируемых ячеек, равное 3000),
и индикатор сам разделит диапазон от 0% до 20% на 3000 равных частей, плавно увеличивая длину полосы индикатора по мере форматирования отдельных ячеек.
pi.StartNewAction 0, 20, "Окраска ячеек", , , 3000
Чтобы уведомить индикатор об очередном «поддействии» внутри цикла, мы используем метод SubAction объекта ProgressIndicator
' инициируем очередное действие в индикаторе pi.SubAction , "Обрабатывается ячейка $index из $count", "$time"
Как вы могли заметить, мы задали только значение второй и третьей строки индикатора, не указав никакого текста для первой строки.
В этом случае (если значения некоторых из 3 строк индикатора не заданы), эти строки не изменяются
(в первой строке индикатора останется текст, заданный ранее при использовании метода StartNewAction)
Кроме того, в тексте для строк индикатора можно использовать следующие ключевые слова:
- $index и $count — для вывода строк типа «Обрабатывается ячейка 515 из 3000«,
- $time — для вывода ожидаемого времени до окончания макроса
(макрос анализирует текущий процент выполнения и затраченное время, и предсказывает, сколько времени осталось до окончания всех действий)
Если же необходимо просто увеличить длину полоски индикатора — можете использовать метод SubAction без параметров:
Вы можете выводить сколько угодно действий в индикаторе, причем совсем не обязательно, чтобы начальный процент очередного действия был равен конечному проценту предыдущего.
Вполне допустим следующий код:
pi.StartNewAction 5, 20, "Действие 1" ' начинаем не с нуля pi.StartNewAction 20, 50, "Действие 2" ' начинается сразу после предыдущего pi.StartNewAction 35, 60, "Действие 3" ' начинается раньше предыдущего pi.StartNewAction 85, 90, "Действие 4" ' начинается через время после предыдущего pi.StartNewAction 10, 100, "Действие 5" ' начинаем почти всё сначала
По окончании макроса желательно закрыть прогресс бар:
pi.Hide ' закрываем индикатор
У объекта ProgressIndicator имеется много различных свойств и методов.
Вкратце расскажу о некоторых свойствах:
- свойство Caption позволяет задать новый заголовок индикатора
-
свойство FP позволяет получить доступ к отображаемой форме (и всем её элементам управления)
(например, код pi.FP.PrintForm выведет индикатор на печать) - свойства Line1, Line2 и Line3 позволяют в любом месте кода задать текст конкретной строки индикатора
-
свойства ShowPercents и ShowTime включают или выключают отображение процента выполнения и времени в заголовке индикатора
(по умолчанию оба свойства имеют значение TRUE, т.е. в заголовке отображается и время, и процент выполнения макроса)
Из функций объекта мы рассмотрим только одну: AddChildIndicator
Эта функция создаёт дочерний прогресс бар, и отображает его выше или ниже родительского:
' создаём дочерний индикатор, и выводим его ниже основного Dim pi2 As ProgressIndicator Set pi2 = pi.AddChildIndicator("Раскрашивание ячеек", 1)
При изменении процента выполнения в дочернем индикаторе пропорционально меняется и процент выполнения главного (родительского) прогресс-бара.
В прикреплённом файле, помимо модуля класса и формы индикатора,
присутствует также стандартный модуль с несколькими примерами использования прогресс-бара.
На индикаторе присутствует кнопка «Отмена» — её нажатие вызывает останов всех запущенных макросов
(выполняется команда End, останавливающая все макросы, и обнуляющая все переменные)
Поскольку у этой кнопки свойство Cancel установлено в TRUE, нажатие на клавиатуре клавиши ESC равносильно нажатию кнопки «Отмена»
(при нажатии Esc макрос останавливается)
добавлено 23.02.2012
Новая версия прогресс-бара — с поддержкой отображения лога на индикаторе, и возможностью отображения лога в виде текстового файла.
Высоту текстового поля с логом можно изменять:
Новая версия индикатора, и примеры его использования — во втором прикреплённом файле.
PS: Идеальный прогресс-бар должен работать так
- 115764 просмотра
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
Разберёмся как создать и настроить линейный индикатор выполнения (прогресс-бар) в виде диаграммы в Excel.
Приветствую всех, уважаемые читатели блога TutorExcel.Ru!
В современную экономическую жизнь прочно вошли понятия КПЭ (ключевые показатели эффективности, или KPI) и дашборда, которые помогают нам увидеть насколько эффективно выполняются те или иные цели. Грамотная визуализация позволяет сделать это приятным и понятным глазу языком.
Мы уже разбирали с вами примеры пулевой диаграммы, диаграммы в виде спидометра, сейчас остановимся ещё на одном варианте визуализации — индикаторе выполнения (также встречаются названия индикатор процесса или прогресс-бар от английского progress bar).
Для начала давайте поймем, что же это именно такое?
Прогресс бар — это графический элемент в виде полоски (горизонтальной, вертикальной, круговой и т.д.), показывающий статус процесса с помощью заполнения полоски по мере выполнения. Вы часто можете видеть горизонтальный вариант графика во время ожидания загрузки файлов или установки программ.
Сегодня предлагаю подробно рассмотреть линейный вариант графика, который представляет собой простую горизонтальную или вертикальную полосу:
Также в целом можно выделить 2 способа построения графика:
- Без делений на шкале; в этом случае полоска нарисована как единый объект.
- С делениями. В этом случае дополнительно рисуется шкала, которая отображает уровни выполнения (к примеру от 0% до 40% — красная зона, от 40% до 70% — желтая зона и т.д.).
Построение линейного индикатора (прогресс бара)
Вариант 1. Прогресс бар без шкалы
Давайте приступим к построению и начнем с самого простого варианта.
Для начала создадим таблицу, состоящую всего из 2 рядов с данными, в первом будет исходный процент (к примеру 85%), а во втором оставшаяся недостающая часть до 100% (т.е. в данном случае 15% = 100% — 85%):
Выделяем диапазон с данными A1:B2 и строим гистограмму с накоплением (в панели вкладок выбираем Вставка -> Диаграммы -> Линейчатая гистограмма с накоплением):
Как видим Excel не совсем правильно интерпретировал данные и построил график с 2 рядами данных, поэтому для корректного отображения поменяем местами строки и столбцы (выделяем диаграмму и в панели вкладок Конструктор выбираем Строка/Столбец), этим мы добьемся отображения всех данных в одному ряду:
Отлично, диаграмма уже начинает приобретать узнаваемый вид.
Далее устанавливаем минимальную и максимальную границы для оси (щелкаем правой кнопкой мыши по горизонтальной оси и попадаем в настройки Формата оси), как 0 и 1 соответственно, чтобы наша полоска полностью помещалась и показывалась на графике:
В результате мы получаем следующий вид графика:
Уберем ненужные на текущий момент детали в виде названия, дополнительных осей и прочего, чтобы они не отвлекали от построения (их, безусловно, можно не удалять и компоновать на ваше усмотрение):
Как мы видим, полученная полоска занимает не всю ширину диаграммы, снизу и сверху мы видим пустые белые полосы.
Поэтому, чтобы растянуть диаграмму на всю возможную ширину и убрать лишние полосы, установим боковой зазор для ряда равным нулю (выделяем любой ряд с данными, щелкаем правой кнопкой мыши и выбираем Формат ряда данных -> Параметры ряда):
В итоге получаем более компактный вид:
Остались небольшие детали, покрасим части полоски в подходящие цвета и добавим подпись данных на ряд:
Все готово, перейдем к следующему варианту.
Вариант 2. Прогресс бар со шкалой
Отличие этого варианта от предыдущего заключается лишь в дополнительной подложке под полоску, которая показывает уровни выполнения показателя, остальные части практически повторяют предыдущий вариант построения.
Для начала несколько модифицируем нашу таблицу и добавим на нее дополнительные ряды для построения шкалы:
В данном случае я указал шаг шкалы равным 10%, но можно поставить абсолютно любой по вашему усмотрению, главное чтобы сумма всех таких шагов давала 100% (10 шагов по 10% как в примере, или 20 шагов по 5% и т.д.).
Выделяем диапазон с данными A1:B11 и, как и в предыдущем примере, строим линейчатую гистограмму с накоплением:
Повторяем алгоритм и меняем строки и столбцы местами, чтобы диаграмма приобрела необходимый нам вид:
Как мы видим, у нас появилась достаточно длинная полоса, где в начале находится полоска, а в конце как раз разместилась шкала в виде маленьких разноцветных прямоугольников.
Покрасим каждый шаг шкалы в подходящий цвет, для этого левой кнопкой мыши выделяем каждый ряд по отдельности и делаем заливку соответствующим цветом (к примеру, первые 4 шага красим красным, 3 средние — желтым и 3 последние — зеленым):
Так как шкала должна быть подложкой (т.е. находиться позади основного ряда), то поместим основной ряд на второстепенную ось, чтобы он всегда находился над шкалой. Для этого в настройке формата ряда данных указываем построить ряд по вспомогательной оси (именно для ряда с основной полоской):
В результате настройки типов осей получаем:
Далее также для обеих осей указываем 0 и 1 как минимальную и максимальную границы, чтобы график был ровно от 0% до 100%:
Убираем название, оси данных и прочие ненужные в данный момент детали, настраиваем нулевой боковой зазор:
Так как шкала на полученной диаграмме не видна за основной полоской, то для основного ряда с данными установим прозрачность (щелкаем по ряду правой кнопкой мыши, в контекстном меню выбираем Формат ряда данных -> Заливка и границы -> Заливка):
Также добавим подпись данных и получаем:
По усмотрению шкалу можно сделать не сплошной, а с разделителями, для этого установим для каждого ряда шкалы белую границу:
На этом все!
Скачать файл с примером.
Спасибо за внимание!
Если у вас есть вопросы по теме статьи — пишите в комментариях.
Удачи вам и до скорых встреч на страницах блога TutorExcel.Ru!