Как добавить в PowerPoint 2010 шкалу прогресса слайдов. VBA
Озадачился проблемой: добавить в PowerPoint визуальную шкалу прогресса слайдов.
Естественно, хотелось максимально автоматизировать этот процесс с тем, чтобы не добавлять/изменять ручками прямоугольники при каждом изменении состава презентации.
(И пока я ставлю себе VS2010…)
Сегодня мы посмотрим, как добавить такой Progress Bar средствами VBA.
Включаем Developer-панель
Для начала нужно включить Developer-панель, чтобы можно было редактировать макросы, создавать формочки и т.п.
Для этого достаточно щелкнуть правой кнопкой по ribbon-ленте PowerPoint и выбрать кастомизацию. Далее отметить галочкой вкладку Developer:
После этого в вашей ленте появится соответствующая вкладка:
Выбрав “Visual Basic” вы откроете окно для создания форм, модулей и пр.
Создаем форму для вставки Progress Bar
Создаем новую форму:
(давно я не работал с формочками :)
Вставка и удаление ProgressBar
Добавляем парочку соответстующих функций…
Вставка ProgressBar
Здесь мы, кстати, уже можем работать с секциями слайдов, которые появились в Office 2010.
Sub AddProgressBars(ByVal SlidesColor As String, ByVal SectionsColor As String)
Dim X As Long
Dim LastSection As Long
Dim CurrentSection As Long
Dim Left As Double
Dim Top As Double
Dim Height As Double
Dim progressBar As Shape
LastSection = 0
Left = 0
Height = 6
Top = ActivePresentation.PageSetup.SlideHeight - Height
RemoveProgressBars
With ActivePresentation
For X = 2 To .Slides.Count
Set progressBar = .Slides(X).Shapes.AddShape(msoShapeRectangle, _
Left, Top, _
((X - 1) * .PageSetup.SlideWidth) / (.Slides.Count - 1), Height)
With progressBar
.Fill.ForeColor.RGB = SlidesColor
.Line.Visible = msoFalse
.Name = "SlidesProgressBar"
End With
CurrentSection = .Slides(X).sectionIndex
If (CurrentSection > LastSection) Then
Set sectionBar = .Slides(X).Shapes.AddShape(msoShapeRectangle, _
((X - 2) * .PageSetup.SlideWidth) / (.Slides.Count - 1), Top, _
((1) * .PageSetup.SlideWidth) / (.Slides.Count - 1), Height)
With sectionBar
.Fill.ForeColor.RGB = SectionsColor
.Line.Visible = msoFalse
.Name = "SectionProgressBar"
End With
LastSection = CurrentSection
End If
Next X
End With
End Sub
Удаление ProgressBar
Sub RemoveProgressBars()
Dim X As Long
On Error Resume Next
For X = 1 To ActivePresentation.Slides.Count
ActivePresentation.Slides(X).Shapes("SlidesProgressBar").Delete
ActivePresentation.Slides(X).Shapes("SectionProgressBar").Delete
Next X
End Sub
События на форме и обработка цвета
Добавляем события на нажатия кнопок:
Private Sub ClearButton_Click()
RemoveProgressBars
End Sub
Private Sub InsertButton_Click()
Dim SlidesColor As String
Dim SectionsColor As String
SlidesColor = HEX2RGB(SlidesColorTextBox.Text)
SectionsColor = HEX2RGB(SectionsColorTextBox.Text)
AddProgressBars SlidesColor, SectionsColor
End Sub
Здесь используется функция HEX2RGB для преобразования описания цвета в виде строки “#FFCC99” в формат, принимаемый для обозначения цвета фигур:
Private Function HEX2RGB(ByVal HexColor As String) As String
Dim Red As String
Dim Green As String
Dim Blue As String
Dim Color As String
Color = Replace(HexColor, "#", "")
Red = Val("&H" & Mid(Color, 1, 2))
Green = Val("&H" & Mid(Color, 3, 2))
Blue = Val("&H" & Mid(Color, 5, 2))
HEX2RGB = RGB(Red, Green, Blue)
End Function
Вызов формы
Для вызова формы нужно добавить небольшой модуль со скриптом вызова формы для SlidesProgressBar:
Sub ShowSlidesProgressBarDialog()
SlidesProgressBarForm.Show
End Sub
Добавление вызова формы на ribbon-ленту
Чтобы добавить вызов нашей формы на ленту нужно через то же самое меню кастомизации ленты выбрать в списке источников макросы (Macros) и соответствующую функцию, а в списке табов создать собственную секцию.
После этого нажать Add, чтобы добавить команду. Там же можно переименовать и поменять иконку.
Результат
В результате мы имеем новую кнопку и соответствующую формочку, вставляющую внизу слайдов прогресс бар, учитывающий секции
Презентация с включенными готовыми макросами в приложении.
Comments
Anonymous
May 05, 2010
А зачем нужен прогресс на слайдах?Anonymous
May 05, 2010
Чтобы зрители имели ощущение контроля времени (понимали, где мы сейчас находимся по зоду презентации, сколько еще осталось). Вместе с тем, визуальный прогресс-бар, имхо, лучше чем цифры номера слайда/количества слайдов.Anonymous
November 13, 2010
мне понравилось :) только мне кажется что линия должны идти линейно. если у меня одна секция в один слайд и одна в 50, то она не должна сразу перескакивать это может помочь в оценке времени по ходу доклада.