Использование переменных внутри методов .Slides & .Shapes в Powerpoint VBA - PullRequest
0 голосов
/ 21 апреля 2019

Я работаю над интерактивной презентацией Powerpoint, где пользователь нажимает на миниатюру фотографии и может просматривать ее почти на весь экран. У меня трудности с методами .Shapes и .Slides.

Я хочу, чтобы несколько небольших изображений отображались на одном слайде в презентации. Если пользователь хочет увидеть его очень большим, ему просто нужно нажать на изображение. Затем я хотел бы, чтобы изображение появилось на его новом сгенерированном слайде, настолько большом, насколько оно может поместиться на этом слайде. Когда они нажимают на большее изображение, они возвращаются к меньшему слайду изображений, который они просматривали. Этого достаточно легко добиться, создав отдельный слайд полноразмерного изображения для каждого маленького изображения в шоу и просто вызывая большой номер слайда при нажатии на маленькое изображение; однако это отнимает много времени и делает презентацию намного больше, чем нужно. Если пользователь никогда не нажимает, чтобы увидеть увеличенное изображение, то страница с большим изображением занимает место. Я решил выполнить код VBA при нажатии на изображение, которое должно:

  1. скопировать изображение

  2. создать новый слайд после последнего слайда в презентации

  3. вставить изображение в новый слайд

  4. изменить размер изображения настолько большим, насколько оно может уместиться на экране
  5. просмотреть новый слайд с увеличенным изображением
  6. отправить пользователя обратно на слайд они начали.

Код:

Sub ViewFullSize()

    Dim pptNewSlide As Slide
    ' Dim objCurrentSlideIndex As Integer

    ' objCurrentSlideIndex = ActiveWindow.Selection.SlideRange.SlideIndex

    With ActivePresentation

        .Slides(2).Shapes("Picture 7").Copy

        .Slides(4).Shapes.Paste

    End With


    Set pptNewSlide = ActivePresentation.Slides.Add(ActivePresentation.Slides.Count + 1, ppLayoutCustom)

    ActivePresentation.SlideShowWindow.view.Last

End Sub

