2017-02-07 5 views
1

Je suis actuellement en utilisant ce code pour mettre à jour tous les liens dans ma présentation powerpoint:boucle à travers des graphiques sur selectionnés (ou gamme de) diapositives PowerPoint

Sub UpdateLinks() 
Dim ExcelFile 
Dim exl As Object 
Set exl = CreateObject("Excel.Application") 

ExcelFile = "C:\Users\J\Documents\Reporting\Governance Physical Charts.xlsm" 

Dim i As Integer 
Dim k As Integer 

'Go through every slide 
For i = 1 To ActivePresentation.Slides.Count 
    With ActivePresentation.Slides(i) 
     'Go through every shape on every slide 
     For k = 1 To .Shapes.Count 
On Error Resume Next 
      'Set the source to be the same as teh file chosen in the opening dialog box 
      .Shapes(k).LinkFormat.SourceFullName = ExcelFile 
      If .Shapes(k).LinkFormat.SourceFullName = ExcelFile Then 
       'If the change was successful then also set it to update automatically 
       .Shapes(k).LinkFormat.AutoUpdate = ppUpdateOptionAutomatic 'other option is ppUpdateOptionManual 
      End If 

     Next k 
    End With 
Next i 
End Sub 

Au lieu de mettre à jour le lien de chaque tableau dans la présentation, est Est-il possible d'avoir ce code en boucle seulement dans les diapositives sélectionnées? Ou si c'est plus facile - est-il possible de définir une plage? Par exemple, uniquement mettre à jour les graphiques sur les diapositives 15-30?

Merci!

EDIT: Résolution fournie dans les commentaires - voici mon code révisé

Sub UpdateLinks() 
Dim ExcelFile 
Dim exl As Object 
Set exl = CreateObject("Excel.Application") 
Dim sld As Slide 

ExcelFile = "C:\Users\J\Documents\Reporting\Governance Physical Charts.xlsm" 

Dim i As Integer 
Dim shp As Shape 

For Each sld In ActivePresentation.Slides.Range(Array(11, 12, 13, 14, 15, 16, 17, 18)) 

     For Each shp In sld.Shapes 
On Error Resume Next 
      shp.LinkFormat.SourceFullName = ExcelFile 
      If shp.LinkFormat.SourceFullName = ExcelFile Then 
       shp.LinkFormat.AutoUpdate = ppUpdateOptionAutomatic 'other option is ppUpdateOptionManual 
      End If 

     Next shp 


Next 
End Sub 

Répondre

1

Oui, vous pouvez composer gammes sur mesure Slides ainsi que sur Shapes, en utilisant un Array comme paramètre index. Essayez ceci:

Dim sld As Slide 
For Each sld In ActivePresentation.Slides.Range(Array(1, 3, 5)) 
    Debug.Print sld.Name 
Next 

Sortie:

Slide2 Slide4 Slide6

P.S. J'avais supprimé une diapositive dans la présentation de test.

+1

Merci @ A.S.H - cela a fonctionné! Affichage de mon code révisé en édition – jennaisavol

+0

@jennaisavol Voulez-vous marquer la question comme étant répondue (en cliquant sur la coche au-dessus de la réponse)? –

0

Comme vous avez également mentionné le traitement des diapositives simplement sélectionnées, vous pouvez le faire comme ceci:

Sub SelectedSlides() 
    Dim osl As Slide 
    For Each osl In ActiveWindow.Selection.SlideRange 
     Debug.Print osl.SlideIndex 
    Next 
End Sub 

Notez que cela vous donnera les diapositives sélectionnées afin INVERSE de sélection. Autrement dit, si vous contrôlez les diapositives 2,4,6, cela vous donnera 6,4,2.