Problème coiper coller sur powerpoint [Résolu]

Messages postés
28
Date d'inscription
lundi 2 février 2009
Dernière intervention
16 septembre 2013
- - Dernière réponse : djedjeska
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
- 28 sept. 2011 à 22:37
Bonjour,

J'ai une présentation powerpoint, en vba où je demande de copier une slide, de la coller et de la déplacer à une position donnée. Lorsque je lance ma macro une fois sur deux (vraiment une fois sur deux), ma slide copiée se colle sur la slide d'après sous forme d'image.

Pouvez-vous m'aider à comprendre pourquoi cela fonctionne une fois sur deux. Je vous mets mon code ci-dessous :
sub ajout()
i = ActivePresentation.Slides.Count + 1
ActivePresentation.Slides(1).Select
ActivePresentation.Slides(1).Copy
ActiveWindow.Selection.Unselect
ActiveWindow.View.Paste
ActivePresentation.Slides(2).MoveTo toPos:=i
ActivePresentation.Slides(i).Select
end sub

Merci d'avance pour vos réponses
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
3
Merci
Salut

D'après ton programme, tu copies le premier Slide, puis tu déplaces le Slide n° 2 à l'avant dernière position, puis tu l'affiches.
"avant dernière position" car tu viens d'insérer un Slide, donc le .Count vaut maintenant "ancien .Count + 1".
Est-ce bien ce que tu cherches à faire ?

Je te conseille d'utiliser les objets nommés, tu agiras plus efficacement et parfois plus rapidement aussi.
Je n'ai jamais fait de VBA sous PowerPoint, mais ceci peut te mettre sur la voie :
sub ajout()
    Dim oSlide As SlideRange
    With ActivePresentation
        Set oSlide = .Slides(2).Duplicate
        oSlide.MoveTo (.Slides.Count)
        oSlide.Select
    End With
    Set oSlide = Nothing
end sub 

Bizarre que ton code soit en minuscule.
La prochaine fois, utilise la coloration syntaxique (3ème icone à droite) = plus facile à lire et conserve les indentations (espaces en tête de ligne)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

