Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2396 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  VBA Word et zones de dessins

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

VBA Word et zones de dessins

n°2262136
jpl38
Posté le 08-07-2015 à 16:12:06  profilanswer
 

Bonjour
En VBA Word 2010, je cherche à déplacer une forme dans une zone de dessin, en modifiant les propriétés .Left et .Top de l'objet Shape.
L'aide précise que ces propriétés expriment des distances mesurées en points.
Pour tester ces propriétés, j'ai écrit une petite macro qui place une zone de texte dans un canvas à 60 points du bord gauche et à 40 points du bord haut du canvas,  
et une seconde zone de texte hors du canvas, à 60 points du bord gauche et 40 points du bord droit de la feuille.
Puis je récupère ces distances et les fait afficher dans des boites de messages.
Pour la TextBox hors canvas les valeurs renvoyées sont correctes et exprimées en points (60 et 39.95), mais pour l'autre, elles sont divisées par 20 (3 et 2) !
Il semblerait donc que dans une zone de dessin, VBA mesure les distances en vingtaines de points, ou alors je passe à côté de quelque chose.
Avez vous une explication ?  
Voici le code de la macro :  

Code :
  1. Sub CoordonnéesDansCanevas()
  2.     Dim canevas As Shape, boite As Shape
  3.     Set boite = ActiveDocument.Shapes.AddTextbox(Orientation:=msoTextOrientationHorizontal, Left:=60, Top:=40, Width:=28, Height:=20)
  4.     With boite
  5.         .TextFrame.TextRange.Text = CStr(1)
  6.         .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
  7.         .RelativeVerticalPosition = wdRelativeVerticalPositionPage
  8.     End With
  9.     MsgBox "left = " & CStr(boite.Left) & " ; top = " & CStr(boite.Top)
  10.     Set canevas = ActiveDocument.Shapes.AddCanvas(Left:=100, Top:=100, Width:=100, Height:=100)
  11.     Set boite = canevas.CanvasItems.AddTextbox(Orientation:=msoTextOrientationHorizontal, Left:=60, Top:=40, Width:=28, Height:=20)
  12.     boite.TextFrame.TextRange.Text = CStr(2)
  13.     MsgBox "left = " & CStr(boite.Left) & " ; top = " & CStr(boite.Top)
  14.     Set canevas = Nothing: Set boite = Nothing
  15. End Sub

mood
Publicité
Posté le 08-07-2015 à 16:12:06  profilanswer
 

n°2262154
Marc L
Posté le 08-07-2015 à 18:26:38  profilanswer
 

 
           Bonjour,
 
           valeurs retournées :       boîte      →  left = 60 ;       top = 39,95
 
                                               canevas  →  left = 29,15 ;  top = 29,15
 
 
           Avec le code suivant, je constate que le TextBox créé au sein du canevas renvoie les propriétés Left & Top du canevas :
 

Code :
  1. Sub Demo()
  2.          Dim Sh As Shape, Ca As Shape
  3.     For Each Sh In Me.Shapes
  4.         Debug.Print Sh.Name, , Sh.Left, Sh.Top
  5.    
  6.         If Sh.Type = msoCanvas Then
  7.             For Each Ca In Sh.CanvasItems
  8.                Debug.Print Sh.Name; ":", Ca.Name, Ca.Left, Ca.Top
  9.             Next
  10.         End If
  11.     Next
  12. End Sub


 

n°2262158
jpl38
Posté le 08-07-2015 à 19:26:13  profilanswer
 

Salut Marc L
Quelle version de word utilises tu ?  
J'ai deux messages d'erreur avec ta macro : utilisation incorrecte du mot clé me, que j'ai remplacé ActiveDocument, et une incompatibilité de type à la ligne 7 (for each Ca etc.) que je ne sais pas corriger.

n°2262160
Marc L
Posté le 08-07-2015 à 19:40:54  profilanswer
 

 
           Tu as dû regarder l'aide VBA de Me :  le code n'était pas dans un module mais dans ThisDocument
 
           Mon code renvoyant sous Word 2003 :    Text Box 2                         60          39,95
                                                                       Canvas 4                           29,15     29,15
                                                                       Canvas 4:     Text Box 5     29,15     29,15
 
           Déduction : à l'intérieur d'un objet Canvas, un TextBox n'aurait pas de propriétés Left & Top intrasèques …
 
 

n°2262161
jpl38
Posté le 08-07-2015 à 20:28:36  profilanswer
 

J'ai fait tourner ton code sous word 2003 : j'obtiens bien les mêmes résultats que toi. Par contre sous word 2010, ça plante à la ligne 7.
D'ailleurs ma macro ne retourne pas les mêmes valeurs sous 2003 et sous 2010. C'est un vrai sac de noeuds.
Sous 2010, elle donne bien le left et le top de la textbox dans le canvas, non pas en points, mais bien en vingtaines de points.  D'où sort cette unité ?


Message édité par jpl38 le 08-07-2015 à 20:36:38
n°2262229
Marc L
Posté le 09-07-2015 à 18:14:22  profilanswer
 

 
            Le plantage sous Word 2010 doit signifier un changement dans la structure objet, à fouiller dans l'aide VBA de cette version …
 
            Et il te reste à effectuer une recherche "mondiale" sur le web pour obtenir plus d'information …
 

n°2262233
jpl38
Posté le 09-07-2015 à 18:29:33  profilanswer
 

Salut
Si je déclare Ca As object, ça tourne, mais si jele déclare As Shape, ça plante.
Voici la macro modifiée :

Code :
  1. Sub CoordonnéesDansCanevas()
  2.     'On construit une boite 1 et un canevas dans le feuille, et une boite 2 dans le canevas
  3.     Dim canevas As Shape, boite As Shape
  4.    
  5.     Set boite = ActiveDocument.Shapes.AddTextbox(Orientation:=msoTextOrientationHorizontal, Left:=40, Top:=20, Width:=28, Height:=20)
  6.     With boite
  7.         .TextFrame.TextRange.Text = CStr(1)
  8.         .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
  9.         .RelativeVerticalPosition = wdRelativeVerticalPositionPage
  10.         .Name = "boite 1"
  11.     End With
  12.    
  13.     Set canevas = ActiveDocument.Shapes.AddCanvas(Left:=100, Top:=100, Width:=100, Height:=100)
  14.     With canevas
  15.         .Name = "canevas"
  16.         .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
  17.         .RelativeVerticalPosition = wdRelativeVerticalPositionPage
  18.     End With
  19.    
  20.     Set boite = canevas.CanvasItems.AddTextbox(Orientation:=msoTextOrientationHorizontal, Left:=60, Top:=40, Width:=28, Height:=20)
  21.     boite.TextFrame.TextRange.Text = CStr(2): boite.Name = "boite 2"
  22.    
  23.     'Nom et la position des formes de la feuille
  24.     Debug.Print "Formes dans la feuille"
  25.     Dim forme As Shape
  26.     For Each forme In ActiveDocument.Shapes
  27.         Debug.Print forme.Name, , forme.Left, forme.Top
  28.     Next forme
  29.    
  30.     'Nom et la position de la boite du canevas
  31.     Debug.Print "Formes dans le canevas"
  32.    
  33.     'En parcourant la collection CanvasItems : left et top sont mesurés en points
  34.     Dim InCan As Object 'objet dans le canevas ; la boucle plante si InCan est déclaré As Shape !
  35.     For Each InCan In canevas.CanvasItems
  36.         Debug.Print InCan.Name; "(Boucle)", InCan.Left, InCan.Top
  37.     Next InCan
  38.    
  39.     'Sans parcourir la collection CanvasItems : left et top sont mesurés en vingtaines de points
  40.     Set InCan = canevas.CanvasItems("boite 2" )
  41.     Debug.Print InCan.Name; "(Direct)", InCan.Left, InCan.Top
  42.    
  43.     Set canevas = Nothing: Set boite = Nothing: Set forme = Nothing: Set InCan = Nothing
  44. End Sub


 
La boucle de la ligne 36 donne les distances en points, les lignes 41 et 42 donnent les distances en vingtaines de points. Il s'agit pourtant du même objet !
Voici la copie de la fenêtre Exécution :  
 
Formes dans la feuille
boite 1                          40            19.95  
canevas                        100           99.95  
Formes dans le canevas
boite 2(Boucle)               59.98189      39.98795  
boite 2(Direct)                2.999094      1.999398  
 
Pour la recherche "mondiale" j'ai déjà essayé, ça n'a rien donné.
Merci pour ta participation.
PS Sur l'autre forum, mon message a disparu. J'ai fait qqchose qu'il ne fallait faire ?


Message édité par jpl38 le 09-07-2015 à 18:37:27
n°2262234
Marc L
Posté le 09-07-2015 à 18:35:42  profilanswer
 

 
           Même As Object, cela ne change rien sous 2003 …
 
           Au moins c'est corrigé sous 2010 !
 

n°2262235
jpl38
Posté le 09-07-2015 à 18:39:20  profilanswer
 

Une erreur de manipulation a interrompu mon message; je l'ai édité.

n°2262243
Marc L
Posté le 09-07-2015 à 20:24:33  profilanswer
 

 
           C'est juste avec la ligne 36 sous 2010, donc c'est réglé, non ?
 
           L'autre forum ? (DVP ?) Un message ne disparaît pas comme cela sauf problème chez l'hébergeur …
 

mood
Publicité
Posté le 09-07-2015 à 20:24:33  profilanswer
 

n°2262245
jpl38
Posté le 09-07-2015 à 20:47:40  profilanswer
 

Oui, oui, c'est réglé. Ce que je ne comprends pas, c'est que tantôt VBA utilise les points, tantôt la vingtaine de points ; ça ressemble à un gag. Et pourquoi donc utiliser la vingtaine de points ? C'est une unité anglo-saxonne ? C'est un bug non corrigé ? Je n'ai rien trouvé dans l'aide ni sur internet.
Bon, ça ne m'empêche pas de dormir, il suffit de multiplier par 20, et ça roule ...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  VBA Word et zones de dessins

 

Sujets relatifs
[VBA] Import image[VBA] Sécurité
VBA sélectionner contenus de plusieurs fichiers excel[VBA] Renseigner des signets Word dans une boucle For.
[VBA] problème pour coderHost Explorer et VBA
VBA avec recherche v 
Plus de sujets relatifs à : VBA Word et zones de dessins


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR