【问题标题】:Group shapes in same height across multiple rows in Powerpoint using VBA使用 VBA 在 Powerpoint 中的多行中以相同高度对形状进行分组
【发布时间】:2017-10-20 22:20:56
【问题描述】:

我想在 PPT 中创建一个 VBA 宏,以便使用 VBA 在 Powerpoint 中跨多行以相同高度对形状进行分组。理想情况下,我的第一步应该是这样的图像: Group Textboxes row wise

在垂直和水平方向均匀分布的许多行和列中有一个文本框矩阵。我想完全选择所有形状并运行一个宏来将文本框按行分组为多行。下面的代码是复制的,还不是最终的,感谢任何帮助,sn-ps,非常感谢。

Sub GroupSameHeightObjects()

  ' Dimension the variables.
  Dim shapeObject As shape
  Dim lSlideNumber As Long
  Dim strPrompt, strTitle As String
  Dim ShapeList() As String
  Dim count As Long

  ' Initialize the counter.
  count = 0

  ' Make sure PowerPoint is in slide view.
  If ActiveWindow.ViewType <> ppViewSlide Then

     ' Set up the error message.
     strPrompt = "You must be in slide view to run this macro." _
        & " Change to slide view and run the macro again."
     strTitle = "Not In Slide View"

     ' Display the error message.
     MsgBox strPrompt, vbExclamation, strTitle

     ' Stop the macro.
     End

  End If

  ' Get the current slide number.
  lSlideNumber = ActiveWindow.Selection.SlideRange.SlideNumber

  ' Loop through the shapes on the slide.
  For Each shapeObject In _
     ActivePresentation.Slides(lSlideNumber).Shapes

     ' See whether shape is a placeholder.
     If shapeObject.Type <> msoPlaceholder Then

        ' Increment count if the shape is not a placeholder.
        count = count + 1

        ' Get the name of the shape and store it in the ShapeList
        ' array.
        ReDim Preserve ShapeList(1 To count)
        ShapeList(count) = shapeObject.Name

     End If

  Next shapeObject

  ' If more than 1 object (excluding a placeholder object) is found,
  ' group the objects.
  If count > 1 Then
     With ActivePresentation.Slides(lSlideNumber).Shapes

        ' Group the shapes together.
        .Range(ShapeList()).Group.Select
     End With
  Else

     Select Case count

        ' One shape found.
        Case 1

           ' Set up the message.
           strPrompt = "Only one shape found." _
              & " You need at least two shapes to group."
           strTitle = "One Shape Available"

        ' Zero shapes found.
        Case 0

           ' Set up the message.
           strPrompt = "No shapes found. You need to have at " _
              & "least two shapes, excluding placeholders."
           strTitle = "No Shapes Available"

        ' An error occurred.
        Case Else

           ' Set up the message.
           strPrompt = "The macro found an error it could not correct."
           strTitle = "Error"

     End Select

     ' Display the message.
     MsgBox strPrompt, vbExclamation, strTitle

  End If

End Sub

【问题讨论】:

  • 只是对您的代码的注释(这不能解决您的问题):确保您知道EndExit Sub 之间的区别。 End 实际上会立即结束 all 宏,但 Exit Sub 的行为就像跳转到当前过程的末尾并退出当前子而不影响任何其他代码(这可能是您想要的) .

标签: vba powerpoint


【解决方案1】:

