Calcul de distance sur des coordonnées

le_comptable

XLDnaute Nouveau
Bonjour à tous

je cherche à connaitre la distance entre des points.

( la formule mathematique d une distance entre A (xa,ya) et B (xb,yb) c est
Racine carré de (xb-xa)²+(yb-ya)² )

et si excel pouvait me dire les points qui ne sont separées que de 20 unités ou moins, ben ca serait genial

donc voila, j ai plein de points ( environ 400 ) et je sais pas du tout comment faire. J ai pensé mettre dans la cellule A1 mon premier point qu il le transforme deja en "sous".
je pourrais creer une colonne A abscisse, et B ordonnée mais si les cellules bougent à l interieur j perds mes points... ( c est pratique les sauvegardes )

je pourrais aussi lacher l affaire, mais l outil informatique est Formidable ! et que si je me creuse les meninges, j apprendrais toujours quelque chose...


bref, vous etes des pros, j espere que c est super simple pour vous ( parce que ca ne l est pas encore pour moi)

merci de votre attention.
 

mécano41

XLDnaute Accro
Re : Calcul de distance sur des coordonnées

Bonjour,

Voici une solution avec une formule pour 10 points mais sous EXCEL 2003 cela ne peut dépasser 256 points (256 colonnes maxi) sous 2007, je ne sais pas...

Je vais essayer de voir ce que l'on peut faire en VBA...

Cordialement
 

Pièces jointes

  • Distances entre les points d'un ensemble2.xls
    20.5 KB · Affichages: 275

mécano41

XLDnaute Accro
Re : Calcul de distance sur des coordonnées

Voici une solution tout en VBA. Je n'ai pas les limites en tête mais il ne doit pas y avoir de problème pour 400 points.

(n'oublie pas d'activer les macros)

Cordialement
 

Pièces jointes

  • Distances entre les points d'un ensemble3.xls
    28 KB · Affichages: 116

mécano41

XLDnaute Accro
Re : Calcul de distance sur des coordonnées

J'avais oublié que le nombre de lignes de résultats pour 400 points peut être de 79800 (>65536) si tout est inférieur à la distance demandée : il faut donc pouvoir répartir, le cas échéant, les résultats sur plusieurs groupes de 3 colonnes en choisissant une longueur de colonne (il n'y a pas de contrôle du Nb maxi de lignes ni du Nb maxi de colonnes possibles mais cela pourrait se faire si nécessaire...)

Voilà qui est fait. J'ai ajouté également un effacement auto. des résultats précédents.



Cordialement
 

Pièces jointes

  • Distances entre les points d'un ensemble4.xls
    32 KB · Affichages: 119

le_comptable

XLDnaute Nouveau
Re : Calcul de distance sur des coordonnées

comment vous etes puissant, j comprends toujours pas comment vous avez fait mais c est joli.

le document le comptable 2478 est assez simple, colonne A Abscisse Colonne B ordonnée
et les numeros qui suivent correspondent aux autres point qui sont à la distance definie en C1
( mais quand je change une valeur rien ne se passe, j comprends pas où je dois cliker pour que ca marche )

