Powerpoint VBA,For Each循环期间的形状删除会跳过下一项

Vin*_*kde 1 excel powerpoint vba powerpoint-vba

我正在浏览Powerpoint幻灯片1中的形状

当名称为“ HD”的形状被删除时,下一个形状将变为“ SD”,跳过“ 4K”。如果删除了“ 4K”,则下一个形状变为“ FullHD”

如何避免这种情况?

For Each pshape In ppres.Slides(1).Shapes
    Select Case pshape.Name
        Case "HD"
            Debug.Print vbTab & pshape.Name
            If LCase(Cells(2, titleHeader.ListColumns("Nature of Material*").Index)) <> "hd" And LCase(Cells(2, titleHeader.ListColumns("Nature of Material*").Index)) = "" Then
                pshape.Delete
            End If
        Case "4K"
            Debug.Print vbTab & pshape.Name
            If LCase(Cells(2, titleHeader.ListColumns("Nature of Material*").Index)) <> "4k" And LCase(Cells(2, titleHeader.ListColumns("Nature of Material*").Index)) = "" Then
                pshape.Delete
            End If
        Case "SD"
            Debug.Print vbTab & pshape.Name
        Case "FullHD"
            Debug.Print vbTab & pshape.Name
            Debug.Print vbTab & Cells(2, titleHeader.ListColumns("FullHD").Index)
    End Select
Next
Run Code Online (Sandbox Code Playgroud)

更新1:尝试过(不起作用) 这里可能是什么问题?

Dim countShape as Long
Dim i as Long
countShape = ppres.Slides(1).Shapes.count
For i = 1 to countShape
    Select Case pshape.Name
        Case "HD"
            Debug.Print vbTab & pshape.Name
            pshape.Delete
            i = i - 1
            countShape = countShape - 1
        Case "4K"
            Debug.Print vbTab & pshape.Name
            pshape.Delete
            i = i - 1
            countShape = countShape - 1
        Case "SD"
            Debug.Print vbTab & pshape.Name
        Case "FullHD"
            Debug.Print vbTab & pshape.Name
    End Select
Next i
Run Code Online (Sandbox Code Playgroud)

整数超出范围错误即将到来。我认为countShape不会更新其值。

Dom*_*nic 5

您需要按索引从头到尾循环遍历形状...

Dim i As Long

With ppres.Slides(1).Shapes
    For i = .Count To 1 Step -1
        Select Case .Item(i).Name
            'etc
            '
            '
        End Select
    Next i
End With
Run Code Online (Sandbox Code Playgroud)

  • 是的,它会从集合中的最后一个形状到第一个形状向后循环。 (3认同)
  • @ Marcucciboy2是的,正如Domenic所述。但是,如果您反向循环并删除形状42,则它不会更改形状41和更低形状的索引,而如果您向前循环并删除形状42,则形状43已变为42,但是您需要检查接下来是形状43,然后看看形状44是什么。您将跳过内容。 (3认同)
  • @ Marcucciboy2想象一下“对于每个”作为一个从1开始计数的循环,当您删除第一个时,其他的将被重新索引。 (2认同)