Problème coiper coller sur powerpoint

Résolu
Barnadas Messages postés 28 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 16 septembre 2013 - 23 sept. 2011 à 17:14
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre 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

12 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
23 sept. 2011 à 19:34
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)
3
Barnadas Messages postés 28 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 16 septembre 2013
24 sept. 2011 à 20:45
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
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
24 sept. 2011 à 21:57
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).
0
Barnadas Messages postés 28 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 16 septembre 2013
26 sept. 2011 à 21:03
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
26 sept. 2011 à 23:46
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é.
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
26 sept. 2011 à 23:50
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
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
26 sept. 2011 à 23:51
Rappel : Tout est expliqué dans l'aide
0
Barnadas Messages postés 28 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 16 septembre 2013
27 sept. 2011 à 07:54
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
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
27 sept. 2011 à 11:31
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
0
Barnadas Messages postés 28 Date d'inscription lundi 2 février 2009 Statut Membre Dernière intervention 16 septembre 2013
27 sept. 2011 à 13:23
j'ai essayé ton code avec les objets, il ne fonctionne pas, le débogueur s'arrête sur TextRange ???
0
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
27 sept. 2011 à 15:26
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.
0
djedjeska Messages postés 90 Date d'inscription mercredi 21 novembre 2007 Statut Membre Dernière intervention 25 mai 2013
28 sept. 2011 à 22:37
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 ?
0