Problème coiper coller sur powerpoint

Résolu
Signaler
Messages postés
28
Date d'inscription
lundi 2 février 2009
Statut
Membre
Dernière intervention
16 septembre 2013
-
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Statut
Membre
Dernière intervention
25 mai 2013
-
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

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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)
Messages postés
28
Date d'inscription
lundi 2 février 2009
Statut
Membre
Dernière intervention
16 septembre 2013

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
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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).
Messages postés
28
Date d'inscription
lundi 2 février 2009
Statut
Membre
Dernière intervention
16 septembre 2013

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
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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é.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Rappel : Tout est expliqué dans l'aide
Messages postés
28
Date d'inscription
lundi 2 février 2009
Statut
Membre
Dernière intervention
16 septembre 2013

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
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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
Messages postés
28
Date d'inscription
lundi 2 février 2009
Statut
Membre
Dernière intervention
16 septembre 2013

j'ai essayé ton code avec les objets, il ne fonctionne pas, le débogueur s'arrête sur TextRange ???
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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.
Messages postés
90
Date d'inscription
mercredi 21 novembre 2007
Statut
Membre
Dernière intervention
25 mai 2013

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 ?