Frage

Ich muss die Erstellung einer Präsentation (entweder OpenOffice oder PowerPoint) automatisieren. Die Präsentation sollte die ersten beiden Folien jeder Präsentationen in einem bestimmten Verzeichnis aufnehmen und sie dann zu einer einzigen Präsentation kombinieren. Ich bin verwirrt darüber, welchen Ansatz ich ergreifen sollte, um dies zu lösen. Alle Zeiger werden geschätzt.

War es hilfreich?

Lösung

Wenn Sie über PowerPoint sprechen, würden Sie ein VBA -Makro verwenden, um den Job zu erledigen, so etwas wie

Sub Pull()
Dim SrcDir As String, SrcFile As String

    SrcDir = PickDir()
    If SrcDir = "" Then Exit Sub

    SrcFile = Dir(SrcDir & "\*.ppt")

    Do While SrcFile <> ""
        ImportFromPPT SrcDir + "\" + SrcFile, 1, 2
        SrcFile = Dir()
    Loop

End Sub

Auswahl Ihres Quellverzeichnisses Sie können diese Funktion verwenden

Private Function PickDir() As String
Dim FD As FileDialog

    PickDir = ""

    Set FD = Application.FileDialog(msoFileDialogFolderPicker)
    With FD
        .Title = "Pick a directory to work on"
        .AllowMultiSelect = False
        .Show
        If .SelectedItems.Count <> 0 Then
            PickDir = .SelectedItems(1)
        End If
    End With

End Function

Jetzt - der Hauptpunkt besteht darin Aufrechterhaltung des Quellformates. Das ist eine schwierige Sache, wie die PPT VBA InsertFromFile Methode ist nicht gut verwendet. Microsoft hat uns gute Zeit gegeben, um es in unzähligen 20 -Stunden -Debuging -Sitzungen auf die harte Tour herauszufinden :-) Und Sie müssen viel Code eingeben, um es richtig zu erledigen - weitaus komplizierter als manuell zu verwenden, insbesondere wenn Ihre Quellfolie manuell verwendet Abweicht von Ihrer Quell -Master -Folie.

Wenn Ihre PPTs bei ihren Meistern festhalten, können Sie jeden Code zwischen ">>>>" weglassen ".

Private Sub ImportFromPPT(FileName As String, SlideFrom As Long, SlideTo As Long)
Dim SrcPPT As Presentation, SrcSld As Slide, Idx As Long, SldCnt As Long

    Set SrcPPT = Presentations.Open(FileName, , , msoFalse)
    SldCnt = SrcPPT.Slides.Count

    If SlideFrom > SldCnt Then Exit Sub
    If SlideTo > SldCnt Then SlideTo = SldCnt

    For Idx = SlideFrom To SlideTo Step 1
        Set SrcSld = SrcPPT.Slides(Idx)
        SrcSld.Copy
        With ActivePresentation.Slides.Paste
            .Design = SrcSld.Design
            .ColorScheme = SrcSld.ColorScheme
            ' if slide is not following its master (design, color scheme)
            ' we must collect all bits & pieces from the slide itself

            ' >>>>>>>>>>>>>>>>>>>>

            If SrcSld.FollowMasterBackground = False Then
                .FollowMasterBackground = False
                .Background.Fill.Visible = SrcSld.Background.Fill.Visible
                .Background.Fill.ForeColor = SrcSld.Background.Fill.ForeColor
                .Background.Fill.BackColor = SrcSld.Background.Fill.BackColor

                ' inspect the FillType object
                Select Case SrcSld.Background.Fill.Type
                    Case Is = msoFillTextured
                        Select Case SrcSld.Background.Fill.TextureType
                        Case Is = msoTexturePreset
                            .Background.Fill.PresetTextured (SrcSld.Background.Fill.PresetTexture)
                        Case Is = msoTextureUserDefined
                        ' TextureName gives a filename w/o path
                        ' not implemented, see picture handling
                        End Select

                    Case Is = msoFillSolid
                        .Background.Fill.Transparency = 0#
                        .Background.Fill.Solid

                    Case Is = msoFillPicture
                        ' picture cannot be copied directly, need to export and re-import slide image
                        If SrcSld.Shapes.Count > 0 Then SrcSld.Shapes.Range.Visible = False
                        bMasterShapes = SrcSld.DisplayMasterShapes
                        SrcSld.DisplayMasterShapes = False
                        SrcSld.Export SrcPPT.Path & SrcSld.SlideID & ".png", "PNG"

                        .Background.Fill.UserPicture SrcPPT.Path & SrcSld.SlideID & ".png"
                        Kill (SrcPPT.Path & SrcSld.SlideID & ".png")

                        SrcSld.DisplayMasterShapes = bMasterShapes
                        If SrcSld.Shapes.Count > 0 Then SrcSld.Shapes.Range.Visible = True

                    Case Is = msoFillPatterned
                        .Background.Fill.Patterned (SrcSld.Background.Fill.Pattern)

                    Case Is = msoFillGradient

                        ' inspect gradient type
                        Select Case SrcSld.Background.Fill.GradientColorType
                        Case Is = msoGradientTwoColors
                            .Background.Fill.TwoColorGradient
                                SrcSld.Background.Fill.GradientStyle , _
                                SrcSld.Background.Fill.GradientVariant
                        Case Is = msoGradientPresetColors
                            .Background.Fill.PresetGradient _
                                SrcSld.Background.Fill.GradientStyle, _
                                SrcSld.Background.Fill.GradientVariant, _
                                SrcSld.Background.Fill.PresetGradientType
                        Case Is = msoGradientOneColor
                            .Background.Fill.OneColorGradient _
                                SrcSld.Background.Fill.GradientStyle, _
                                SrcSld.Background.Fill.GradientVariant, _
                                SrcSld.Background.Fill.GradientDegree
                        End Select

                    Case Is = msoFillBackground
                        ' Only shapes - we shouldn't come here
                End Select
            End If

            ' >>>>>>>>>>>>>>>>>>>>

        End With
    Next Idx

End Sub

Der Code überprüft nicht auf schreibgeschützte oder passwortgeschützte Fies und stürzt darauf ab. Achten Sie auch darauf, die Sammlerdatei selbst nicht zu übertragen. Ansonsten sollte es funktionieren. Ich muss zugeben, dass ich den Code schon lange nicht überprüft habe ;-)

Andere Tipps

Sie können "PowerPoint Join" Google haben, um ein nützliches Tool zu finden, um vielen PPTs beizutreten.

Ich bin froh @miked war in der Lage, Ihnen das zu besorgen, was Sie brauchten.

Eine andere Methode, die bei Verwendung von .NET berücksichtigt werden muss, wird in erörtert dieser Beitrag

Eine einfache und schnelle Lösung:

I := Presentation.Slides.InsertFromFile(FileName,X,StartSlideNo,EndSlideNo);
Presentation.Slides.Item(I).ApplyTheme(FileName);
Presentation.Slides.Item(I).ApplyTemplate(FileName);

Hinweis: X ist Platz für die Einführung der Folie in die Präsentation

Ich ist tatsächlich Ort, an dem die Folie eingefügt wurde

Der Code ist in Delphi/Pascal geschrieben, aber Sie können ihn EASELY umwandeln ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top