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 Sélection de points sur courbe/Récupération des points


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Par défaut Macro Sélection de points sur courbe/Récupération des points
    Bonjour à toutes et à tous,

    Avant tout je voudrais vous remercier pour votre aide concernant ce sujet, n'étant pas un génie dans l'élaboration de macro, votre aide me sera très utile.

    Voilà, je démarre avec un classeur excel, sur la première feuille j'ai des données de 3 points. Chaque points possède 3 colonnes ( y,x,raideur) de 3200 lignes. Donc 9 colonnes en tout.
    Sur la feuille 2, j'ai un graphe représentant l'évolution de chaque point (y en fonction de x).

    Je souhaiterai mettre en place une macro capable de:

    1-me donner tout les points d'inflexion(x et y) de la courbe obtenu (pas seulement le min/max de celle ci):

    - Soit en se basant du graphe

    -Soit ( de manière plus précise) en se basant sur les données.

    2-De plus, lorsque la macro a trouvé les points d'inflexion soit :

    - ces données sont directement rentrées dans un tableau en feuille 3

    - ces points sont visible/différencier des autres points ( changement de couleur) de la courbe ( comme par exemple fichier joint Courbe+point inflexion)

    3-l'utilisateur doit pouvoir à l'issu de ces points trouvés par la macro, sélectionner 2 points et une droite se trace automatiquement entre ces 2 points ( Cf exemple fichier joint Courbe+point inflexion+droite)

    L'objectif est de calculer l'air entre la courbe de base et cette droite. Donc récupérer l'équation de la droite est essentiel pour pouvoir effectuer ce calcul.

    Je ne sais pas si vous allez pouvoir m'aider et j'ai besoin de le faire absolument sous excel. (Si ça avait été sur Matlab ça aurait été plus simple pour moi).

    Je vous remercie d'avance pour toute aide que vous porterez à ce sujet.

    Thks
    Images attachées Images attachées    

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Hasturiaz Voir le message
    n'étant pas un génie dans l'élaboration de macro
    Ca n'a rien d irrémédiable : http://bidou.developpez.com/article/VBA/

    1-me donner tout les points d'inflexion(x et y) de la courbe obtenu (pas seulement le min/max de celle ci):
    - Soit en se basant du graphe
    -Soit ( de manière plus précise) en se basant sur les données.
    C'est sur les données que tu dois travailler.
    Fais une boucle qui scrute toutes tes données.
    Pour chacune, fais la différence par rapport à la données suivante.
    Si cette différence est de signe différent par rapport à la différence précédente, tu tiens un des points d'inflexion.

    - ces points sont visible/différencier des autres points ( changement de couleur) de la courbe
    Quand tu trouves un point d'inflexion, tu peux avoir son indexe (par la variable qui s'incrémente dans ta boucle).
    Tu peux alors changer les propriétés du point dans la courbe .
    La syntaxe dépend de beaucoup d'éléments que tu ne donnes pas mais, par exemple, pour un graphe se trouvant dans une feuille de calcul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("MonOnglet").ChartObjects("Graphique 1").Chart.SeriesCollection(1).Points(10)
    fait référence au point 10 de la première courbe du graphe Graphique 1 se trouvant dans la feuille MonOnglet.

    Pour changer son aspect, regarde dans l'aide VBA les propriétés de l'objet Point, en particulier toutes celles commençant par Marker.

    3-l'utilisateur doit pouvoir à l'issu de ces points trouvés par la macro, sélectionner 2 points et une droite se trace automatiquement entre ces 2 points ( Cf exemple fichier joint Courbe+point inflexion+droite)
    L'objectif est de calculer l'air entre la courbe de base et cette droite. Donc récupérer l'équation de la droite est essentiel pour pouvoir effectuer ce calcul.
    Pour ça, il faut que tu calcules l'aire se trouvant entre la courbe et l'axe des abscisses et lui soustraire l'aire se trouvant entre la droite et l'axe des abscisse.

    Pour calculer l'aire entre la courbe et l'axe des abscisses, il faut que tu additionnes tous les éléments unitaires entre les points.
    Cette aire élémentaire a la forme d'un trapèze. Donc la surface a pour valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Xa - Xb) * (Ya + Yb) / 2
    Tu fais une boucle qui scrute tous les points concernés par la surface. Pour chacun, tu calcules cette aire élémentaire que tu additionnes pour obtenir l'aire totale.

    Pour ce qui est l'aide de la droite, c'est la même chose excepté que ça se fait en une fois (pas besoin de boucle).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Par défaut
    Merci pour ton aide!!

    Le fait de calculer la différence entre chaque point et dévaluer le changement de signe me semble être une bonne idée. J'avais pensé au même genre de traitement qui prenait en compte une droite entre deux points consécutifs ( sachant que chaque valeur de x a un pas de 4Hz) et de trouver son coefficient directeur.

    Du point de vue théorique, je pense que je vais tomber sur une "colle". En effet, lorsque la macro trouvera un changement de signe, il se peut que ce point ne soit pas un réel point d'inflexion. Si on regarde bien la courbe avec les points noir que j'ai mise lors de mon premier message, je n'ai pas sélectionner tous les points où il y à un changement de signe du coefficient directeur; car étant donné que ce sont des points de mesure, il y en aurait "BEAUCOUP". Donc je pensais à prendre en compte ce traitement sur une plage de 5 points consécutifs (par exemple).

    Merci pour le tuto, car mon premier problème est d'écrire le calcul dans le Module VBA ... et que ça compile!
    Si jamais tu as déjà un code qui parcourt toutes les lignes des colonnes voulues sous la main je suis preneur. Sinon c'est pas grave je vais commencer par ça.

    Pour la différenciation des points trouvés, merci pour tes références. Et pour le Calcul d'aire ..... j'y suis pas encore! on aura surement l'occasion d'en rediscuter par la suite.

    Encore Merci.

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Hasturiaz Voir le message
    Du point de vue théorique, je pense que je vais tomber sur une "colle". En effet, lorsque la macro trouvera un changement de signe, il se peut que ce point ne soit pas un réel point d'inflexion. Si on regarde bien la courbe avec les points noir que j'ai mise lors de mon premier message, je n'ai pas sélectionner tous les points où il y à un changement de signe du coefficient directeur; car étant donné que ce sont des points de mesure, il y en aurait "BEAUCOUP". Donc je pensais à prendre en compte ce traitement sur une plage de 5 points consécutifs (par exemple).
    Ajoute à ta boucle une variable qui servira de compteur : pour chaque différence de même signe, il s'incrémente de 1 et lors d'un changement de signe, il repasse à 0. Ne considérer qu'un changement de signe est un vrai point d'inflexion que si ce compteur a dépassé un seuil que tu auras défini.

    Merci pour le tuto, car mon premier problème est d'écrire le calcul dans le Module VBA ... et que ça compile!
    Le premier problème est de savoir exactement ce que tu veux calculer et comment tu veux le calculer. Pour ça, avant de te lancer bille en tête dans le code, tu devrais écrire un algorithme indépendant du langage utilisé.
    Une fois que ça sera clair, il sera plus simple d'écrire le code.

    Si jamais tu as déjà un code qui parcourt toutes les lignes des colonnes voulues sous la main je suis preneur.
    Par exemple, pour la colonne A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Lig As Long
    For Lig = 1 To Range("A1").End(xlDown).Row
     
       .... traitement ...
     
    Next Lig
    Je te conseille fortement de regarder dans l'aide VBA d'Excel les différents éléments de ce code pour bien le comprendre.
    Mais, avant tout, commence à te familiariser avec les structures de base de VBA : avant d'attaquer des loopings, il faut apprendre le vol à l'horizontal.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Par défaut
    Merci de ton aide.

    c 'est parti pr l'Algo.

    On reste en contact, Merci beaucop

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur validation

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Par défaut
    Voilà ce que j'ai commencé à faire. J'ai voulu déjà essayer sur matlab avant de me lancer sur l'élaboration de maccro.


    Dans un premier temps j'ai calculé le coefficient directeur entre deux points successif.

    Code Matlab : 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
     
    %% Calcul des points d'inflexion
    clear all;
    close all;
     
    %% Coefficient
    Point_A=load('V10_2_A.txt'); %ici se trouve mes données X et Y
     
    Freq=Point_A(:,1);
    Ampl=Point_A(:,2);
     
    i=1;
     
    for i=1:length(Ampl)-1
     
        Coef(i)=(Ampl(i+1)-Ampl(i))/(Freq(i+1)-Freq(i)); % Calcul du Coef directeur
     
     
        i+1;
    end

    Puis j'ai comparé le signe de chacun des points et en mettant un compteur limite à 20. Ce compteur donc, s'incrémente à chaque fois que le signe d'une valeur à l'autre reste la même. Des que ces deux valeurs ont le même signe ce compteur retombe donc à zéro. Et si ce compteur s'incrémente jusqu'à 20 au minium et qu'il redescend à zéro alors la valeur n-1 est retenu et on récupère son abscisse et son ordonnée. Ce point sera considéré comme être un point d'inflexion.

    Code Matlab : 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
    t=0;
    u=linspace(1,3200,3200);
    for j=1:length(Coef)
     
       q=20; % compteur limite de définition de points d'inflexion
     
       if sign(Coef(j))==sign(Coef(j+1))
           t=t+1; % compteur 
       else t=0;
     
           if t-1>q & t=0
               Point_inflexion(u)=sign(Coef(j-1));
               X(i)=Freq(j-1);
               Y(i)=Ampl(j-1);
     
               u=u+1;
           else 
           end
       end
     
    end

    Et là c'est le drame... lol
    Si tu as une idée n'hésite pas je suis encore dessus.

    Merci

Discussions similaires

  1. Indentifier des points sur la courbe
    Par yanelo09 dans le forum LabVIEW
    Réponses: 2
    Dernier message: 14/10/2011, 10h48
  2. Indentifier des points sur la courbe
    Par yanelo09 dans le forum LabVIEW
    Réponses: 0
    Dernier message: 12/10/2011, 11h34
  3. Placer des points sur une image
    Par vallgui dans le forum WinDev
    Réponses: 9
    Dernier message: 22/01/2008, 15h19
  4. [JGraph] ajouter des points sur un edge
    Par badi3 dans le forum 2D
    Réponses: 1
    Dernier message: 14/12/2007, 11h27
  5. [MySQL] problème de syntaxe sur la récupération des données
    Par soshin dans le forum PHP & Base de données
    Réponses: 28
    Dernier message: 23/11/2006, 12h34

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