Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/10/2011, 10h41   #1
Invité de passage
 
Homme Jonathan
Inscription : octobre 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Jonathan
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 21
Points : 4
Points : 4
Par défaut Distances entre x et y

Bonjour tout le monde,

Je bloque sur la création d'une macro.
Je m'explique: j'ai un point d'origine et 10 points de livraison. Les 11 points ont des coordonnées x et y.

J'aimerai déterminer via une macro la distance entre tous ces points et l'afficher dans un tableau (nom des colonnes => point d'origine jusqu'au 10e point de livraison et nom des lignes => point d'origine jusqu'au 10e point de livraison). Exemple: on pourrait donc lire dans ce tableau la distance de 1 à 2, de 4 à 2, de 1 à 10, de 0 à 9, etc.

La distance entre deux points se calcule comme cela: racine((x1-x2)²+(y1-y2)²).

Ci-joint la trame excel, les coordonnées des points sont sur l'onglet "Coordonnees" et on essaye de remplir l'onglet "Distance".

J'ai déjà déclaré x et y:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Coordonnees()
 
Dim i As Integer
Dim x As Integer
Dim y As Integer
 
For i = 2 To 12
    x = Worksheets("Coordonnees").Cells(2, i).Value
    y = Worksheets("Coordonnees").Cells(3, i).Value
 
Next i
 
End Sub
Est-ce que quelqu'un a une idée ?

Merci d'avance.
Fichiers attachés
Type de fichier : xls Fichier.xls (23,0 Ko, 6 affichages)
JonathanF est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 31/10/2011, 11h01   #2
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
Bonjour,

Je te propose le morceau de code suivant
Code :
1
2
3
4
5
6
7
8
9
10
11
For i = 1 To 11
    For j = 1 To 11
        x1 = Worksheets("Coordonnees").Range("B2").Offset(0, i - 1).Value
        y1 = Worksheets("Coordonnees").Range("B3").Offset(0, i - 1).Value
        x2 = Worksheets("Coordonnees").Range("B2").Offset(0, j - 1).Value
        y2 = Worksheets("Coordonnees").Range("B3").Offset(0, j - 1).Value
 
        Range("B2").Offset(i - 1, j - 1) = Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
 
        Next j
        Next i
Cela te conviendrait-il ?
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h11   #3
Invité de passage
 
Homme Jonathan
Inscription : octobre 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Jonathan
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 21
Points : 4
Points : 4
Bonjour,

Merci ça fonctionne bien mais peux-tu m'expliquer le code stp.
Je ne connais pas .Offset...

Merci de ton aide.
JonathanF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h20   #4
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
Offset signifie décalage. L'origine du référentiel de décalage est défini par rapport à la cellule à laquelle on applique l'offset (dans mon code : B2 ou B3).
Un offset de (0,0) correspond à la cellule de départ :

Range("B2").Offset(0,0) renvoie la cellule B2
Range("B2").Offset(1,0) renvoie la cellule B3
Range("B2").Offset(0,1) renvoie la cellule C2
Range("B2").Offset(1,-1) renvoie la cellule A3

etc.. Tu saisis ?
Dans mon code, cela sert simplement à parcourir les cellules des lignes x et y pour affecter à x1, x2, y1 et y2 les valeurs de tous les couples possibles (x1;y1) et (x2;y2)

A ta disposition
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h22   #5
Invité de passage
 
Homme Jonathan
Inscription : octobre 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Jonathan
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 21
Points : 4
Points : 4
Ok merci. Et sans offset ça aurait donné quoi ?
JonathanF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h28   #6
Membre du Club
 
Homme
Inscription : janvier 2010
Messages : 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 176
Points : 67
Points : 67
On aurait pu écrire :

Code :
1
2
3
4
5
6
7
8
9
10
11
For i = 1 To 11
    For j = 1 To 11
        x1 = Worksheets("Coordonnees").Cells(2,i+1).Value
        y1 = Worksheets("Coordonnees").Cells(3,i+1).Value
        x2 = Worksheets("Coordonnees").Cells(2,j+1).Value
        y2 = Worksheets("Coordonnees").Cells(3,j+1).Value
 
        Range("B2").Offset(i - 1, j - 1) = Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
 
    Next j
Next i
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h45   #7
Invité de passage
 
Homme Jonathan
Inscription : octobre 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Jonathan
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 21
Points : 4
Points : 4
Merci !

J'ai finalement codé comme ça:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub Coordonnees()
 
Dim i As Integer
Dim j As Integer
Dim x1 As Integer
Dim x2 As Integer
Dim y1 As Integer
Dim y2 As Integer
 
    For i = 2 To 12
        For j = 2 To 12
            x1 = Worksheets("Coordonnees").Cells(2, i).Value
            y1 = Worksheets("Coordonnees").Cells(3, i).Value
            x2 = Worksheets("Coordonnees").Cells(2, j).Value
            y2 = Worksheets("Coordonnees").Cells(3, j).Value
 
            Worksheets("Distance").Cells(i, j) = Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
        Next j
    Next i
 
End Sub
J'aimerai n'afficher que la partie haute symétrique du tableau sans les 0 (un résultat seulement par couple en fait).
Je pense qu'il faut rajouter un if ou une boucle comme while i-j >0 ?
JonathanF est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 12h03   #8
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Coordonnees()
Dim i As Byte, j As Byte
Dim x1 As Integer, x2 As Integer, y1 As Integer, y2 As Integer
 
With Worksheets("Coordonnees")
    For i = 2 To 11
        For j = i + 1 To 12
            x1 = .Cells(2, i).Value
            y1 = .Cells(3, i).Value
            x2 = .Cells(2, j).Value
            y2 = .Cells(3, j).Value
            Worksheets("Distance").Cells(i, j) = Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
        Next j
    Next i
End With
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/10/2011, 13h16   #9
Invité de passage
 
Homme Jonathan
Inscription : octobre 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Jonathan
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 21
Points : 4
Points : 4
J'ai bien compris merci !
JonathanF est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h06.


 
 
 
 
Partenaires

Hébergement Web