vba et commande word

Forum Microsoft Office Word

Modérateur : Argitxu

vba et commande word

Publicité
 

jpgcourt
Posteur débutant
Posteur débutant
Messages : 15
Enregistré le : 26 sept. 2017, 15:58

vba et commande word

Message non lu par jpgcourt » 18 déc. 2018, 18:06

Bonjour
Existe-t-il un moyen de lancer une des macros disponibles dans Commandes Word, par exemple Reculer, avec du code VBA ?
J'ai essayé en utilisant la syntaxe WordBasic.Reculer ainsi que Wordbasic.DrawSendToBack, sans succès. Le code ne déclenche pas de message d'erreur, mais l'objet sélectionné reste en avant plan.
Par contre un clic souris sur la commande Outils de dessin/Format/Reculer/Reculer fait le travail correctement.
J'utilise Word 2010.

Avatar du membre
m@rina
Administrateur
Administrateur
Messages : 1270
Enregistré le : 14 août 2009, 08:51
Contact :

Re: vba et commande word

Message non lu par m@rina » 22 déc. 2018, 16:26

Bonjour,

Oui, on peut reculer une image avec du VBA à condition bien entendu que cette image ait un habillage :

Exemple pour reculer d'un niveau l'image nommée "image1" :

Code : Tout sélectionner

ActiveDocument.Shapes("image1").ZOrder msoSendBackward
et pour l'envoyer directement en arrière plan :

Code : Tout sélectionner

ActiveDocument.Shapes("image1").ZOrder msoSendToBack
m@rina
m@rina

jpgcourt
Posteur débutant
Posteur débutant
Messages : 15
Enregistré le : 26 sept. 2017, 15:58

Re: vba et commande word

Message non lu par jpgcourt » 22 déc. 2018, 17:45

Merci pour votre réponse.
Je connais cette méthode, mais elle ne semble pas s'appliquer si la forme (Shape) est contenue dans une zone de dessin (canvas), ce dont j'ai justement besoin.
Elle fonctionnait en word 2003 en passant par la collection CanvasItems.
Par exemple, si sur un document je crée un canevas avec deux ovales, la macro

Code : Tout sélectionner

 Sub test()
   Dim cnv As Shape
   Set cnv = Me.Shapes(1)
   cnv.CanvasItems(2).ZOrder msoSendToBack
 End Sub
fonctionne en word 2003, mais pas en word 2010

Vous précisez que la forme doit avoir un habillage. Peut être les formes contenues dans un canevas n'ont elles pas d'habillage ? Mais en word 2003, la boite de dialogue Format de la forme automatique ne propose rien pour l'habillage, ce qui est fâcheux en cette saison, et la méthode fonctionne.

Par contre, la commande accessible par les menus s'applique bien si la forme sélectionnée est dans un canevas. C'est pourquoi je me demandais s'il était possible de la lancer par macros.

Bref, je nage complètement.

En espérant que le Père Noël m'apporte des éclaircissements, je vous souhaite de joyeuses fêtes de fin d'année.

Avatar du membre
m@rina
Administrateur
Administrateur
Messages : 1270
Enregistré le : 14 août 2009, 08:51
Contact :

Re: vba et commande word

Message non lu par m@rina » 24 déc. 2018, 05:40

Bonjour,

Tu n'avais effectivement pas précisé qu'il s'agissait d'objets à l'intérieur d'une zone de dessin.

Cela étant, je ne peux que constater, comme tu l'as fait, que ça ne fonctionne pas ! :cry:
Pas de message d'erreur mais rien ne se produit...
Et comme ce ne doit pas être une demande courante, je pense que ça ne va pas être réglé de si tôt !

Joyeux Noël quand même ;)
m@rina

jpgcourt
Posteur débutant
Posteur débutant
Messages : 15
Enregistré le : 26 sept. 2017, 15:58

Re: vba et commande word

Message non lu par jpgcourt » 24 déc. 2018, 10:10

Rien dans mes petits souliers, le Père Noël est une ordure.
Souvent MicroSoft varie, bien fol est qui s'y fie.
Je vais chercher une solution de replacement.
Merci encore pour tes réponses

jpgcourt
Posteur débutant
Posteur débutant
Messages : 15
Enregistré le : 26 sept. 2017, 15:58

