使用VBA将MS PowerPoint中的现有图像替换为新图像

使用VBA将MS PowerPoint中的现有图像替换为新图像,vba,excel,powerpoint,Vba,Excel,Powerpoint,我正在更新MS PowerPoint,方法是使用VBA将图像粘贴到不同的幻灯片上 代码的其余部分工作正常。我无法做的是删除所有幻灯片上的现有图像并粘贴新图像。当前它将新图像粘贴到旧图像的顶部,但旧图像仍保留。我正在使用以下代码: Dim pptApp As PowerPoint.Application Set pptApp = CreateObject("PowerPoint.Application") pptApp.Visible = msoTrue xlApp.Worksheets(2

我正在更新MS PowerPoint,方法是使用VBA将图像粘贴到不同的幻灯片上

代码的其余部分工作正常。我无法做的是删除所有幻灯片上的现有图像并粘贴新图像。当前它将新图像粘贴到旧图像的顶部,但旧图像仍保留。我正在使用以下代码:

Dim pptApp  As PowerPoint.Application
Set pptApp = CreateObject("PowerPoint.Application")

pptApp.Visible = msoTrue

xlApp.Worksheets(2).Range("M2:S12").Copy
Set shp1 = ActivePresentation.Slides(17).Shapes.PasteSpecial(ppPasteEnhancedMetafile)(1)

With shp1
    .Left = 370
    .Top = 100
    .Height = 360
    .Width = 340
End With    

作为VBA的新手,我不知道在上面的代码中在哪里以及如何添加delete命令。任何形式的帮助都将不胜感激。

Edit1:正如Steve所指出的,第一个发布的解决方案是不可靠的;这也得到了道格的证实

要使用loop删除所有图片,请采用Steve在其帖子中解释的方法。
现在,如果您只想删除所有图片,可以尝试以下操作:

ActivePresentation.Slides(17).Shapes.Range.Delete
但这会删除所有形状,不仅是图片,还有文本框、线条、形状等。
要仅删除图片,下面是使用循环的另一种方法

Dim s As Shape, pictodel As Variant
For Each s In ActivePresentation.Slides(17).Shapes
    If s.Type = 13 Then
        If IsArray(pictodel) Then
            ReDim Preserve pictodel(UBound(pictodel) + 1)
            pictodel(UBound(pictodel)) = s.Name
        Else
            pictodel = Array(s.Name)
        End If
    End If
Next
ActivePresentation.Slides(17).Shapes.Range(pictodel).Delete
希望这能有所帮助,但更简单的解决方案是史蒂夫的。:)

这(谢谢,L42)适用于幻灯片上的单个msoPicture形状,但如果有多个形状,则可能会遗漏一些:

Dim s As Shape

For Each s In ActivePresentation.Slides(17).Shapes
    If s.Type = 13 Then s.Delete '13 is msoPicture
Next
为什么??假设幻灯片上有三种形状。我们遍历shapes集合,发现第一个形状是一张图片,并将其删除。现在“形状”集合中有两个形状,但VBA的计数器不考虑集合计数中的更改。它查看集合中的第二个形状,但这是幻灯片上的第三个形状,因此代码将完全忽略形状2

使用这样的东西更可靠:

Dim x as Long

For x = ActivePresentation.Slides(17).Shapes.Count to 1 Step -1
    If ActivePresentation.Slides(17).Shapes(x).Type = msoPicture Then
        ActivePresentation.Slides(17).Shapes(x).Delete
    End If
Next

注意:L42的代码将起作用,除非每张幻灯片有多个图片形状。在这种情况下,您可能希望将x=ActivePresentation.Slides(17).Shapes.Count用于第1步-1实际上,我在一张幻灯片上有许多图像,但它们都是同一类型的,因此这对我很有效。@L42:不完全如此。它将跳过其他图像。请参阅我稍后将发布的详细答案。您是对的。我每天都学新东西,这是件好事。加上1:)只是为了感谢一位多年前给我寄钱的朋友而寄钱给我谢谢你的编辑。