Verknüpfungen in PowerPoint über VB bearbeiten

vandread

Lt. Commander
Registriert
Nov. 2004
Beiträge
1.372
Hallo,

ich habe eine PowerPoint Presäntation in der mehrere Excel-Diagramme enthalten sind. Diese Diagramme wurden aus einer Excel-Datei kopiert und in den Folien eingefügt (sind also verknüpft). Wenn man also (ausgehend von Office 2010) in PowerPoint auf Datei/Informationen/Verknüpfungen mit Dateien bearbeiten geht sieht man alle Diagramme und den entsprechenden Pfad zur jweiligen Excel-Datei.

Ich möchte jetzt gerne ein Makro schreiben welches die Pfade der Verknüpfungen bearbeitet. Stellt euch einfach vor da würden 100 Verknüpfungen sein mit dem Pfad "C:\folder\data.xlsx" und daraus soll einfach "C:\folder\tmp\data.xlsx" werden. Schön wäre es natürlich wenn man dort relative Pfade angeben könnte aber das geht soweit ich weiß nicht...

Meine erste Recherche im Internet brachte mich zu diesem Forum:
http://www.office-loesung.de/ftopic15700_0_0_asc.php

Dort wird das gleiche Problem diskutiert und jemand hat folgenden Code gepostet:
Code:
Sub VerknuepfungenAendern()
    Dim Praes As Presentation, Blatt As Slide, Bild As Shape, pfad, kopie As String
    Set Praes = ActivePresentation
    
    For Each Blatt In Praes.Slides
        For Each Bild In Blatt.Shapes
            If Bild.Type = msoLinkedOLEObject Then
                If InStr(Bild.OLEFormat.ProgID, "Excel.Sheet") > 0 Then
                    If InStr(1, a, "[") > 0 Then
                        pfad = Bild.LinkFormat.SourceFullName
                        suche = InStr(1, pfad, "Projekt-Tabellen_nicht_umbenennen.xls")
                        kopie = Mid(pfad, suche)
                        neuerpfad = pfad & kopie
                    Else
                        pfad = Bild.LinkFormat.SourceFullName
                        MsgBox ("alter pfad: " & pfad)
                        suche = InStr(1, pfad, "\Projekt-Tabellen_nicht_umbenennen.xls")
                        MsgBox ("Position: " & suche)
                        kopie = Mid(pfad, suche)
                        MsgBox ("Dateiname und Zellenzuweisung: " & kopie)
                        neuerpfad = ActivePresentation.Path & kopie
                        MsgBox ("Neuer Pfad: " & neuerpfad)
                    End If
                
                    If neuerpfad <> Bild.LinkFormat.SourceFullName Then
                        Bild.LinkFormat.SourceFullName = neuerpfad
                    End If
                End If
            End If
        Next
    Next
End Sub
Dieser Code soll eigentlich den Pfad der Verlinkungen so ändern dass er durch den aktuellen Pfad der PowerPoint-Datei ersetzt wird. Problem ist aber dass die ganzen Diagramme nicht als msoLinkedOLEObject erkannt werden sondern als einfache msoChart.

Hier kann man nachscauen welche Shape-Arten es gibt:
https://msdn.microsoft.com/de-de/library/office/ff744590(v=office.15).aspx

Weiterhin habe ich folgendes auf Stackoverflow finden können:
http://stackoverflow.com/questions/27852935/what-object-does-msolinkedoleobjects-refer-to

Embedded charts and Linked charts are two entirely different things. Perhaps you have embedded charts rather than linked. You might also test to see if oshp.Type = msoEmbeddedOLEObject If so, the chart is embedded and will have no linkformat.sourcefullname property. Also, if you're looking at charts and not worksheets, test to see if .ProgID contains just "Excel", not "Excel.Sheet" – Steve Rindsberg Jan 9 at 16:08
Dort ist nun die Rede von embedded und linked charts. Soweit ich es aber verstanden habe müssen es linked charts sein damit ich den Pfad ändern kann bzw. auf die Eigenschaft LinkFormat zugreifen kann.

Bei mir sind es aber wie gesagt ganz normale charts (also msoChart) obwohl sie definitiv verknüpft sind.

Kann mir eventuell jemand erklären wo der Fehler ist oder wie ich die Diagramme verknüpfen muss damit es msoLinkedOLEObject sind?

Vielen Dank!
 
Ich bin mir recht sicher, dass ich was Ähnliches irgendwo habe, aber leider nicht hier…

Insofern kann ich dir nur den Tipp geben alle «Objekte» abzulaufen und dir über VBA gewisse Infos anzeigen zu lassen bis du Objekttyp und Verknüpfungstyp raus hast. Dann hast du Syntax die die du ansetzen kannst den angepassten Pfad festzuschreiben.

CN8
 