les documents de mecano ne sont pas pratiques pour ma saisie de point ( les coordonnées ont souvent 3 chiffres, genre 771 895, et j en ai vraiment beaucoup à taper...

ce qu on peut faire avec ce logiciel, c est epoustouflant....
peut etre mme on pourra calculer la distance entre les etoiles, ou plus pragmatique, la distance entre les collegues...

bref, j suis un newbie de chez newbie, j ai rien compris à comment vous avez fait, mais c est genial.
 

mécano41

XLDnaute Accro
Re : Calcul de distance sur des coordonnées

les documents de mecano ne sont pas pratiques pour ma saisie de point ( les coordonnées ont souvent 3 chiffres, genre 771 895, et j en ai vraiment beaucoup à taper...

Bonjour,

Je n'ai pas bien vu où est le problème ...peut-être la colonne vide entre les X et les Y? Il suffit de la supprimer...Pour des nombres plus longs il suffit d'élargir les colonnes...
Si c'est le fait de devoir nommer les zones de données X et Y, voici une version sans cela ; il suffit de rentrer les valeurs X à partir de A1 et Y à partir de B1 ; le N° de la ligne est donc le N° du point.

NOTA : j'ai l'habitude de nommer mes zones pour que l'utilisateur puisse ensuite faire la présentation qu'il souhaite en déplaçant, coupant ... des cellules, des lignes, des colonnes, sans que cela nuise au fonctionnement. Par exemple, si tu voulais ajouter une ligne en haut pour un titre dans cette nouvelle version, tu ne pourrais pas le faire car cela ne fonctionnerait plus.

Cordialement
 

Pièces jointes

  • Distances entre les points d'un ensemble5.xls
    34.5 KB · Affichages: 119

ROGER2327

XLDnaute Barbatruc
Re : Calcul de distance sur des coordonnées

Bonjour
(...)
le document le comptable 2478 est assez simple, colonne A Abscisse Colonne B ordonnée
et les numeros qui suivent correspondent aux autres point qui sont à la distance definie en C1
( mais quand je change une valeur rien ne se passe, j comprends pas où je dois cliker pour que ca marche )
(...)
J'ai pourtant donné la marche à suivre :
Mettre une distance en C1 et valider :

Pour chaque point, les numéros de ligne des points situé à une distance maximum de la distance indiquée en C1 sont affichés.
.
Vous trouverez ci-joint une modification avec l'ajout d'un bouton pour lancer le calcul sans modifier la valeur en C1.​
ROGER2327
#2481
 

Pièces jointes

  • le_comptable_2481.xls
    28 KB · Affichages: 95

Lii

XLDnaute Impliqué
Re : Calcul de distance sur des coordonnées

bonjour,

autre présentation (à partir du fichier de ROGER2723).
Là aussi, la mise à jour se fait après la saisie de la distance (en B1).
On a, sur chaque ligne, les points correspondants associés au point de la colonne A.
 

Pièces jointes

  • SiDistance.zip
    9.4 KB · Affichages: 66

ROGER2327

XLDnaute Barbatruc
Re : Calcul de distance sur des coordonnées

Bonjour
Les modifications de Lii sont intéressantes lorsque les points sont nommés A1, A2, ...
On peut aussi ne pas rechercher les couples mais plutôt les paires de points au sens mathématique de ces termes.
Pour ceux qui auraient oublié, ravivons nos souvenirs du cours de Cinquième (dans les années soixante et dix du siècle passé) :
  • un couple d'éléments d'un ensemble E est un élément de l'ensemble E x E. (1;3), (5;2) sont des couples d'entiers. Mais aussi (0,0), (1,1), etc..
    On emploie ça couramment lorsqu'on fait des graphiques et qu'on représente des point par leurs coordonnées. Remarquons que (1;2) ≠ (2,1) : le point d'abscisse 1 et d'ordonnée 2 n'est pas le point d'abscisse 2 et d'ordonnée 1.
  • une paire d'éléments d'un ensemble E est un élément de l'ensemble des parties de E. {1;3}, {5;2} sont des paires d'entiers. Remarquons que {1;2} = {2;1} : le fait de nommer les nombres dans un ordre quelconque ne change pas le fait que ce sont les mêmes nombres qui sont nommés et par conséquent la même partie de l'ensemble des entiers qui est décrite.
    Remarquons aussi que {2;2} n'est pas une paire d'entiers puisqu'on ne distingue dans cette liste que l'entier 2 : {2;2} = {2}.
Dans ma première approche, je m'étais placé du point de vue des couples (point de vue mathématique normal si j'en crois mon vieux professeur, la distance étant, selon lui et beaucoup d'autres, définie pour un couple de points). C'est pourquoi j'associais systématiquement chaque point à lui-même. La distance d'un point A au même point A est nulle et, par conséquent inférieure ou égale à toute longueur qu'on voudra. Comme c'est évident, on peut l'admettre implicitement et ne pas le noter. On s'intéresse alors uniquement à la distance de deux points distincts.

D'autre part, chance insolente, la distance d'un point A à un point B (distinct de A) est toujours égale à la distance du point B au point A, l'ordre dans lequel on considère les points n'a pas d'importance et il suffira de s'occuper des paires de points. C'est le point de vue qu'a adopté Lii.

Sur cette base, je propose l'aménagement de mon code de la feuille "Feuil1" comme suit :
Code:
[COLOR="DarkSlateGray"][B]Private Sub Worksheet_Change(ByVal Target As Range)
   If Target.Cells(1, 1).Address = "$B$1" Then toto
End Sub

Sub toto()
Dim oCel1 As Range, oCel2 As Range, dCel As Range, D As Double, n As Long, tf As Boolean, oMsg As String
   With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With
   Set dCel = Range("B2").End(xlDown)
   If dCel.Row <> Rows.Count Then
      Range(Range("D2"), Range("D2").SpecialCells(xlLastCell)).ClearContents
      On Error GoTo A
      D = Range("B1") ^ 2
      On Error GoTo 0
      If D Then
         For Each oCel1 In Range(Range("B2"), dCel.Offset(-1, 0)).Cells
            For Each oCel2 In Range(oCel1.Offset(1, 0), dCel).Cells
               On Error GoTo E
               If (oCel1.Value - oCel2.Value) ^ 2 + (oCel1.Offset(0, 1).Value - oCel2.Offset(0, 1).Value) ^ 2 <= D Then
                  On Error GoTo D
                  oCel1.End(xlToRight).Offset(0, 1).Value = Cells(oCel2.Row, 1).Value
                  oCel2.End(xlToRight).Offset(0, 1).Value = Cells(oCel1.Row, 1).Value
                  On Error GoTo 0
                  n = n + 1
               End If
            Next oCel2
         Next oCel1
      End If
   End If
S: With Range("D1")
      .Value = n
      .NumberFormat = IIf(n > 1, "General"" paires""", "General"" paire""")
   End With
   If tf Then msgbox oMsg
C: With Application: .Calculation = xlAutomatic: .EnableEvents = True: .ScreenUpdating = True: End With
Exit Sub
[COLOR="SeaGreen"]'[/COLOR]
E: msgbox "Données incorrectes :" & vbLf & "(" & Cells(oCel1.Row, 1).Value & ") " & oCel1.Value & " ; " & _
      oCel1.Offset(0, 1).Value & vbLf & "(" & Cells(oCel2.Row, 1).Value & ") " & oCel2.Value & " ; " & _
      oCel2.Offset(0, 1).Value
   On Error GoTo 0
   Resume C
[COLOR="SeaGreen"]'[/COLOR]
D: If tf Then Resume Next
   tf = True
   oMsg = "Toutes les solutions ne sont pas affichées."
   Resume Next
[COLOR="SeaGreen"]'[/COLOR]
A: msgbox "Donnée incorrecte en B1."
   Resume S
End Sub[/B][/COLOR]
Ce code est plus rapide que l'ancien. (Et même beaucoup plus rapide si quelques classeurs un peu lourds en calculs sont ouverts en arrière-plan.)
J'en ai profité pour y intégrer quelques procédures de gestion d'erreurs possibles : nombre insuffisant de colonnes pour afficher tous les résultats, donnée non numérique en B1 par exemple.
A tester dans le classeur joint. Les propositions d'amélioration sont bienvenues...​
ROGER2327
#2483
 

Pièces jointes

  • le_comptable_2483.zip
    16.8 KB · Affichages: 48

mécano41

XLDnaute Accro
Re : Calcul de distance sur des coordonnées

Bonjour,

Pour info. dans mon calcul, j'ai également éliminé les distances des points à eux-mêmes (élimination de la diagonale nulle de la matrice) et les distances symétriques (élimination de la partie supérieure de la matrice puisque Aij = Aji)

Cordialement
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Calcul de distance sur des coordonnées

Bonjour à tous
A mécano41 :

J'ai regardé votre classeur avec intérêt car il offre une autre vision de la question. L'ayant testé avec une série de trois cents données, je l'ai trouvé un peu lent. Après analyse, il apparaît que c'est l'affichage des données qui prend l'essentiel du temps de travail, le calcul étant très rapide.
Je me permets donc de vous soumettre une version modifiée qui accélère beaucoup la manœuvre si quelques dizaines de milliers de résultats doivent être affichés.
J'en ai profité pour ajouter une procédure de modification du nombre de lignes d'affichage si le nombre de colonnes découlant du choix de l'utilisateur est trop important.
J'ai respecté la structure de votre tableau de résultats : il n'y a donc aucune modification de l'apparence de la feuille, et nos deux procédures peuvent travailler sur la même feuille.
Ci joint le classeur avec nos deux procédures et un échantillon de trois cents données.​
Cordialement,
ROGER2327
#2486
 

Pièces jointes

  • Distances entre les points d'un ensemble5_bis.zip
    19.7 KB · Affichages: 99

mécano41

XLDnaute Accro
Re : Calcul de distance sur des coordonnées

Bonjour Roger2327,

Je n'avais pas essayé sur un grand nombre de données ; c'est vrai que c'est lent...Je vais regarder cela plus en détail ; je pense que vous avez utilisé un tableau de variants pour le résultats, tableau qui est ensuite transféré dans la feuille ; j'avais déjà utilisé cette méthode ; c'est vrai qu'elle est très rapide, on peut le vérifier ici...c'est quasi immédiat.

Merci de l'intérêt porté...

Cordialement
 

Statistiques des forums

Discussions
312 302
Messages
2 087 041
Membres
103 439
dernier inscrit
julienpipiou