【问题标题】:Powerpoint VBA: Loop to make textboxes visible gets issues when adding bring to frontPowerpoint VBA:循环以使文本框可见在添加前置时出现问题
【发布时间】:2014-07-25 04:17:50
【问题描述】:

所以我编写了以下代码,以使演示文稿中的文本框可见,然后将它们带到前面(通过单独的宏使它们不可见):

Dim oSld As Slide
Dim oShp As Shape
Dim oPPT As Presentation

For Each oSld In ActivePresentation.Slides
For Each oShp In oSld.Shapes

If oShp.Type = msoTextBox Then
        oShp.Visible = True
        oShp.ZOrder msoBringToFront
End If

Next oShp
Next oSld

在我添加“带到前面”命令之前,它运行良好!现在只有大约一半的形状在代码运行时可见。我一直在网上阅读,似乎 ZOrder 改变了形状的数量,这就是为什么只有一些是可见的......但无法解决它!非常感谢您的帮助!

【问题讨论】:

    标签: vba loops powerpoint


    【解决方案1】:

    您已经找到了原因。 For Each/Next 循环似乎在它开始时拍摄形状顺序的快照。如果您更改形状顺序或删除循环主体中的形状,它会抛出一些东西。相反,请尝试以下(未经测试的)(空气)代码来构建对形状的引用数组,然后从数组中一次处理一个:

    Dim aShapeArray() as Shape
    Dim x as Long
    ReDim aShapeArray(1 to oSld.Shapes.Count) as Shape
    
    ' Build an array of shapes
    For Each oShp In oSld.Shapes
      Set aShapeArray(x) = oShp
      x = x+1
    Next
    
    ' Then do what you need to do with each shape in the array
    For x = 1 to Ubound(aShapeArray)
    Set oShp = aShapeArray(x)
    If oShp.Type = msoTextBox Then
            oShp.Visible = True
            oShp.ZOrder msoBringToFront
    End If
    Next
    

    【讨论】:

    • 嗨史蒂夫,感谢您的建议!我已经尝试过了,但它突出显示 .Count 出现编译错误:需要常量表达式。你有什么建议吗?
    • 查看编辑版本;现在创建一个动态数组,然后根据需要重新调整它。
    • 感谢您的帮助!我设法调整了一些位并让它工作!
    【解决方案2】:

    感谢您的所有帮助@SteveRindsberg,对您的代码进行了一些调整,我破解了它:)

    Dim oSld As Slide
    Dim aShapeArray() 
    Dim x As Long
    
    
    For Each oSld In ActivePresentation.Slides
    x = 1
    If oSld.Shapes.Count > 0 Then
    ReDim aShapeArray(1 To oSld.Shapes.Count)
    
    ' Build an array of shapes
    For Each oShp In oSld.Shapes
      Set aShapeArray(x) = oShp
      x = x + 1
    Next
    
    
    ' Then do what you need to do with each shape in the array
    For x = 1 To UBound(aShapeArray)
    Set oShp = aShapeArray(x)
          If oShp.Type = msoTextBox Then
            oShp.Visible = True
            oShp.ZOrder msoBringToFront
          End If
    Next
    End If
    
    Next
    

    【讨论】:

    • 只是一个小小的修正:形状类型可以是 TextBox 或 PlaceHolder。我相应地更改了代码示例。
    • feeelix 的代码包含一个小错误。测试 Shape 对象类型的行也应该让 msoPlaceholder 形状通过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2017-10-21
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2017-07-07
    相关资源
    最近更新 更多