Этот код выполняется и выполняет то, что ожидается. Моя проблема в том, что мне нужно, чтобы номера слайдов и номера фигур были переменными. Я не хочу переписывать этот фрагмент кода для сотен фотографий, на которые можно нажать. Я пытался сделать текущий слайд переменной как это:

    Dim objCurrentSlideIndex As Integer
    objCurrentSlideIndex = ActiveWindow.Selection.SlideRange.SlideIndex
    With ActivePresentation
        .Slides(objCurrentSlideIndex).Shapes("Picture 7").Copy
        .Slides(4).Shapes.Paste`
    End With

Переменная, которую я пробовал .Slides(objCurrentSlideIndex), приводит к тому, что вся подпрограмма не выполняется, но не приводит к аварийному завершению слайд-шоу. Я использовал Set и множество других синтаксисов и не могу заставить его использовать переменную вместо простого числа. Есть ли способ сделать это? Могут ли методы .Slides() и .Shapes() использовать переменные? Я прочитал несколько страниц Microsoft и PPTools, но не могу найти примеров использования переменных.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Полностью рабочий код!

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

Он был разработан для назначенияМакро Действие для фотографий в слайд-шоу.Когда на странице есть несколько изображений меньшего размера, каждому из них может быть назначен один макрос, который будет отображать полноэкранное изображение на собственном слайде, а затем отправлять пользователя обратно на экран, на котором он находился и который содержит изображения меньшего размера.Это что-то вроде полноэкранного масштабирования.

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

Это не относится к моей машине или путям или что-то в этом роде.Вы можете просто скопировать и вставить в модуль в PowerPoint и начать назначать новый макрос для любых изображений в вашей презентации.

Sub ViewFullSize(objCurrentShape As Shape) ' Place shape clicked-on into variable.
 ' Credit Shyam Pillai @ http://www.skphub.com/ppt00040.htm#2 for the method of
 ' bringing the shape into the macro as a variable allowing easier manipulation.

    Dim pptNewSlide As Slide
    Dim objCurrentSlideNum As Integer
    Dim objLastSlideNum As Integer
    Dim objLargeView As Shape

' Place current slide number into a variable.
    objCurrentSlideNum = ActivePresentation.SlideShowWindow.view.CurrentShowPosition

' Copy shape to clipboard for later pasting.
    ActivePresentation.Slides(objCurrentSlideNum).Shapes(objCurrentShape.Name).Copy

' Place new blank slide at the end of the presentation.
    Set pptNewSlide = ActivePresentation.Slides.Add(ActivePresentation.Slides.Count + 1, ppLayoutBlank)

' Make the new slide the active slide.
    ActivePresentation.SlideShowWindow.view.Last

' Place the new slide number into a variable.
    objLastSlideNum = ActivePresentation.SlideShowWindow.view.CurrentShowPosition

' Paste the shape image from the clipboard onto the new slide.
    ActivePresentation.Slides(objLastSlideNum).Shapes.Paste

' Put pasted image into a variable.
    Set objLargeView = ActivePresentation.Slides(objLastSlideNum).Shapes(1)

' Full credit for this next section of the code goes to PPTools & David Marcovitz
' @ http://www.pptfaq.com/FAQ00352_Batch_Insert_a_folder_full_of_pictures-_one_per_slide.htm
' Thanks for the hard work!

' Manipulate the image using the variable.
    With objLargeView
      ' Set mouse-click action on image to return user back to the slide they came from.
        .ActionSettings(ppMouseClick).Action = ppActionLastSlideViewed
      ' Reposition the image for proper resizing
        .Left = 0
        .Top = 0
        .ScaleHeight 1, msoTrue
        .ScaleWidth 1, msoTrue
      ' Resize the image to full screen while maintaining aspect ratio.
      ' This is wide screen mode.  If you are working with the more
      ' narrow mode, simply change the 9 to a 3 and the 16 to a 4
      ' to keep the correct aspect ratio.
        If 9 * .Width > 16 * .Height Then
            .Width = ActivePresentation.PageSetup.SlideWidth
            .Top = 0.5 * (ActivePresentation.PageSetup.SlideHeight - .Height)
        Else
            .Height = ActivePresentation.PageSetup.SlideHeight
            .Left = 0.5 * (ActivePresentation.PageSetup.SlideWidth - .Width)
        End If
    End With
' From here, the slideshow is now showing the originally clicked-on image
' full screen on its own page waiting for the user to click on it to return
' to the rest of the show.  If the slideshow isn't set to kiosk mode, then
' there is the possibility of the user clicking somewhere on the screen out
' of the picture area and it would end the slideshow.
End Sub
0 голосов
/ 21 апреля 2019
Sub ViewFullSize(objCurrentShape As Shape) ' Place shape clicked on into variable.

    Dim pptNewSlide As Slide
    Dim objCurrentSlideNum As Integer
    Dim objLastSlideNum As Integer

' Place current slide number into a variable.
    objCurrentSlideNum = ActivePresentation.SlideShowWindow.view.CurrentShowPosition

' Send shape to clipboard for later pasting.
    ActivePresentation.Slides(objCurrentSlideNum).Shapes(objCurrentShape.Name).Copy

' Place new blank slide at the end of the presentation.
    Set pptNewSlide = ActivePresentation.Slides.Add(ActivePresentation.Slides.Count + 1, ppLayoutCustom)

' Make the new slide the active slide.
    ActivePresentation.SlideShowWindow.view.Last

' Place the new slide number into a variable.
    objLastSlideNum = ActivePresentation.SlideShowWindow.view.CurrentShowPosition

' Paste the shape image from the clipboard onto the new slide.
    ActivePresentation.Slides(objLastSlideNum).Shapes.Paste

End Sub

Я наткнулся на фрагмент кода, который показывает, что при нажатии на фигуру она может передавать свои идентификаторы непосредственно в подпрограмму и назначаться переменной.В моем случае (objCurrentShape As Shape).Затем его можно использовать с методом .Shapes(), который я использовал для вызова формы для копирования .Shapes(objCurrentShape.Name).Copy.

Метод .Slides() проще было присвоить переменной (или, я так полагаю), потому что онне зависит от того, какая форма была нажата.Это просто номер активного слайда, который был получен с помощью функции .View.CurrentShowPosition.

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

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