Dessiner une forme, connaissant ses sommets

Bonjour,

J'ai les coordonnées (X,Y) des sommets de la forme que je souhaite dessiner

Pour le faire bêtement, je donne

With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, Cells(1,1), Cells(1, 2))

.AddNodes msoSegmentLine, msoEditingAuto, Cells(1,3), Cells(1,4)

.AddNodes msoSegmentLine, msoEditingAuto, Cells(1,5), Cells(1,6)

.AddNodes msoSegmentLine, msoEditingAuto, Cells(1,7), Cells(1,8)

.ConvertToShape.Select

End With

Ceci, dans le cas où je n'ai que 4 sommets, ce qui est loin d'être toujours le cas

Intelligent, je donne

With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, Cells(1,1), Cells(1, 2))

For j = 3 To 7 Step 2

.AddNodes msoSegmentLine, msoEditingAuto, Cells(1, j), Cells(1, j + 1)

Next j

.ConvertToShape.Select

End With

Mauvaise nouvelle, je ne suis pas si intelligent que ça puisque ça plante!

Impossible de faire une boucle au sein d'un "With" ?

Quelqu'un a une solution?

Merci d'avance

Bonsoir,

Impossible de faire une boucle au sein d'un "With" ?

Allons-donc ! C'est même depuis toujours recommandé par Microsoft de façon générale !

Et je crois bien n'avoir jamais fait ce type de formes sans utiliser de boucle !

Si ça plante, mais tu ne dis pas quelle erreur ? C'est donc ailleurs.

Je n'aime pas les Cells non qualifiées, et pas plus le Select final, et je préfèrerais opérer avec un tableau, mais le code devrait fonctionner sous réserve de la feuille active.

Donne les précisions requises, indique ce que tu veux faire, et mets un fichier !

NB- C'est ton 1er post, bienvenue sur le Forum. La prochaine fois que tu as du code à citer, le bouton </> te permet de le mettre sous balises Code (il apparaît dans une fenêtre et reste indenté), utilise-le.

Cordialement.

Bonjour

... et merci de votre aide

Nota: je travaille sur Excel 97, si cela a une importance... (Oui, je suis un vieux bon;-)

Les cells non qualifiées? Moi y'en a pas comprendre. Il faudrait passer par une variable déclarée?

Je cherche à représenter un ancien canton du Val d'Oise avec un forme simplifiée des communes et leurs noms. Chaque forme de commune ayant un nom, je pourrais leur donner des couleurs differentes par la suite (pour des données relatives à la généalogie)

Qu'est ce qui ne marche pas dans mon code?

Re-merci d'avance

2395-72.zip (16.55 Ko)

Re,

97 ça date un peu ! Tu cours le risque qu'on te propose des solutions comportant des éléments incorporés dans les versions suivantes. 97 on était à VBA5 (on est à VBA7, et il y a des introductions sur chaque version d'Excel, même si la version VBA ne change pas...) C'est avec 97 que sont apparus les objets Shapes, auparavant on se contentait des DrawingObjects, il ne devrait donc pas y avoir de problème sur les propriétés et méthodes de base...

Quelques remarques au vu de ton code :

    Dim i, j, n, l As Integer

Là tu déclares l comme Integer, mais pas les autres qui demeurent non typées, donc de type Variant.

Les variables se typent individuellement : Dim i As Integer, j As Integer, etc.

Mais pour les variables numériques et String, tu peux utiliser un caractère de déclaration de type : % équivaut à As Integer, accolé à un nom de variable dans une déclaration.

    Dim i%, j%, n%, l%

Là toutes tes variables sont déclarées de type Integer.

(NB- on évite généralement le L minuscule car il prête à confusion...)

A la suite tu initialises 5 variables non déclarées (type Variant). Ce n'est pas une pratique très rationnelle, il est toujours souhaitable de déclarer toutes ses variables, et en débutde procédure.

    n = Cells(i, 9) * 2 + 8

Quand je dis que Cells n'est pas qualifiée, cela signifie que l'expression destinée à renvoyer un objet Range ne fait aucune référence explicite à la feuille qui la contient.