有几件事可能无法完全满足您的需求,但可以为您省去一些麻烦:

   Sub GroupSameHeightObjects()

  ' Dimension the variables.
  Dim shapeObject As shape
  Dim lSlideNumber As Long

  ' This will dim strPrompt as a variant
  ' Dim strPrompt, strTitle As String
  Dim strPrompt as string, strTitle as string

  Dim ShapeList() As String
  Dim count As Long

  ' Initialize the counter.
  count = 0

  ' Make sure PowerPoint is in slide view.
  If ActiveWindow.ViewType <> ppViewSlide Then

     ' Set up the error message.
     strPrompt = "You must be in slide view to run this macro." _
        & " Change to slide view and run the macro again."
     strTitle = "Not In Slide View"

     ' Display the error message.
     MsgBox strPrompt, vbExclamation, strTitle

     ' Stop the macro.
     ' See previous comment
     'End
     Exit Sub

  End If

  ' Get the current slide number.
  ' Nope, you want the SlideIndex; SlideNumber gives you the number that'll
  ' appear when you use PPT's slide numbering features; if the user sets the 
  ' starting number to something other than 1, your code will break
  'lSlideNumber = ActiveWindow.Selection.SlideRange.SlideNumber
   lSlideNumber = ActiveWindow.Selection.SlideRange.SlideIndex

  ' Loop through the shapes on the slide.
  For Each shapeObject In _
     ActivePresentation.Slides(lSlideNumber).Shapes

     ' See whether shape is a placeholder.
     If shapeObject.Type <> msoPlaceholder Then

        ' Increment count if the shape is not a placeholder.
        count = count + 1

        ' Get the name of the shape and store it in the ShapeList
        ' array.
        ' I've learned not to trust shape names in PPT
        ' I'd dim ShapeList as an array of shapes and then
        ' Set ShapeList(count) = shapeObject
        ReDim Preserve ShapeList(1 To count)
        ShapeList(count) = shapeObject.Name

     End If

  Next shapeObject

' You could include this next bit in the following Case selector,
' Case > 1 ... etc.    
      ' If more than 1 object (excluding a placeholder object) is found,
      ' group the objects.
      If count > 1 Then
         With ActivePresentation.Slides(lSlideNumber).Shapes

        ' Group the shapes together.
        .Range(ShapeList()).Group.Select
     End With
  Else

     Select Case count

        ' One shape found.
        Case 1

           ' Set up the message.
           strPrompt = "Only one shape found." _
              & " You need at least two shapes to group."
           strTitle = "One Shape Available"

        ' Zero shapes found.
        Case 0

           ' Set up the message.
           strPrompt = "No shapes found. You need to have at " _
              & "least two shapes, excluding placeholders."
           strTitle = "No Shapes Available"

        ' An error occurred.
        Case Else

           ' Set up the message.
           strPrompt = "The macro found an error it could not correct."
           strTitle = "Error"

     End Select

     ' Display the message.
     MsgBox strPrompt, vbExclamation, strTitle

  End If

End Sub

【讨论】:

  • 嗨史蒂夫,这是一个很好的收获,谢谢。我很荣幸能得到你的建议。您能否为此目的提供代码的核心部分。理想情况下,我想在幻灯片中选择一个形状矩阵,在该选择中,只有具有相同顶部值的形状必须单独分组到多行中。非常感谢,这是一个很大的帮助,我在这个路口僵持了好几天。
【解决方案2】:

我现在没有时间编写/测试任何代码,但如果我必须这样做,我会从另一个项目中得到的类似 sn-p 的东西开始:

Sub GroupCertainShapes()

    Dim x As Long
    Dim sTemp As String
    Dim aShapeList() As String
    Dim lShapeCount As Long

    With ActivePresentation.Slides(1)
        ' iterate through all shapes on the slide
        ' to get a count of shapes that meet our condition
        For x = 1 To .Shapes.Count
            ' Does the shape meet our condition? count it.
            If .Shapes(x).Type = msoAutoShape Then
                lShapeCount = lShapeCount + 1
            End If
        Next

        ' now we know how many elements to include in our array,
        ' so redim it:
        ReDim aShapeList(1 To lShapeCount)

        ' Reset the shape counter
        lShapeCount = 0

        ' Now add the shapes that meet our condition
        ' to the array:
        For x = 1 To .Shapes.Count
            ' apply some criterion for including the shape or not
            If .Shapes(x).Type = msoAutoShape Then
                lShapeCount = lShapeCount + 1
                aShapeList(lShapeCount) = .Shapes(x).Name
            End If
        Next

        ' and finally form a group from the shapes in the array:
        If UBound(aShapeList) > 0 Then
            .Shapes.Range(aShapeList).Group
        End If

    End With
End Sub

【讨论】:

  • aShapeList(lShapeCount) = .Shapes(x).Name 在这一行,有没有办法在不使用其名称的情况下获取形状,因为在我的选择中有多个具有相同名称的形状,像 id 这样的参数可以提供帮助。
  • 如果您可以选择多个同名的形状,则您的幻灯片已损坏;通常 PPT 不允许这样做,但有时它会自己创建它们;一个错误。在开始工作之前,您可能需要纠正这种情况。将形状重命名为例如原始名称 --> 原始名称_1、-2 等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多