Vba 共享文件时保留链接图像的Powerpoint代码

Vba 共享文件时保留链接图像的Powerpoint代码,vba,powerpoint,Vba,Powerpoint,在我的Powerpoint中,有链接到文件夹的图像。我需要将此发送给无权访问该文件夹的用户。我需要图像来保留当前内容 我曾尝试手动复制并重新粘贴为图片形式的图像,然后发送PowerPoint,这样做有效,并保留了图像中的内容和日期设置 我有32个PowerPoints,如何通过编程实现这一点 这是一个有趣的挑战 CopyPictures宏实际上是您需要的唯一宏,但我包含了另外两个用于设置和调试整个情况的宏 Option Explicit Sub CopyPictures() Dim

在我的Powerpoint中,有链接到文件夹的图像。我需要将此发送给无权访问该文件夹的用户。我需要图像来保留当前内容

我曾尝试手动复制并重新粘贴为图片形式的图像,然后发送PowerPoint,这样做有效,并保留了图像中的内容和日期设置


我有32个PowerPoints,如何通过编程实现这一点

这是一个有趣的挑战

CopyPictures宏实际上是您需要的唯一宏,但我包含了另外两个用于设置和调试整个情况的宏

Option Explicit

Sub CopyPictures()

    Dim currentSlide As Slide
    For Each currentSlide In ActivePresentation.Slides

        Dim currentShape As Shape
        For Each currentShape In currentSlide.Shapes

            If currentShape.Type = msoLinkedPicture Then

                'https://docs.microsoft.com/en-us/office/vba/api/powerpoint.shapes.addpicture
                currentSlide.Shapes.AddPicture _
                    currentShape.LinkFormat.SourceFullName, _
                    msoFalse, msoTrue, _
                    currentShape.Left, currentShape.Top, _
                    currentShape.Width, currentShape.Height

                currentShape.Delete

            End If

        Next currentShape

    Next currentSlide

End Sub
CopyPictures宏循环浏览powerpoint每张幻灯片中的每个形状,并表示如果它正在检查的当前形状的类型为msoLinkedPicture,它只需使用它所基于的链接将该图片重新添加到powerpoint中,而是选择将图片作为msoPicture与文档一起保存!新图片放置在同一位置,并缩放以匹配当前图片。最后,它删除了图片的“旧”链接版本,因为它已经被替换

AddLinkedPicture宏用于将链接图片添加到我的活动幻灯片中,然后我使用第二个宏ShapeTypedBug来确保我添加的图片具有正确的类型msoLinkedPicture

您可以使用ShapeTypedBug宏检查当前幻灯片上的任何形状是否为图片。我在运行CopyPictures宏之前和之后都使用了此选项,以确保图片已正确“转换”

Sub AddLinkedPicture()

    'https://docs.microsoft.com/en-us/office/vba/api/powerpoint.shapes.addpicture
    ActiveWindow.View.Slide.Shapes.AddPicture "C:\Users\Public\Downloads\Untitled.png", msoTrue, msoFalse, 100, 100

End Sub

Sub ShapeTypeDebug()

    Dim currentShape As Shape
    For Each currentShape In ActiveWindow.View.Slide.Shapes

        'https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.core.msoshapetype?view=office-pia
        Select Case currentShape.Type
            Case 11
                MsgBox Chr(34) & currentShape.Name & Chr(34) & " is a msoLinkedPicture"
            Case 13
                MsgBox Chr(34) & currentShape.Name & Chr(34) & " is a msoPicture "
        End Select

    Next currentShape

End Sub

请注意,我使用的方法不会复制当前图片,因此如果您在powerpoint中对其进行了其他编辑,我的方法将丢失该编辑

这是一个有趣的挑战

CopyPictures宏实际上是您需要的唯一宏,但我包含了另外两个用于设置和调试整个情况的宏

Option Explicit

Sub CopyPictures()

    Dim currentSlide As Slide
    For Each currentSlide In ActivePresentation.Slides

        Dim currentShape As Shape
        For Each currentShape In currentSlide.Shapes

            If currentShape.Type = msoLinkedPicture Then

                'https://docs.microsoft.com/en-us/office/vba/api/powerpoint.shapes.addpicture
                currentSlide.Shapes.AddPicture _
                    currentShape.LinkFormat.SourceFullName, _
                    msoFalse, msoTrue, _
                    currentShape.Left, currentShape.Top, _
                    currentShape.Width, currentShape.Height

                currentShape.Delete

            End If

        Next currentShape

    Next currentSlide

