Добавление кода события для флажка в PowerPoint VBA

Я разрабатываю колоду PowerPoint 2010, которая представляет пользователю серию страниц, содержащих один оператор, один флажок (созданный из элемента метки, позволяющий изменять размер флажка) и стрелки вперед / назад на каждой странице.

Поскольку это будет использоваться во многих проектах с различным количеством страниц, я динамически создаю «колоду» с помощью PowerPoint VBA для динамического построения страниц из электронной таблицы Excel, содержащей список отдельных утверждений.

Мне удалось написать код VBA, чтобы открыть файл Excel, прочитать операторы в массиве в PowerPoint и построить соответствующее количество страниц со всеми элементами на странице. На данный момент все работает нормально. У меня возникают трудности с назначением действия щелчка для флажка.

Вот код, который вызывается процедурой построения страницы для вставки флажка (очевидно, что до этого есть дополнительный код для доступа к файлу Excel, создания страниц и добавления текстовых полей «утверждения» ... все это работает) :

Sub AddSelectBox(Index As Integer, pptBuildingSlide As Slide)

'Add Checkbox
    With pptBuildingSlide.Shapes.AddOLEObject(Left:=342, Top:=294, Width:=42, Height:=42, ClassName:="Forms.Label.1")
        .Name = "label" & Index
        .OLEFormat.Object.Font.Name = "Wingdings 2"
        .OLEFormat.Object.Font.Charset = "2"
        .OLEFormat.Object.Caption = "£"
        .OLEFormat.Object.Font.Size = 40
    End With

'Add Checkbox Click Code
'(CODE FOR ADDING CLICK EVENT TO EACH BOX GOES HERE)

End Sub

Флажок на каждой странице имеет незаметное имя, привязанное к номеру страницы (например, Label1, Label2 и т. Д.). Мне нужно добавить следующий код к каждому флажку на каждой странице, чтобы переключить флажок, чтобы позже в программе я мог видеть, какие из них были проверены, путем чтения атрибутов «заголовок». (Для шрифта установлено значение «Wingdings 2», чтобы отображалось пустое поле и флажок при нажатии)

Private Sub Label1_Click()

   If Label1.Caption = "£" Then
       Label1.Caption = "R"
   Else
       Label1.Caption = "£"
   End If

End Sub

Я поискал в Интернете какие-либо ссылки для динамического добавления кода события и нашел ряд примеров (например, Назначить функцию VBA при нажатии динамически создаваемой кнопке в Excel Userform), но почти все они предназначены для Excel или Access. Я должен отметить, что кодирование - «не моя повседневная работа», и мне удалось так далеко зайти, прочитав «Освоение VBA для Office 2003» и поиск в Интернете… так что моя способность переводить эти примеры в PowerPoint оказалась недостаточной. Спасибо за любую помощь, которую вы можете предложить.

5/29 Дополнительная информация:
Я наткнулся на метод .CreateEventProc как на способ написания кода на VBA. Пример, который я нашел, был написан для Excel на этом сайте. Я дошел до этого (код окна сообщения будет заменен кодом щелчка, но я просто использовал его для тестирования, чтобы избежать других ошибок) ...

