Ne vous est-il pas arriver de vouloir copier/coller les textes d'une diapositive PowerPoint ?
En général, on fait copier puis on colle, toute la diapositive est collée à destination. Mais si on ne veut que les textes, il faut recopier à la main ou copier/coller le texte de chacune des formes une par une.
S'il y en a peu c'est faisable mais quand il y en a beaucoup c'est fastidieux et on risque d'en oublier.
Cette macro copie dans le presse papier tous les textes contenus dans les formes de la diapositive courante sauf les formes réservées (le titre, le texte...).
Elle utilise une fonction récursive pour parcourir les formes groupées.
Mode d'emploi :
Ajouter le source ci-dessous aux macros de Powerpoint : copier le source ici, faire "outil/macro/visual basic editor" (ou alt-F11) insérez un module et coller
Pour exécuter la macro, faire outil/macro choisir "CopierLeContenueDesFormes" puis cliquez "exécuter"
Trucs et astuces :
Il est possible d'inclure les formes réservées en remplaçant dans la macro 'FormeCourante.Type <> msoPlaceholder' par 'true'.
Le séparateur entre les textes est " - " il peut facilement être modifié en changeant dans la macro la constante 'SeparateurTextes'
Pour conserver de la cohérence dans les textes copiés, vous pouvez grouper les formes, ils seront collés proches les uns des autres.
Source / Exemple :
Option Explicit
Const SeparateurTextes = " - "
'Permet de copier le textes de toutes les formes de diapositive courante excepté les formes réservées (titre...)
Sub CopierLeContenueDesFormes()
'
' Macro créé le 22/02/2010 par Guy Marty
'
Dim FormeCourante As Shape 'Forme en cours de traitement
Dim ToutLeTexte As String 'Tout le texte en cours d'assemblage
Dim TexteCourant As String 'Texte de la forme courante
'L'utilisation du presse papier nécessite la référence Microsoft Form 2.0 (C:\WINDOWS\system32\fm20.dll)
Dim PressePapier As New DataObject 'Un objet presse papier, le code est plus simple à lire avec ça
ToutLeTexte = ""
'On travaille que sur une seule diapositive
If ActiveWindow.Selection.SlideRange.Count <> 1 Then Exit Sub
'Parcours de toutes les formes de la diapositive
For Each FormeCourante In ActiveWindow.Selection.SlideRange.Shapes
If FormeCourante.Type <> msoPlaceholder Then 'La forme n'est pas une forme réservée
TexteCourant = TexteDeLaForme(FormeCourante) 'Texte de la forme courante
If TexteCourant <> "" Then 'Il n'est pas vide on peut l'ajouter aux autres textes
If ToutLeTexte = "" Then
ToutLeTexte = TexteCourant 'C'est le premier texte, il n'y a pas de séparateur
Else
ToutLeTexte = ToutLeTexte & SeparateurTextes & TexteCourant 'Le texte courant est ajouté avec un séparateur
End If
End If
End If
Next
'Copie dans le presse papier
With PressePapier
.SetText ToutLeTexte
.PutInClipboard
End With
MsgBox "Texte copié : " & ToutLeTexte
End Sub
'Fonction récursive permettant d'assembler le texte de la forme passée en paramètre
Function TexteDeLaForme(Forme As Shape) As String
Dim FormeCourante As Shape
Dim ToutLeTexte As String
Dim TexteCourant
ToutLeTexte = ""
If Forme.Type <> msoGroup Then 'La forme n'est pas un groupe
If Forme.HasTextFrame Then 'La forme contient une fenêtre de texte
If Forme.TextFrame.HasText Then 'Il y a effectivement du texte
TexteDeLaForme = Forme.TextFrame.TextRange
End If
End If
Else 'La forme est un groupe, on récupère le texte de chaque forme du groupe
For Each FormeCourante In Forme.GroupItems
TexteCourant = TexteDeLaForme(FormeCourante)
If TexteCourant <> "" Then
If ToutLeTexte = "" Then
ToutLeTexte = TexteCourant
Else
ToutLeTexte = ToutLeTexte & SeparateurTextes & TexteCourant
End If
End If
Next
TexteDeLaForme = ToutLeTexte
End If
End Function
Conclusion :
Testé avec powerpoint mais après adaptation pourrait fonctionner avec d'autres programmes d'office dont word (en passant une collection shapes en paramètre).
Autre améliorations possibles :
- Faire choisir le séparateur par l'utilisateur
- Faire choisir d'inclure ou non les espaces réservés.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.