Dans ce cas VBA considère par défaut qu'il s'agit de : Application.Cells, cherche donc le classeur actif dans l'application, puis la feuille active dans l'application, ce qui prend plus de temps que d'aller chercher sur la feuille que tu lui indiques. On peut négliger la référence explicite au classeur tant qu'on est sûr qu'un classeur sera seul ouvert quand on l'utilise, mais un classeur à vocation à contenir plusieurs feuilles, et on peut toujours en ajouter, et le contexte qui fait que telle feuille est active à un moment peut s'en trouver modifié, et une macro qui fonctionnait se met à dysfonctionner... Donc pour un code fiable et plus rapide, il est souhaitable d'avoir une référence permanente à la feuille, et plutôt que répéter le nom le bloc With est fait pour ça (ça par contre, ça accélère l'exécution).

Même chose pour les Select, on n'a pas besoin de sélectionner en VBA, c'est un opération parasite (qu'on trouve notamment dans le code enregistré, toujours mauvais, car outre qu'il ne peut que reproduire des manipulations, il renvoie à chaque fois la valeurs de tous les paramètres dont beaucoup sont inutiles car laissés à leur valeur par défaut, que le code enrregistré fait donc redéfinir à la valeur qu'ils ont déjà ...)

Dans ton cas l'affectation à une variable Shape, réutilisable pour la suite serait préférable.

Pour ce qui est de ton problème, j'ai fait un essai pour générer une forme, je n'obtiens que le rectangle avec le nom de la commune. Je ne trouve rien d'autre autour. L'ayant supprimé, je détecte 3 formes sur la feuille, que je ne vois pas. Ayant pris les coordonnées de l'angle supérieur gauche de la 1re, qui devraient se trouver sur X1, toujours rien. L'essai de la rendre visible déclenche une erreur ?

Je pense qu'il faut vérifier les coordonnées de tous tes points (et aussi les placer sur une autre feuille), pour arriver à voir ce qu'il en est. Les coordonnées sont en point, et un point = 1/72e de pouce.

J'arrête pour ce soir...

Bonsoir

Merci pour l'initiation

Rentré du boulot à 23h pour recommencer demain à 7h...

Un fichier modifié:

  • J'ai supprimé la partie d'affichage du nom des communes (un problème à la fois)
  • J'ai modifié et déclare bien les variables entières et j'y ajoute deux variables x1 et y1.
Comme un sagouin, je calcul d'abord les coordonnées et j'en prend la partie entière (puisque x1et y1sont integer...) Il y a plus beau, m'enfin

Là, on voit apparaître 3 formes de communes incomplètement, mais bien nommées

BELLEFONTAINE qui est connue par 13 points n’apparaît qu'avec 12 points mais on commence à la reconnaître. Elle est bien au Nord de Chatenay en F et au sud est de Chaumontel...

CHATENAY-EN-FRANCE qui est connue par 9 points n’apparaît qu'avec 7 points

CHAUMONTEL qui est connue par 9 points n’apparaît qu'avec 7 points

On progresse mais je ne comprends même pas pourquoi!

Les sommets d'une forme peuvent avoir des décimales, autant que je sache

Nota: Au travail, j'utilise une version >2007 puisque j'enregistre en xlsx. Je n'aime pas trop mélanger perso et boulot, mais si vous pensez que sous une version plus récente, cela marcherait dites le moi.

Maintenant, au dodo

Merci encore

1995-72.zip (16.38 Ko)

Bonjour,

Jr pars en clinique, retour demain soir, je reprends à mon retour.

Cordialement.

Bonsoir

Reposez vous

Je m'y remettrais plus à fond ce week end

Santé!

Bonjour,

Pour toi MFerrand ? Pas pour du trop grave j'espère.

tu as les données du gouvernement qui te le donne direct si ça t'intéresse.

Bien sûr ce sont les découpages actuels...

Ex :

Et sur geoportail.gouv.fr tu as les vielles cartes.

Tu peux voir Chaumontel en 1860 sur les cartes d'état-major, ou carrément sur les cartes de Cassini.

Et si tu as un smartphone android, tu as multicarto qui te permet aussi de les voir. C'est intéressant.

eric

Bonjour à tous !

Non rien de grave cette fois, c'est un rite annuel depuis 2012 (une sonde à changer). Je devrais passer en ambulatoire mais comme j'y vais seul en voiture et qu'il y a anesthésie. J'y passe la nuit... Je n'ai d'ailleur pas fai de vieux os ce matin, ce qui va me faire gagner du temps... L'infirmière qui voulait que j'attende le médecin, je lui ai dis : ça m'étonnerait ! Voyez s'il a laissé un message, est revenue étonnée me rapportant : il a juste dit prendre rendez-vous dans un an.

Je vous dit à plus tard. Dans l'immédiat, je rattrape...

Bonjour,

J'ai commencé à regarder d'un peu plus près et je suis curieux de savoir comment tu calcules les coordonnées présentes sur ta feuille ?

NB- Les coordonnées mesurées en points, sont des valeurs de type Single, il n'y a pas lieu de les ramener à des Integer, Excel se charge par ailleurs de les ramener à des valeurs prédéfinies par lui, à partir de la valeur demandée, valeurs qui ne sont d'ailleurs pas des entiers. (Tu as peut-être remarqué que lorsque tu fixes des valeurs de hauteur de ligne et de largeur de colonne, Excel les modifie le cas échéant...)

Pour pouvoir travailler correctement sur la construction de formes libres, on définit des coordonnées Left et Top par rapport à la forme elle-même. Le point (0, 0) étant l'angle supérieur gauche de la forme.

Ensuite, il s'agit de positionner ce point (0, 0), et dans ton cas, il y a un double positionnement : les formes doivent s'assembler pour former un groupe. Il y a donc lieu de définir pour chacune la position dans le groupe, c'est à dire les coordonnées de son point (0, 0) par rapport au point (0, 0) du groupe. Ces coordonnées de positionnement relatif sont propres à chaque forme.

Puis, de définir les coordonnées du point (0, 0) du groupe pour le positionner dans la feuille. Ce positionnement est commun pour toutes les formes.

Ce double positionnement permet d'introduire un correctif dès la construction pour que les formes dessinées soient simultanément positionnées.

J'ai fait manuellement le calcul des coordonnées de la forme qui comporte le moins de points, et le résultat me laisse un peu rêveur : cela donne peu de variation dans les coordonnées, certains points successifs sont quasiment l'un sur l'autre (surtout avec tes arrondis), tu doubles le bouclage (les dernière coordonnées reprennent déjà les premières...), et le résultat ne sera guère brillant... Celle que j'ai étudiée va s'inscrire dans un carré d'1/3 de cm ! pour voir quelque chose il faudra t'accrocher !

D'où ma question ?

Je pense qu'il faut reprendre à partir de la définition des coordonnées de chaque forme, de façon à les établir dans la perspective d'un dimensionnement de base que l'on voudra établir, en fonction du dimensionnement retenu pour le groupe, qui devra tout de même faire en sorte que les plus petites soient identifiables.

On pourra ensuite passer au code de construction qui gagnera à être révisé.

Cordialement.

Bonjour-bonsoir

Là il y a un très gros problème! J'ai tout compris .Et en dessinant plus gros, ça marche! J'y perds mon VBA

Tant que j'y étais, j'ai ajouté les contours et une couleur pour chaque commune en colonne 4

2695-72.zip (16.47 Ko)

Merci à vous et à Eriiic (j'ai enregistré son lien que je ne connaissais pas)

Les coordonnées que j'utilise ici sont celles trouvées là: https://upload.wikimedia.org/wikipedia/commons/d/de/Blank_Map_of_Val-d%27Oise_Department%2C_France%2C_with_Communes.svg

Encore une fois MERCI (mais j'comprends toujours pas si ce n'est qu'il ne faut pas dessiner trop petit)

Il ne me reste qu'à ecrire le nom des communes dedans, mais je verrais cela demain

Merci encore

Rechercher des sujets similaires à "dessiner forme connaissant sommets"