Sub CreateEventProcedure()
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule
    Dim LineNum As Long
    Const DQUOTE = """" ' one " character

    Set VBProj = ActivePresentation.VBProject
    Set VBComp = VBProj.VBComponents(Slides(1))
    Set CodeMod = VBComp.CodeModule

    With CodeMod
        LineNum = .CreateEventProc("Click", "Label1")
        LineNum = LineNum + 1
        .InsertLines LineNum, "    MsgBox " & DQUOTE & "Hello World" & DQUOTE
    End With
End Sub

... но получите сообщение «Ошибка компиляции: подпрограмма или функция не определена» на (slides(1)). Любая помощь в его очистке (если это на самом деле подходящее решение) будет оценена.


person agoltz    schedule 26.05.2015    source источник
comment
Я думаю, вам нужно изменить `ClassName: = Forms.Label.1` на` ClassName: = Forms.CheckBox.1`, когда вы создаете форму. Если вы использовали обычную фигуру, вы могли бы присоединить имя макроса к свойству OnAction. Вы должны добавить макрос в колоду во время разработки и установить строку OnAction на что-то вроде .OnAction="NameOfDeck!NameOfMacro".   -  person ChipsLetten    schedule 27.05.2015
comment
Спасибо. Я использую Label.1 вместо CheckBox.1, потому что мне нужно, чтобы флажок был больше, чем стандартный объект CheckBox, размер которого нельзя изменить. Я могу переключить поле, введя код Label1_Click( ) вручную в метку на каждой странице после того, как они созданы VBA, но не могу понять, как заставить VBA добавлять код программно на лету. Стоит ли использовать метод OnAction, который вы описываете, для этого подхода?   -  person agoltz    schedule 27.05.2015


Ответы (1)


Вы должны использовать этикетку? (Я понимаю размер, но вы можете добавить форму, что было бы проще.)

Что-то на основе: это может работать только в том случае, если вы разрешаете доступ к VBE в безопасности (не может быть выполнено в коде)

    Sub makeBox()
Dim strCode As String
With ActivePresentation.Slides(1).Shapes.AddShape(msoShapeRectangle, 10, 10, 20, 20)
.Fill.Visible = False
.Line.Visible = False
With .TextFrame.TextRange.Font
.Name = "Wingdings 2"
.Size = 40
.Color.RGB = vbBlack
End With
.TextFrame.TextRange = "£"
With .ActionSettings(ppMouseClick)
.Action = ppActionRunMacro
.Run = "chex"
End With
End With
strCode = "Sub chex(oshp As Shape)" & vbCrLf & "If oshp.TextFrame.TextRange =" & Chr(34) & "£" & Chr(34) & "Then" _
& vbCrLf & "oshp.TextFrame.TextRange = " & Chr(34) & "R" & Chr(34) & vbCrLf _
& "Else" & vbCrLf & "oshp.TextFrame.TextRange =" & Chr(34) & "£" & Chr(34) & vbCrLf & "End If" & vbCrLf & "End Sub"
With ActivePresentation.VBProject.VBComponents.Add(vbext_ct_StdModule)
.CodeModule.AddFromString (strCode)
End With
End Sub
person John Wilson    schedule 27.05.2015
comment
Спасибо, Джон. Прогоните код в чистой презентации, поскольку он, похоже, не зависит ни от одного из моих кодов. Получена ошибка компиляции: переменная не определена на .Add(vbext_ct_StdModule). Закомментировал последний раздел кода With ..., и код запускается, рисует поле, но не действие onClick (вероятно, закомментировал волшебство). - person agoltz; 28.05.2015
comment
Простой поиск в Google показывает, что вам нужно добавить ссылку на Microsoft Visual Basic for Applications Extensibility 5.3. Взято с сайта http://www.cpearson.com/excel/vbe.aspx: VBIDE - это библиотека объектов, которая определяет все объекты и значения, составляющие VBProject и редактор Visual Basic. Чтобы добавить эту ссылку, откройте редактор VBA, откройте свой VBProject в редакторе и перейдите в меню «Инструменты». Там выберите Ссылки. В диалоговом окне «Ссылки» прокрутите вниз до Microsoft Visual Basic for Applications Extensibility 5.3 и отметьте этот элемент. - person ChipsLetten; 28.05.2015
comment
ChipsLetten - Обнаружил ссылку вчера вечером при исследовании .CreateEventProc. Код Джона теперь работает. - person agoltz; 29.05.2015
comment
@John Wilson Спасибо! Я бы проголосовал за ваш ответ, но набрал недостаточно очков. Проголосуйте за меня! Если у вас есть вторая, не могли бы вы взглянуть на дополнительную информацию, которую я добавил в OP. Если у вас есть опыт работы с .CreateEventProc, мы будем очень признательны. - person agoltz; 29.05.2015