Re: vba et commande word

Message non lu par jpgcourt » 29 déc. 2018, 12:14

J'ai une solution qui semble fonctionner en Word 2010.
L'idée de base : quand on duplique une forme, la copie est placée automatiquement au premier plan du canevas.
Pour passer une forme F d'arrière-plan au premier plan du canevas :
● on la duplique : la copie passe au premier plan dans le canevas
● on positionne la copie au même endroit que l'original, avec le même nom et on détruit l'original.
Au premier plan on récupère non pas l'objet F initial, mais une copie.
Pour passer une forme du canevas au dernier plan du canevas si elle n'y est pas déjà :
● on groupe les autres formes du canevas
● on duplique le groupe : la copie passe au premier plan donc la forme passe à l'arrière-plan
● on positionne la copie du groupe au même endroit que l'ancien et on détruit l'original
Au dernier plan, on récupère l'objet initial F, par contre toutes les autres formes sont des copies des objets initiaux.
Avec la même idée, on peut monter ou descendre une forme plan par plan.
Comme le dit un ami, c'est une technique Scotch et fil de fer !
Si vous pensez que le code peut être utile, je vous l'envoie. Mais je ne garantis rien ...

Avatar du membre
m@rina
Administrateur
Administrateur
Messages : 1270
Enregistré le : 14 août 2009, 08:51
Contact :

Re: vba et commande word

Message non lu par m@rina » 31 déc. 2018, 05:10

Bonsoir,

Ben tu peux aussi ajouter la colle uhu !

Je comprends bien cette technique un pleu tirée par les cheveux... As-tu essayé de couper-coller plutôt que de dupliquer ? ainsi l'objet sera toujours le même et ça évite une manip supplémentaire.
Par contre, es-tu certain de pouvoir réappliquer les paramètres de position initiaux ? Je n'en suis pas si certaine. J'ai pas testé, mais il me semble que c'est encore un truc pas au point...
m@rina

jpgcourt
Posteur débutant
Posteur débutant
Messages : 15
Enregistré le : 26 sept. 2017, 15:58

Re: vba et commande word

Message non lu par jpgcourt » 31 déc. 2018, 13:06

Bonjour
Je n'ai pas pensé au copier-coller.
Je viens de faire quelque tests.
Quand on coupe-colle une forme dans un canevas, on ne récupère pas la forme initiale au collage, la propriété ID a changé. Si on fait référence à la forme initiale après le collage, un message nous indique que l'objet a été supprimé.
Pour positionner la nouvelle forme, il suffit de mémoriser les propriétés Left et Top de la forme initiale.
En résumé, avec le copier-coller, on n'a pas à détruire la forme initiale (ça se fait tout seul), mais il faut mémoriser sa position. Au niveau du code, cela me semble équivalent.
Par contre, le copier-coller a un avantage : si le canevas contient un grand nombre de formes, quand on groupe les autres formes pour faire passer la forme initiale au dernier plan, le nombre total de formes ne change pas, alors qu'avec la duplication, il y a un moment où ce nombre est pratiquement doublé puisque deux groupes coexistent sur le canevas.

Avatar du membre
m@rina
Administrateur
Administrateur
Messages : 1270
Enregistré le : 14 août 2009, 08:51
Contact :

Re: vba et commande word

Message non lu par m@rina » 31 déc. 2018, 22:08

Bonjour,

Le couper-coller permet de récupérer exactement la même forme, même taille, même nom. Le propriété ID change forcément, mais on n'en a pas besoin. Si on donne un nom à la forme, elle est reconnue au collage, elle a le même nom.

J'ai testé sauf que, comme je le disais hier, elle refuse les propriétés Top et Left. Ou plutot, elle s'en fiche... En tous les cas je n'ai pas réussi à lui remettre ces propriétés.
m@rina

jpgcourt
Posteur débutant
Posteur débutant
Messages : 15
Enregistré le : 26 sept. 2017, 15:58

Re: vba et commande word

Message non lu par jpgcourt » 01 janv. 2019, 13:50

