Comment programmer un calcul de surface ?
Résoluccm81 Messages postés 11033 Statut Membre -
Autant préciser tout de suite que je ne connais pas trop Excel (j'utilise la version 97) et encore moins Open Office] (j'utilise la version 3.3), mais j'ai un problème récurent que je souhaiterai éliminer, alors je lance une bouteille sur le net :-)
Voilà mon soucis :
Je reçois régulièrement des listings de coordonnées au format "nxy.txt" (où n est un numéro de point, x et y ses coordonnées cartésiennes) le tout avec un séparateur "espace".
Mon problème est de calculer la surface de polygones à partir de ces fichiers (en s'appuyant sur une documentation papier précisant la liste des points formants les différents polygones à calculer). Il s'agit en fait d'une vérification de calculs topométriques.
J'ai trouvé une formule permettant de faire le calcul sur un forum :
"c'est facile : soit un polygone de n points (le dernier a les mêmes
coordonnées que le premier, sinon, on ajoute le premier point à la liste)
soit X[1] et Y[1] les coordonnées du premier point et n le nombre de
points (donc X[n] = X[1] et Y[n] = Y[1])
la surface est la valeur absolue (le signe du résultat dépend du sens de
parcours du polygone) de la somme pour i variant de 1 à n de
( X[i+1] - X[i] ) * ( (Y[i] + Y[i+1] - 2*Y[1] ) / 2
Bref, c'est plus long à expliquer qu'à programmer..."
J'ai alors essayé de jouer aux apprentis programmeur sur Excel, et comme l'avais si bien souligné mon interlocuteur, bien plus facile à dire qu'à faire :-(
J'aimerai vous transmettre ma modeste ébauche pour voir s'il serait possible d'améliorer cet essai :-)
Malheureusement, je ne sais pas comment il faut faire :-(
je souhaiterai :
1) Que l'on vérifie que mes calculs sont corrects, le plus souvent tout se passe bien, mais parfois je trouve des résultats bizarres (je suis alors obligé d'utiliser un logiciel de Dessin Assisté par Ordinateur, relier tous ces points dans le bon ordre, puis de demander un calcul de surface. Le résultat confirme souvent mon intuition à savoir que mon fichier excel déconne, du coup je ne suis jamais vraiment sûr de mon coup)
2) Remplir directement le tableau en sélectionnant le fichier ".txt" (et non : l'ouvrir dans excel puis copier et coller les valeurs dans mon tableau). Ce qui au passage résoudrait les problèmes liés à la taille de mon tableau (j'ai prévu 200 lignes pour être tranquille, mais parfois les listings de points sont très long et je dois faire une sélection en amont)
3) Le calcul nécessite de désigner l'ordre d'apparition des points (le parcours du périmètre du polygone). J'ai donc prévu à cet effet une colonne "N° d'Ordre".
Y-a-t'il une possibilité de remplir cette colonne à la souris ? En prévoyant un retour au point précédent en cas d'un clic hasardeux (très ennuyeux de tout recommencer quand on en est au 98ième point ....)
Voilà, par avance merci à tous d'avoir lu ce message, merci à ceux qui pourront m'aider et j'espère à très bientôt ;-)
- Tableau excel calcul 1/120
- Tableau word - Guide
- Trier un tableau excel - Guide
- Alcohol 120 - Télécharger - Émulation & Virtualisation
- Imprimer un tableau excel - Guide
- Liste déroulante excel - Guide
120 réponses
Calculer et vérifier la surface de polygones à partir de listings de points X et Y fournis dans des fichiers texte, avec import direct et ordre des points déterminant le périmètre.
Pour cela, il est recommandé de fermer le polygone en répétant le point initial et d’utiliser une méthode robuste comme l’algorithme du shoelace qui donne l’aire absolue quelle que soit l’orientation.
Une solution pratique avancée est une fonction VBA AirePoly qui prend des plages X et Y, ferme le polygone en ajoutant le premier point à la fin, puis calcule l’aire via la somme croisée et renvoie le résultat positif.
Des échanges portent également sur l’importation du fichier txt (et non un collage), l’optimisation de l’interface et l’ajout d’une colonne « N° d’Ordre » pour tracer l’ordre des points, avec des outils pour éviter les retours en arrière.
Enfin, des conseils soulignent l’importance de prévenir les arêtes croisées et d’assurer des coordonnées cohérentes afin d’éviter des résultats incohérents.
pourrait-on supprimer le bouton "effacer" et coupler son action avant la sélection du fichier?
Je ne sais plus comment te remercier, c'est vraiment tu travail d'artiste :-)
Par contre je ne sais pas si tu ma réponse au message précédent (lien 28), car là c'est sûr je ne saurais jamais transposer ça sur mon deuxième projet
pourrait-on supprimer le bouton "effacer" et coupler son action avant la sélection du fichier?
on n'en est pas là, la première chose à faire est de régler le problème de l'importation
2. donc tu réponds à mon post #36
2. pour ce qui est des noms du même type , pas de problème, on affiche comme actuellement les ".txt"
3. la boite de dialogue (OpenDialog) n'est apparemment pas reconnue par excel 97
on va quand même vérifier quelque chose
Quand tu est dans l'éditeur vba
Outils/References est ce que les references suivantes (aux numéros de version près) sont cochées
Visual basic for applications
Microsoft excel 10.0 Object library
OLE automation
Microsoft forms 2.2 object library
microsoft office 10.0 object library
sinon tu essaies de les cocher (si elles y sont)
tu dis
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionhttps://www.cjoint.com/?BIptu6HQ8nL
2. donc la boite de dialogue OpenDialog (avec l'arborescence des dossiers) n'est pas disponible avec excel 97
3. il faudra donc indiquer quelque part le dossier où se trouveront tes fichiers.
Le nom du dossier devra donc figurer quelque part
- soit dans une cellule comme dans l'exemple (solution souple)
- soit en "dur" dans le code (une constante du genre dossier = C:\Donnees) mais il faut intervenir sur le code en cas de changement de dossier (déconseillé)
4. l'erreur de type (post #35) me semble venir du fait que les valeurs importées ne sont (peut être) pas des nombres (dans ton fichier il y a un point au lieu d'une virgule) à moins que tu n'aies changé ça dans tes options
pour vérifier tu fais une bête addition de deux valeurs (colonne B)
tu dis ce qu'il en est
5. Pour les séparateurs espace ou ; ou , ou - il faudra adopter une solution du genre de celle du dossier
une idée ... à moins que tout caractère non numérique soit vu comme un séparateur
Une fois tout ça réglé/précisé, on reviendra sur ta config
Désolé mais j'ai également un soucis de voiture, donc en ce moment je jongle pas mal sur les forums pour essayer de régler un pb de vitre électrique, bref ....
Pour le 3) ça risque d'être très ennuyeux, mais bon pour autant, la version souple me convient très bien :-)
Pour le 4) le problème vient peut être du "." et non de la "," le soucis est que j'utilise des logiciels de DAO avec des outils développés par la boîte, ces outils ne marchent que si les paramètres régionaux sont réglés sur "séparateur décimal = ." :-(
Donc les fichiers que je reçois, sont par convention avec ce type de séparateur, ainsi je ne suis pas obligé de changer les paramètres à chaque fois que j'utilise l'un ou l'autre des logiciels.
Pour le 5), comme je te le disais dans un précédent post, j'ai à 95% du séparateur "espace", donc inutile de s'ennuyer avec ça (quand j'aurai des séparateurs différents je ferais simplement la modif directement sur le fichier .txt avant l'import)
Je suis ennuyé, mais si je ne règle pas mon pb de voiture avant demain, je risque d'être ennuyé.... Je te laisse, encore merci pour ton aide . Si j'ai fini, je reviens sur le forum ce soir, sinon à lundi
IMPORTANT : un voisin m'a dit qu'il pouvait se procurer office 2010 (il l'a pris à son boulot et l'a installé chez lui). Il m'a dit qu'il pourrait s'arranger ... :-)
Ma question est simple : est-ce que excel 97 et 2010 peuvent cohabiter sans soucis ? Si NON, Est-ce-que mes fichiers avec macros vont correctement fonctionner sous 2010 ?
https://www.cjoint.com/?3Iqtbq5XqgK
je n'ai rien tenté sur le séparateur décimal
tu dis comment ça se passe
excel 97 et 2010 peuvent en principe co-habiter, ils ne sont pas logés dans le même dossier
pour ce qui est de la compatibilité, il ne devrait pas y avoir de problème avec les macros 97 utilisées avec 2010 (c'est, en principe, le contraire qui pose problème)
si ça doit tourner uniquement sur 2010, on pourra revenir à la boite de dialogue pour l'importation, ce qui règlerait le point 3
bonne suite
Désolé, je pensais avoir répondu à ton dernier message, mais apparemment j'ai oublier de valider mon post :-(
Quelques problèmes subsistent :
1) le bouton "RAZ" fonctionne, mais il faudrait vider le contenu des cellules "N° Points" dans l'onglet "Saisie"
2) le bouton "Importer" fonctionne parfaitement si au préalable je vide manuellement le contenu des cellules "N° Points" dans l'onglet "Saisie", sinon j'ai une erreur cf ci-dessous :
https://www.cjoint.com/?BItoybuvSGF
et Excel plante :
https://www.cjoint.com/?BItoyVieJjB
3) erreurs quand je clic sur le bouton "Actualiser le Graphique"
https://www.cjoint.com/?BItotQRqfpC
https://www.cjoint.com/?BItoujH2CcZ
REM : Si j'ouvre ton fichier dans 2010, tout fonctionne correctement sauf l'Actualisation du graphique .
La macro marche pour des polyèdres "simples" (6 sommets), mais le résultat n'est pas correct pour des polyèdres "complexes" .
Cf exemple ci dessous concernant un polyèdre à 34 sommets
https://www.cjoint.com/?BItoCMQhiG5
Merci pour tout tes efforts
@ bientôt
les données : https://www.cjoint.com/?BItoOADbAuY
les surfaces à vérifier : https://www.cjoint.com/?BItoPqzsqDT
une copie du graphe à obtenir : https://www.cjoint.com/?BItoTLIGqp3
quand je fais les calculs des lots A , B ... ça marche nickel :-)
quand je lance le lot K, le graphe ne s'actualise pas correctement :-(
Cf post précédent
Evidemment, le graphique ne comprend ni les "Noms" des points, ni les coordonnées correctes sur les axes (pour les axes je crois que j'y arriverai tout seul, mais pour les noms des points dans les étiquettes ça me paraît plus hard)
@+
1. nettoyage de la feuille saisie par RAZ de la feuille Listing
2. actualisation du graphique
des plages de la feuille Calcul ont été nommées !
https://www.cjoint.com/?3Itrz7simJ1
qu'est ce que ça donne?
J'ai fais l'essai avec ton nouveau fichier (avec 97), mais j'ai toujours le même problème quand je clic sur "RAZ"
https://www.cjoint.com/?BItsFBgfZxE
https://www.cjoint.com/?BItsF1oKrp4
Si je clic direct sur importer (après avoir correctement renseigné la cellule G3, Excel plante et je vois qu'il y a "FAUX" écrit dans la cellule G5
https://www.cjoint.com/?BItsNI34P0r
Par contre, ton idée de la possibilité de créer une liste déroulante des dossiers possibles est Top.
En effet, j'ai un dossier dédié dans lequel je mets les dossiers qui me sont transmis, donc ton idée me permettrai de ne pas avoir à saisir manuellement les données relative à l'emplacement des fichiers :-)
Mon arborescence dans D est du style :
dossier : "Documents à Vérifier"
=> dossier "20120918" (date du jour)
=> dossiers de données "CCC DA 1548","CCC DA 26", ...etc.
où CCC est un n° correspondant à la commune (3 chiffres = n° INSEE communal)
DA = partie fixe
1548, 26, ...etc = Numéro du document (change tout le temps)
quand clic sur "Importer" (après avoir renseigné G3 et sélectionné dans la liste G5), l'import se passe correctement, mais il subsiste dans la liste les points du dernier import :-(
quand clic sur "RAZ" j'ai une erreur :
erreur : https://www.cjoint.com/?BIts2xcGevO
code : https://www.cjoint.com/?BIts3aiaULf
Q2. quand tu fais Nouvelle sélection (feuille saisie) est ce que ça fonctionne?
Non, quand je clic sur Nouvelle Sélection, ça ne marche pas :
https://www.cjoint.com/?BIttk4jfUvM
Code :
Public Sub btNouvelle_Click()
' nettoyage colonne k
Sheets(nomFS).Range(tk).ClearContents
' echelles auto pour les axes du graphique
With Sheets(nomFS).ChartObjects(1).Chart.Axes(xlCategory)
.MinimumScaleIsAuto = True
.MaximumScaleIsAuto = True
.MinorUnitIsAuto = True
.MajorUnitIsAuto = True
End With
With Sheets(nomFS).ChartObjects(1).Chart.Axes(xlValue)
.MinimumScaleIsAuto = True
.MaximumScaleIsAuto = True
.MinorUnitIsAuto = True
.MajorUnitIsAuto = True
End With
End Sub
J'utilise "FastStone Capture" pour faire des copies d'écran, mais quand je suis sur la fenêtre VBA, parfois (c'est ça qui est bizarre !!!) quand je clic pour faire une capture d'écran, mon fond de plan change : je suis basculé sur la feuille Excel (c''est à cause de ça que je t'ai envoyé dans mon dernier post un copier/coller direct du code), donc impossible de te transmettre une visualisation d'écran .
Tu sais si je dois faire une opération particulière , dans "excel", dans "FastStone Capture"?
https://www.cjoint.com/?BIttYV5jqaY
message : https://www.cjoint.com/?BItt30oAqKl
code : https://www.cjoint.com/?BItt4yiBKWw
d'abord,
tu enregistres mon fichier sous le nom calcul_surface-M6 quelque part
tu ouvres ce nouveau fichier
1. l'erreur sur .minimumscale = mini
tu fais debogage
tu cliques sur mini (te permet de lire la valeur actuelle de mini)
qu'est ce qu'il dit?
il doit y avoir la valeur de la feuille Calcul (N8)
dans cette feuille,
verifies que les noms
- emini correspond à =Calcul!$N$8
- emaxi correspond à =Calcul!$N$7
2. l'erreur sur .MinimumScaleIsAuto = True
en utilisant l'éditeur de macro, dans la feuille Saisie tu crées une nouvelle macro
et tu mets l'échelle des axes du graphique à auto
tu cliques sur une cellule puis de nouveau tu modifies les échelles du graphique, tu mets n'importe quoi
arreter l'enregistrment
tu regardes si le code est compatible avec le mien
tu dis