End Sub
CopyPictures宏循环浏览powerpoint每张幻灯片中的每个形状,并表示如果它正在检查的当前形状的类型为msoLinkedPicture,它只需使用它所基于的链接将该图片重新添加到powerpoint中,而是选择将图片作为msoPicture与文档一起保存!新图片放置在同一位置,并缩放以匹配当前图片。最后,它删除了图片的“旧”链接版本,因为它已经被替换

AddLinkedPicture宏用于将链接图片添加到我的活动幻灯片中,然后我使用第二个宏ShapeTypedBug来确保我添加的图片具有正确的类型msoLinkedPicture

您可以使用ShapeTypedBug宏检查当前幻灯片上的任何形状是否为图片。我在运行CopyPictures宏之前和之后都使用了此选项,以确保图片已正确“转换”

Sub AddLinkedPicture()

    'https://docs.microsoft.com/en-us/office/vba/api/powerpoint.shapes.addpicture
    ActiveWindow.View.Slide.Shapes.AddPicture "C:\Users\Public\Downloads\Untitled.png", msoTrue, msoFalse, 100, 100

End Sub

Sub ShapeTypeDebug()

    Dim currentShape As Shape
    For Each currentShape In ActiveWindow.View.Slide.Shapes

        'https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.core.msoshapetype?view=office-pia
        Select Case currentShape.Type
            Case 11
                MsgBox Chr(34) & currentShape.Name & Chr(34) & " is a msoLinkedPicture"
            Case 13
                MsgBox Chr(34) & currentShape.Name & Chr(34) & " is a msoPicture "
        End Select

    Next currentShape

End Sub

请注意,我使用的方法不会复制当前图片,因此如果您在powerpoint中对其进行了其他编辑,我的方法将丢失该编辑

对于分发演示文稿,我认为您可能已经有了最好的解决方案,但在某些情况下,这里有另一个非常有用的解决方案

PowerPoint几乎总是创建完全路径链接,但如果链接仅指向文件名,而没有路径,则它通常会在与PPT/PPTX本身相同的文件夹中查找图像

因此,如果您愿意分发链接的图像和PowerPoint文件,并且可以让收件人将它们全部放在一个文件夹中,则只需将链接图片的.LinkFormat.SourceFullName设置为原始图像文件名sans path即可

显然,这不会像分发一样简单,但因为它只更改链接路径,而不会更改图片的任何内容,因此它保留了可能应用于图像的任何动画、alt文本、标记或其他异常格式设置


另一个可能是最简单的技巧是在插入图像时选择链接和嵌入,而不仅仅是链接。当磁盘上的原始图像发生变化时,PPT将更新演示文稿中的图像,但如果链接断开,则使用嵌入的副本。

对于分发演示文稿,我认为您可能已经有了最好的解决方案,但在某些情况下,还有一个解决方案会很有用

PowerPoint几乎总是创建完全路径链接,但如果链接仅指向文件名,而没有路径,则它通常会在与PPT/PPTX本身相同的文件夹中查找图像

因此,如果您愿意分发链接的图像和PowerPoint文件,并且可以让收件人将它们全部放在一个文件夹中,则只需将链接图片的.LinkFormat.SourceFullName设置为原始图像文件名sans path即可

显然,这不会像分发一样简单,但因为它不会改变pict 但在链接路径中,它保留了可能应用于图像的任何动画、alt文本、标记或其他异常格式设置


另一个可能是最简单的技巧是在插入图像时选择链接和嵌入,而不仅仅是链接。当磁盘上的原始图像发生变化时,PPT将更新演示文稿中的图像,但如果链接断开,PPT将使用嵌入的副本。

非常感谢。快到了!唯一不太有效的是>>新图片被放置在同一位置,并被缩放以匹配当前图片。>>照片的位置移动了,我不得不手动缩放。有什么想法吗?@Camille你多久前拿到密码的?大约30分钟前,我对它做了一个小小的更新,因为我已经向后完成了其中的一部分:| Excellent@Marcucciboy2我一直在考虑类似这样的“Shape.LinkFormat.SourceFullName”搜索分散在目录中的不同链接ole对象,以将它们保存在单个合并目录中。非常感谢。快到了!唯一不太有效的是>>新图片被放置在同一位置,并被缩放以匹配当前图片。>>照片的位置移动了,我不得不手动缩放。有什么想法吗?@Camille你多久前拿到密码的?大约30分钟前,我对它做了一个小小的更新,因为我已经向后完成了其中的一部分:| Excellent@Marcucciboy2我一直在考虑类似这样的“Shape.LinkFormat.SourceFullName”搜索分散在目录中的不同链接ole对象,将它们保存在单个合并目录中。