Merci cs_Jack 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
28
Date d'inscription
lundi 2 février 2009
Dernière intervention
16 septembre 2013
0
Merci
Merci pour ton code, je ne l'ai pas encore essayé mais il me semble parfait. Est-ce que tu peux m'en dire plus sur les objets nommés (je ne sais pas ce que c'est) ?

merci d'avance
Commenter la réponse de Barnadas
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Chaque objet que tu utilises est ... un objet : Une présentation, un Slide, un rectangle, un poisson rouge, ...
Si tu dimensionnes-déclares toutes tes variables (recommandation), tu peux cibler chaque objet et ainsi obtenir, quand tu tapes le point . , les méthodes et propriétés de cet objet.
Facile ensuite d'ouvrir l'aide et regarder :
- comment fonctionne telle ou telle méthode
- l'arborescence des objets
Ce dernier point est important pour comprendre l'architecture des objets, qui renferme qui, comment lister et sélectionner l'un de ceux qu'il renferme.
De cette manière, tu sauras comment dimensionner l'objet suivant.

En utilisant la syntaxe fournie par l'enregistreur de macro, cela te fournira le canevas nécessaire.
Exemple de simplification qu'il faut absolument faire avec ce genre de syntaxe :
ActivePresentation.Slides(1).Select
ActivePresentation.Slides(1).Copy
Cela peut se résumer à
ActivePresentation.Slides(1).Copy
Puisque la méthode .Copy s'adresse directement à l'un des objets, le Select est inutile.
Le Select n'étant là que pour "afficher" l'objet. Or, dans une macro, c'est le résultat final qui nous intéresse, pas la surveillance de l'évolution de la macro = perte de temps en rafraichissement d'écran.
Autre exemple simple qui aurait pu être ta syntaxe :
ActivePresentation.Slides(1).Select
Selection.Copy
Et bien, il faut simplifier et éviter de faire appel à Selection.
Raison supplémentaire : Si l'utilisateur joue de la souris ou du clavier pendant l'exécution de la macro, cela risque de modifier le contenu de l'objet Selection et de faire planter la macro.

Pour en revenir aux objets, la méthode .Duplicate, je l'ai trouvée en parcourant les méthodes de l'objet SlideRange (je n'ai pas trop approfondi la différence avec Slide - voir l'aide).
Commenter la réponse de cs_Jack
Messages postés
28
Date d'inscription
lundi 2 février 2009
Dernière intervention
16 septembre 2013
0
Merci
J'ai testé ton code, ça fonctionne super. du coup j'ai essayé de reprendre un code du même type en utilisant les objets comme tu m'as indiqué dans ton message. Et là c'est le drame j'y arrive pas...
Je cherche un truc simple, je veux sélectionner une valeur numérique dans une textbox. Jusqu'à maintenant ça fonctionnait pas mal en faisant le code suivant : (e1 la valeur en sortie, coeffechelle1 nom de la textbox)

Sub lecturechelle(e1)

ActivePresentation.Slides(1).Select
ActiveWindow.Selection.SlideRange.Shapes("coeffechelle1").Select
e1 = ActiveWindow.Selection.TextRange.Text

End Sub


Mais avec les objets j'arrive pas à le faire, peux tu m'aider de nouveau ?
Merci d'avance
Commenter la réponse de Barnadas
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Quel est le code qui fonctionnait ? Celui-la ?
En supposant que oui.
Le premier Select ne sert à rien puisque tu en fait un autre immédiatement après.
Les 2 pourraient se regrouper en
ActivePresentation.Slides(1).Shapes("coeffechelle1").Select
Mais comme on décide de supprimer cet horrible Select, tu devrais pouvoir atteindre la valeur directement :
e1 = ActivePresentation.Slides(1).Shapes("coeffechelle1").TextRange.Text
Mais je ne l'ai pas vérifié/testé.
Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Pour ce qui est des objets, là, ça ne s'impose pas car ce serait une usine à gaz pour arriver à une simple valeur, mais il faudrait un objet pour chaque niveau :
ActivePresentation -> Type Presentation
Slides -> Collection de SlideRange
Shapes -> Collection de Shape
Dim oPresentation As Presentation
Dim oSlide As SlideRange
Dim oShape As Shape
Set oPresentation = ActivePresentation
Set oSlide = oPresentation.Slides(1)
Set oShape = oSlide.Shapes("coeffechelle1")
e1 = oShape.TextRange.Text
Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Rappel : Tout est expliqué dans l'aide
Commenter la réponse de cs_Jack
Messages postés
28
Date d'inscription
lundi 2 février 2009
Dernière intervention
16 septembre 2013
0
Merci
OK merci, j'avais pas compris qu'il fallait scinder chaque objet. moi je faisais un objet du type :
 
Set oSlide = ActivePresentation.Slides(1)


Merci beaucoup en tout cas
Commenter la réponse de Barnadas
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Oui, c'est raccourci parmi d'autre, mais cela fonctionne.
L'avantage de gérer les objets, pour énumérer les objets qu'il renferme :
Dim oPresentation As Presentation
Dim oSlide As SlideRange
Set oPresentation = ActivePresentation
For Each oSlide In oPresentation.Slides
    MsgBox oSlide.Name
Next
Voir aussi oPrensentation.Slides.Count
Commenter la réponse de cs_Jack
Messages postés
28
Date d'inscription
lundi 2 février 2009
Dernière intervention
16 septembre 2013
0
Merci
j'ai essayé ton code avec les objets, il ne fonctionne pas, le débogueur s'arrête sur TextRange ???
Commenter la réponse de Barnadas
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Deux solutions :
- Tu cliques sur le Shape de la ligne du Dim et tu appuies sur F1 et tu regardes les propriétés de l'objet Shape
- Tu cliques sur TextRange et tu appuies sur F1 en ne choisissant pas l'objet puis tu vas dans "S'applique à" : Tu sauras donc à qui appartient cette méthode.
Dans ce dernier cas, tu verras qu'il n'appartient qu'à l'objet TextFrame. Alors, curieux que tu es, tu cliques sur TextFrame
Dans l'exemple fourni dans l'aide, tu vois tout de suite quelque chose qui ressemble à ta structure.
Voilà l'élément manquant.
En gros et je le répète une dernière fois : Tout est dans l'aide.
Commenter la réponse de cs_Jack
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Dernière intervention
25 mai 2013
0
Merci
J'ai pas trop compris l'histoire de la textbox ?

Tu veux juste récupérer le texte devant ?? Tu pourrais utiliser
Slide1.Textbox1.Text tout simplement non ?
Commenter la réponse de djedjeska

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.