IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

MACRO pour rechercher les 2 valeurs les plus proches


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut MACRO pour rechercher les 2 valeurs les plus proches
    Salut à tous!

    Je cherches à créer une petite macro afin d'entrer et de trouver les 2 valeurs les plus proches (coordonnées x et y dans 2 colonnes) des 2 valeurs connues et à entrer.
    Le soucis c'est que la macro ne doit pas scanner les colonnes indépendamment mais garder les valeurs x et y associées par ligne.
    La façon d'introduire les 2 valeurs est aussi problématique...

    Bref, je nage....

    Je ne sais pas si j'ai expliqué assez clairement mon problème, mais si quelqu'un avait une petite idée sur la question, je suis preneur.

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    à mon avis, il manque une équation.
    supposons on a Xo=12 et Yo=12
    on prends le couple (X=7, Y=5) ou le couple (X=5, Y=7) ?
    c'est un exemple
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Et bien, il s'agit de coordonnées cartésiennes X et Y en mètres tel que:
    X=4640976,542 Y=281124,42

    Les données à comparer sont donc de la même forme.
    X étant toujours supérieur à Y pour la zone concernée.

    Est ce que ça aide un peu ?

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Avant d'entamer la macro ou autre moyen, il faut clarifier ma précédente question
    le problème se résume à ceci
    Etant donné un couple initial Mo(Xo, Yo)
    On chercher Mi (Xi, Yi) tel que |Xi-Xo| est minimale et |Yi - Yo| est minimale.

    Ma précédente question était que théoriquement on peut trouver plusieurs Mi qui répondent au critère.

    Une première approximation:
    en colonne A on a les X et en colonne B les Y
    en M1 on a Xo et en M2 on a le Yo

    en fait dans:
    colonne C: Cx=Abs(Ax-$M$1)/Ax
    colonne D: Dx=Abs(Bx-$M$2)/Bx
    colonne E: Ex=Cx+Dx
    on copie les formules de la ligne 2 jusqu'à la ligne z (z étant la dernière ligne)
    N1:Min(E2:Ez)
    on cherche dans la colonne E cette valeur minimale.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Cette solution fonctionne très bien pour des coordonnées positive mais le soucis c'est que pour celle-ci (Lambert93) les Y sont parfois négatifs.
    Du coup, je l'ai modifiée très légèrement en ajoutant :

    [colonne C: Cx=Abs(Ax-$M$1)/Ax
    colonne D: Dx=Abs(Bx-$M$2)/ ABS(Bx)
    colonne E: Ex=Cx+Dx]

    Ne me reste plus qu'à mettre un système qui met en évidence la ligne contenant les valeurs en question parmi les 200 lignes de mon tableau.
    Peut être utiliser le solver pour la mettre en couleur?
    Qu'en pensez vous?


    Et encore merci à Mercadog pour tant de réactivité!

    Ma première incursion sur ce forum ne sera pas la dernière.

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Edit;
    Ci-joint la modification du code
    En fait si on a un point initial Mo(Xo, Yo), on cherche les points M(X, Y) tels que la distance [M,Mo] soit minimale, c'est à dire en cherche les points qui se trouvent à l'intérieur du disque centré en Mo et de rayon minimal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Sub ValRapp()
    Dim i As Long, LastLig As Long, iRow As Long
    Dim TabX, TabY, TabEc() As Double
    Dim Xo As Double, Yo As Double, Minima As Double
     
    With Sheets("Feuil1")               'à adapter
        .Cells.Interior.ColorIndex = xlNone
        Xo = .Range("F1").Value         'Xo en F1   à adapter
        Yo = .Range("F2").Value         'Yo en F2   à adapter
        LastLig = .Cells(Rows.Count, 1).End(xlUp).Row
        TabX = Application.Transpose(.Range("A2:A" & LastLig))  'les X en colonne A
        TabY = Application.Transpose(.Range("B2:B" & LastLig))  'les Y en colonne B
        ReDim TabEc(1 To LastLig - 1)
        For i = 1 To LastLig - 1
            TabEc(i) = (TabX(i) - Xo) ^ 2 + (TabY(i) - Yo) ^ 2
        Next i
        Minima = Application.Min(TabEc)
        For i = 1 To LastLig - 1
            If Abs(Minima - TabEc(i)) < 0.0001 Then Exit For
        Next i
        iRow = i + 1
        .Rows(iRow).Interior.ColorIndex = 3
        MsgBox "La ligne répondant au mieux aux critères (" & Xo & ", " & Yo & ") est la ligne: " & iRow
    End With
    End Sub
    Ceci pour exemple et peut être remplacé par une fonction.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/09/2014, 16h09
  2. recherche de la valeur la plus proche
    Par chadi18 dans le forum SAS Base
    Réponses: 19
    Dernier message: 20/01/2010, 11h04
  3. requête pôur sélectionner les 5 valeurs les plus grandes ?
    Par kikidrome dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/11/2007, 16h29
  4. Réponses: 6
    Dernier message: 04/11/2007, 22h15
  5. [MySQL] Extraire les 50 valeurs les plus proches d'un entier
    Par denis.ws dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 19/01/2007, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo