【问题标题】:VBA For each - loop orderVBA 对于每个 - 循环顺序
【发布时间】:2018-10-09 22:42:18
【问题描述】:

在 VBA 中,可以循环遍历形状。例如:

For Each shp In slide.Shapes
 shp.top=0
Next

问题是,使用哪个参数来确定循环的顺序以及如何设置这个参数?

【问题讨论】:

    标签: vba for-loop each shape


    【解决方案1】:

    在 OP 澄清他需要从最高到最低循环遍历形状后编辑

    您可以使用SortedList 对象使用Shape Top 属性作为SortedList 键和Shape 对象本身作为其对应的值:

    Sub Main()
        Dim shp As Shape
        Dim j As Long
    
        With CreateObject("System.Collections.SortedList")
            For Each shp In slide.Shapes
                .Add shp.Top, shp
            Next
    
            For j = 0 To .Count - 1 'list shapes from the highest to the lowest
                MsgBox .GetByIndex(j).Name & " - " & .getkey(j)
            Next
    
        End With
    End Sub
    

    【讨论】:

    • 在 Cymro,我的回答是“很可能是它们的出现顺序”,我可以从我的一些测试中证明这一点。也许我应该指定 出现顺序 我的意思是它们被创建的顺序
    • @Cymro,查看编辑后的答案以从最高形状循环到最低形状
    • 好吧,句柄已经在答案中,即:.GetByIndex(j)。所以你可以输入: For j=0 to .count - 1 : MakeBold .GetByIndex(j) : next。您可以考虑将答案标记为已接受,谢谢
    • 如果有 2 个对象具有相同的垂直位置,您的代码将失败,并显示此错误“项目已添加。在字典中键入:'XX' 正在添加键 'XX'”。任何帮助将不胜感激。
    【解决方案2】:

    我在微软网站上找到了答案:

    Shape.ZOrderPosition Property (PowerPoint)

    网站说“形状在 z 顺序中的位置对应于形状在 Shapes 集合中的索引号。”。

    然后我做了一个简短的排序例程,根据形状的 .top 参数设置 z 顺序位置:

    For i = 2 To sld.Shapes.Count
      If sld.Shapes(i).Top < sld.Shapes(i - 1).Top _ 
      and sld.Shapes(i).ZOrderPosition > sld.Shapes(i - 1).ZOrderPosition Then_
      sld.Shapes(i).ZOrder msoSendBackward
    Next i
    

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 2016-02-26
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多