Vielen Dank für die Info, sobald ich wieder im Büro bin werde ich mal schauen was sich da machen lässt...
Solltest du aber deine Lösung finden kansnt du dich ja gerne hier melden... (:
 
Zu blöd, aber auch..:
Code:
Sub LinksAufLokalBringen()
Dim Folie As Slide
Dim Form As Shape
Dim Quelle As String
Dim Ziel As String
Dim I, J As Integer
For Each Folie In ActivePresentation.Slides
 For Each Form In Folie.Shapes
  If Form.Type = msoLinkedOLEObject Then
   Quelle = Form.LinkFormat.SourceFullName
   I = 0: J = InStr(I + 1, Quelle, "\")
   While J > 0
    J = InStr(I + 1, Quelle, "\")
    If J <> 0 Then I = J
   Wend
   Ziel = Mid(Quelle, I + 1)
   'Debug.Print (Ziel + ", " + Quelle)
   Form.LinkFormat.SourceFullName = Ziel
  End If
 Next
Next
End Sub

------


Sub LinksEinbinden()
'REM Bedienunganleitung
'Alle Quellcharts (heißt: alle nötigen, nicht notwendigerwise aber alle) kommen in
'ein beliebiges Arbeitsverzeichnis. Mit dem DOS-Kommando
'DIR *.HCX > FileList.Dat
'werden die Namen aller Charts eingelesen. Aus Gründen des Automatisierens wird dann
'diese Liste nach Wunsch sortiert und kann vom Makro eingelesen werden.
'Damit soll nicht nur das Erstellen der Links sondern eben auch ein späteres
'mühsames Sortieren umgangen werden.
'Ist man soweit beginnt man mit einer der Vorlagen für die Präsentation. Dieses
'Makro nutzt die Fläche voll aus - wenn erforderlich müssen die Werte in der
'ActiveWindow.Selection.SlideRange.Shapes.AddOLEObject-Zeile angepasst werden.
'(Hinweis: Das "blinde Kästchen" in den Charts könnte unerwartet die querlaufende
'Leiste verunzieren! Die Flächen im Titel sind auf 1,7cm reduziert.)

Dim I As Integer
Dim Folienzahl As Integer
Dim Name(500) As String
Const Pfad = ".\"

Folienzahl = 0
Open "FileList.Dat" For Input As #1
While Not EOF(1)
 Folienzahl = Folienzahl + 1
 Line Input #1, Name(Folienzahl)
Wend
Close 1

'GoTo ENTE

For I = 1 To Folienzahl
Debug.Print (Str(I) + " " + Name(I))
 ActiveWindow.Selection.SlideRange.Shapes.AddOLEObject(Left:=40, Top:=54, Width:=640, Height:=480, FileName:=Pfad + Name(I), Link:=msoTrue).Select
 ActiveWindow.View.GotoSlide Index:=ActivePresentation.Slides.Add(Index:=I + 1, Layout:=ppLayoutBlank).SlideIndex
Next
ActiveWindow.Selection.SlideRange.Delete

ENTE:

End Sub
Du wirst offenbar das msoLinkedOLEObject nicht loswerden, wie das Anpassungs- nebst dem Erzeugungsmakro zeigen. Bist du sicher, dass du nicht doch solche normalen Links hast?

CN8
 
Da bin ich mir sehr sicher... Eventuell kannst du mir sagen wie ich ein msoLinkedOLEObject hinbekomme...?!

Ich habe folgendes Beispiel gemacht:

Ich habe eine Excel-Datei erstellt und dort einfach mal ein kleines Diagramm erstellt. Diese Datei habe ich abgespeichert. Im selben Ordner habe ich eine Powerpoint-Datei erstellt mit nur einer leeren Folie. Nun gehe ich in die Excel-Datei und kopiere das Diagramm und füge es in Powerpoint ein. Das war es dann auch...

Wenn ich jetzt folgenden Code einfach mal laufen lasse:
Code:
Sub Test()
    Dim Folie As Slide
    Dim Form As Shape

    For Each Folie In ActivePresentation.Slides
        For Each Form In Folie.Shapes
            Debug.Print ("Form.Type = " & Form.Type)
        Next
    Next
    
    Debug.Print ("msoChart = " & msoChart)
    Debug.Print ("msoLinkedOLEObject = " & msoLinkedOLEObject)
End Sub

Kommt folgende Ausgabe:
Form.Type = 3
msoChart = 3
msoLinkedOLEObject = 10


Also etwas muss ich falsch machen... Wie bekomme ich ein msoLinkedOLEObject...!?
Das Diagramm ist aber defenitiv verknüpft! Wenn ich in Powerpoint auf Datei/Informationen/Verknüpfungen mit Dateien bearbeiten gehe sehe ich dort die Excel-Datei...

Selbst Microsoft erklärt das Verknüpfen so:
https://support.office.com/de-ch/ar...int-2010-692497a5-c7de-4486-a435-5af1eff02821
 
Zurück
Oben