Bonjour et bonne année
Pour le nom de l'original coupé et celui de la copie collée, j'ai constaté la chose suivante :
● Quand on insère une forme (ici un ovale) dans le canevas, Word lui attribue un nom qui tient compte de l'ID. (et pour simplifier les choses, le nom qui apparait dans le volet de sélection n'est pas celui renvoyé par la propriété Name, du moins sur ma version francisée de word !)
Après le couper-coller, la copie n'a pas le même nom que l'original, ni le même ID. Ce n'est donc pas le même objet.
● Si on change le nom de la forme avant le copier-coller, alors la copie conserve le nom original. Ce nom est celui qui apparait dans le volet de sélection et c'est aussi celui qui est renvoyé par la propriété Name.
Autre remarque : après le couper, l'objet initial Forme n'est pas détruit, puisque le test Forme Is Nothing renvoie Faux. Donc Forme fait référence à qqchose, mais quoi ?
Mais si on active l'instruction MsgBox Forme.Name, on a un message d'erreur disant que l'objet a été supprimé. Là, j'avoue ne pas comprendre.
Enfin, Forme et Copie ne font pas référence au même objet, puisque Copie Is Forme renvoie Faux.
Maintenant, je suis loin d'être un expert en programmation objet et ce que je raconte est peut être un tissu de sottises.
Bon, je vais boire une flûte de champagne pour me réconforter.

La macro :

Code : Tout sélectionner

Sub Renseignements()
  'Pour voir le déroulement, afficher le Volet de sélection
  'Placer un canevas sur le document et un Ovale dans le canevas.
  'Puis sélectionner cet Ovale
  Dim Forme As Shape, Copie As Shape, L As Single, T As Single, sF As String, sC As String
  Set Forme = Selection.ChildShapeRange(1)
  'On donne un nom personnel à Forme
  'Forme.Name = "MaForme"
  sF = "Nom de Forme : " & Forme.Name & ". ID de Forme : " & CStr(Forme.ID)
  L = Forme.Left: T = Forme.Top

  Selection.Cut
  Selection.Paste

  'si on active l'instruction suivante, on a un message d'erreur
  '  MsgBox Forme.Name

  Set Copie = Selection.ChildShapeRange(1)
  sC = "Nom de Copie : " & Copie.Name & ". ID de Copie : " & CStr(Copie.ID)

  'On place Copie au même endroit que Forme
  Copie.Left = L: Copie.Top = T
  MsgBox "Forme Is Nothing : " & CBool(Forme Is Nothing) & vbCr & _
         "Copie et Forme sont elles le même objet ? " & CBool(Copie Is Forme) & vbCr & _
         sF & vbCr & sC
End Sub

Avatar du membre
m@rina
Administrateur
Administrateur
Messages : 1270
Enregistré le : 14 août 2009, 08:51
Contact :

Re: vba et commande word

Message non lu par m@rina » 03 janv. 2019, 04:10

Bonjour, Bonne année !!

" après le couper, l'objet initial Forme n'est pas détruit"
Mais c'est bien sûr !!!
Si on définit au départ la forme, elle reste définie jusqu'à la fin même si elle est supprimée. Merci d'avoir mis le doigt sur l'évidence !!
Il faut donc simplement redéfinir la nouvelle forme une fois qu'elle a été collée. Parce que je suis bien d'accord que ce n'est pas la même forme, n'empêche qu'elle garde le nom. On pourrait le modifier, mais ça n'a pas d'intérêt.

Je fais une parenthèse pour dire que oui il faut changer le nom via le volet Sélection (ou via une macro si nécessaire) parce effectivement elle prend le nom en anglais qui n'est pas le nom français... C'est la joie du VBA Microsoft qui oublie ce genre de détails, et il n'y a pas que dans le VBA d'ailleurs, il suffit de regarder les champs.
Une autre parenthèse aussi pour dire que le code Word est pourri... On ne fait pas tout ce qu'on veut comme avec Excel. Mais bon, il y a pire, c'est le code PowerPoint !!!

Revenons à nos moutons. Donc après avoir coupé la forme, je la redéfinis et ça donne ceci :

Code : Tout sélectionner

Sub lesformes()
Dim cnv As Shape 'la zone de dessin
Dim oval As Shape, rect As Shape 'les deux formes dont le nom est changé depuis le volet Sélection
Set cnv = ActiveDocument.Shapes("zone")
Set oval = cnv.CanvasItems("oval")
Set rect = cnv.CanvasItems("rect")

'Les paramètres positions
haut = oval.Top
gauche = oval.Left

'Je sélectionne l'oval et je coupe, puis je colle
oval.Select
Selection.Cut
Selection.Paste
'Je redéfinis le nouvel oval
Set oval = cnv.CanvasItems("oval")
oval.Top = haut
oval.Left = gauche

End Sub
m@rina
m@rina

jpgcourt
Posteur débutant
Posteur débutant
Messages : 15
Enregistré le : 26 sept. 2017, 15:58

Re: vba et commande word

Message non lu par jpgcourt » 03 janv. 2019, 11:46

Bien d'accord avec toi pour la qualité du code Word qui semble bien s'être dégradée entre les versions 2003 et 2010.
Par exemple la macro suivante s'exécute en un clin d'œil sous Word 2003, et prend chez moi plusieurs minutes en Word 2010.

Code : Tout sélectionner

Sub AjouteBoitesTexteWord()
  Dim i As Long, j As Long
  For i = 1 To 20
    For j = 1 To 20
      Me.Shapes.AddTextbox Orientation:=msoTextOrientationHorizontal, _
                           Left:=20 * i, Top:=20 * j, Width:=10, Height:=10
    Next j
  Next i
End Sub
Conséquence : pour obtenir un temps d'exécution supportable, il faut faire un downgrade du document !
La même, sous Excel 2010, est instantanée :

Code : Tout sélectionner

Sub AjouteBoitesTexteExcel()
  Dim i As Long, j As Long
  For i = 1 To 20
    For j = 1 To 20
      Me.Sheets(1).Shapes.AddTextbox Orientation:=msoTextOrientationHorizontal, _
                           Left:=20 * i, Top:=20 * j, Width:=10, Height:=10
    Next j
  Next i
End Sub
Pour PowerPoint, je n'ai pas testé : je ne l'utilise pas.
Ceci dit, ajouter 400 boîtes de texte sur un document est assez "spécial", n'empêche que les versions antiques de Word faisaient le travail.
Je n'ai jamais trouvé la moindre allusion à ces différences de comportement sur Internet, et ce n'est pas faute d'avoir cherché.
J'ai même posé la question sur un site américain qui a l'air très fréquenté (msofficeforums pour ne pas le nommer), où je n'ai obtenu que des réponses vaseuses. Je pense que ces questions n'intéressent pas grand monde, même dans un pays où le nombre d'utilisateurs de Word doit être .bien plus conséquent qu'en France.

Avatar du membre
m@rina
Administrateur
Administrateur
Messages : 1270
Enregistré le : 14 août 2009, 08:51
Contact :

Re: vba et commande word

Message non lu par m@rina » 03 janv. 2019, 16:17

Bonjour

Je ne trouve effectivement pas de bonne (ou même de mauvaise) raison pour que ce code s'exécute aussi mal sur les dernières versions.
Mais en effet, Microsoft ne va pas se pencher sur ce problème, sachant qu'il n'intéresse personne... ou presque ! :)

Pour PowerPoint, c'est pire.. Mais aussi, très peu de personnes macrotent sur PowerPoint. D'ailleurs l'enregistreur de macros a été supprimé. A titre d'exemple, une macro complémentaire n'est pas visible dans le VBE, à moins de bricoler la base de registre ! Et une fois qu'on a réussi à la rendre visible, on peut la modifier mais on ne peut pas l'enregistrer. Donc, on fait des tests, une fois qu'on est content de sa macro, on la copie-colle dans une nouvelle présentation qu'on réenregistre en macro complémentaire et on remplace l'ancienne par la nouvelle. Qui fait cette gymnastique (à part moi !!! :lol: )

m@rina
m@rina

jpgcourt
Posteur débutant
Posteur débutant
Messages : 15
Enregistré le : 26 sept. 2017, 15:58

Re: vba et commande word

Message non lu par jpgcourt » 05 janv. 2019, 14:17

Bonjour
Pourquoi brider les potentialités de ces logiciels ?
Ce sont des bugs non corrigés, ou une politique délibérée ?
Ça fait quand même tache, dans des outils aussi extraordinaires ...

Répondre