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 :

[E-03] trouver les valeurs inférieur et supérieur d'un nombre


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 21
    Points
    21
    Par défaut [E-03] trouver les valeurs inférieur et supérieur d'un nombre
    Bonjour
    J'ai une certaine valeur de Régime moteur
    je doi cherche d'un tableau la valeur inférieur la plus proche et la valeur supérieur la plus proche de mon régime moteur.

    exemple
    j'ai comme régime 7200tr/min
    dans le tableau les valeurs peuvent être 7196 et 7203 comme valeur proche.

    quelqu'un a une idée?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Tu parcours ta feuille (ou tableau) jusqu'à trouver une cellule inférieure à ton nombre et la suivante supérieure à ton nombre: c'est pas sorcier.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    je n'ai pas qu'une valeur à trouver. je dois le faire pour plus de 400, 500 valeurs de régime moteur voir beaucoup plus! tout dépendra de la fréquence de prise de point que l'on prendra. Je souhaite l'automatisé.

    Si c'était pour une valeur je ne poserai pas la question je ne suis pas si bête que ca !

  4. #4
    Membre confirmé Avatar de zandru
    Homme Profil pro
    Ingénieur conception mécanique
    Inscrit en
    Mars 2008
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 507
    Points : 551
    Points
    551
    Par défaut
    Citation Envoyé par decondelite Voir le message
    Tu parcours ta feuille (ou tableau) jusqu'à trouver une cellule inférieure à ton nombre et la suivante supérieure à ton nombre: c'est pas sorcier.
    Oui, en supposant que son tableau est classé dans l'ordre.

    Sinon il doit parcourir tout son tableau et comparer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if valeurinf < valeurtesté and valeurtesté < régime then valeurinf = valeurtesté
    pour toutes les valeurs de son tableau (et de la même manière pour valeursup)

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    je ne vois pas à quoi correspond la "valeur testé".
    je dois trouver les valeurs de tableau les plus proche possible de mon régime moteur

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Tu peux simplement déclarer deux variables : valInf et valSup par exemple.
    Ensuite tu testes chaque valeur du tableau, comme a commencé Zandru :
    Si la valeur du tableau est inférieure au régime et supérieure à valInf, tu mets cette valeur dans valInf
    Si la valeur du tableau est supérieure au régime est inférieure à valSup, tu la mets dans valSup

    Il faut donc boucler sur toutes les valeurs du tableau et pour chacune d'elles faire ces deux tests.

    C'est assez simple, il faut juste faire attention à ne pas confondre les opérateurs AND et OR

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    pourquoi ne pas confondre And et Or ?
    j'ai fait un codage sans Or comme celui qui suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Ntest = Worksheets("Feuil1").Cells(i - 1, 1)
     If Ntest < Cycle_N And Ninf < Ntest Then Ninf = Ntest
     If Ntest > Cycle_N And Nsup > Ntest Then Nsup = Ntest
     
     
     
     Worksheets("Feuil1").Cells(i, 7) = Ninf
     Worksheets("Feuil1").Cells(i, 8) = Nsup
    il me marque que le premier. je ne comprend pas pourquoi

    pouvez vous m'aider pasque la je galère vraiment
    mon Nsup est tjr égale a zero et en plus il trouve toujour la même chose pour Ninf alors que le régime de départ change constament.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 129
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Ca doit obligatoirement être en VBA ou cela peut être en formule Excel?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Une possibilité :
    - La variable Ninf n'est pas réinitialisée à 0 après chaque utilisation, de sorte que son ancienne valeur vient fausser la donne.
    - La variable Nsup vaut 0 après sa déclaration, de sorte que Nsup > Ntest n'est jamais vérifié. Il faudrait initialiser Nsup à 10.000, par exemple, en début de procédure.

    En gros, rajouter en début de procédure :
    Ninf = 0
    Nsup = 10000

    pourrait tout arranger ???

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Ca doit obligatoirement être en VBA ou cela peut être en formule Excel?
    si tu as une proposition en excel pourquoi pourquoi pas si sa marche comme ca

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 129
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Les deux formules doivent être validées en matricielle (CTRL+MAJ+ENTER)

    Plus grande valeur inférieure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =MAX((A2:A10<=7200)*A2:A10)
    Plus petite valeur supérieure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =PETITE.VALEUR((A2:A10>=7200)*A2:A10;NB.SI(A2:A10;"<7200")+1)

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par neupont Voir le message
    Une possibilité :
    - La variable Ninf n'est pas réinitialisée à 0 après chaque utilisation, de sorte que son ancienne valeur vient fausser la donne.
    - La variable Nsup vaut 0 après sa déclaration, de sorte que Nsup > Ntest n'est jamais vérifié. Il faudrait initialiser Nsup à 10.000, par exemple, en début de procédure.

    En gros, rajouter en début de procédure :
    Ninf = 0
    Nsup = 10000

    pourrait tout arranger ???
    c'est un peu mieu maitnenant qu'il y a un chiffre qui correspond pour Ninf, Nsup se met a 10000 et inversement si Nsup donne un chiffre potable Ninf=0.
    il me faut que Ninf et Nsup soit plus près possible de Cycle_N

  13. #13
    Membre confirmé Avatar de zandru
    Homme Profil pro
    Ingénieur conception mécanique
    Inscrit en
    Mars 2008
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 507
    Points : 551
    Points
    551
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Ninf = 0
        Nsup = 9999999
        i = 1
        While Worksheets("Feuil1").Cells(i - 1, 1) <> ""
            Ntest = Worksheets("Feuil1").Cells(i - 1, 1)
            If Ntest < Cycle_N And Ninf < Ntest Then Ninf = Ntest
            If Ntest > Cycle_N And Nsup > Ntest Then Nsup = Ntest
            i = i + 1
        Wend
        Worksheets("Feuil1").Cells(i, 7) = Ninf
        Worksheets("Feuil1").Cells(i, 8) = Nsup
    Ce code devrait fonctionner pour ce que tu veux faire.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je ne sais pas si j'ai bien compris mais vous avez écrit :

    j'ai comme régime 7200tr/min
    dans le tableau les valeurs peuvent être 7196 et 7203 comme valeur proche.
    mais aussi :

    je dois rechercher dans un tableau la valeur inférieure la plus proche et la valeur supérieure la plus proche de mon régime moteur.
    à priori si vous vous contentez de comparer sur la 1ère valeur inférieure et sur la 1ère valeur supérieure, cela ne veut pas dire que vous aurez trouvé les valeurs les plus proches ?

    Si, par hasard j'avais bien compris, il faut rechercher la valeur d'un écart négatif et d'un écart positif le plus proche de 0 ?

  15. #15
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Les deux formules doivent être validées en matricielle (CTRL+MAJ+ENTER)

    Plus grande valeur inférieure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =MAX((A2:A10<=7200)*A2:A10)
    Plus petite valeur supérieure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =PETITE.VALEUR((A2:A10>=7200)*A2:A10;NB.SI(A2:A10;"<7200")+1)
    elle marche pour toute les valeurs il me met des Zéro alors qu'il ne devrait pas en avoir (j'ai tester que le premier)

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 129
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Tu as bien validé en matricielle? (si oui, tu dois voir apparaître des accolades de part et d'autre de la formule) Restriction: Il ne peut y avoir de cellule vide dans la plage pour le calcul de la plus petite valeur supérieure...

    Si tu tiens vraiment à le faire par vba,voici deux fonctions
    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
    26
    27
    28
    29
    30
    31
    32
    33
    Function PlusGrandeValeurInferieure(plage As Range, Valeur As Double) As Variant
        Dim Cellule As Range
        Dim Resultat As Variant
        Dim Tempo As Variant
        Dim Ecart As Variant
     
        For Each Cellule In plage
            Tempo = Valeur - Cellule.Value
            If Tempo >= 0 Then
                If IsEmpty(Ecart) Then Ecart = Tempo
                If Ecart >= Tempo Then Resultat = Cellule.Value
            End If
        Next
        PlusGrandeValeurInferieure = Resultat
        Set Cellule = Nothing
    End Function
     
    Function PlusPetiteValeurSuperieure(plage As Range, Valeur As Double) As Variant
        Dim Cellule As Range
        Dim Resultat As Variant
        Dim Tempo As Variant
        Dim Ecart As Variant
     
        For Each Cellule In plage
            Tempo = Valeur - Cellule.Value
            If Tempo <= 0 Then
                If IsEmpty(Ecart) Then Ecart = Tempo
                If Ecart <= Tempo Then Resultat = Cellule.Value
            End If
        Next
        PlusPetiteValeurSuperieure = Resultat
        Set Cellule = Nothing
    End Function
    Voici le fichier

  17. #17
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par zandru Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Ninf = 0
        Nsup = 9999999
        i = 1
        While Worksheets("Feuil1").Cells(i - 1, 1) <> ""
            Ntest = Worksheets("Feuil1").Cells(i - 1, 1)
            If Ntest < Cycle_N And Ninf < Ntest Then Ninf = Ntest
            If Ntest > Cycle_N And Nsup > Ntest Then Nsup = Ntest
            i = i + 1
        Wend
        Worksheets("Feuil1").Cells(i, 7) = Ninf
        Worksheets("Feuil1").Cells(i, 8) = Nsup
    Ce code devrait fonctionner pour ce que tu veux faire.
    Il me met toujour Ninf=0 et Nsup =751 (chiffre de depart pour Cycle_N)

  18. #18
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 21
    Points
    21
    Par défaut
    a quelle moment je dois valider en matricielle?

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 129
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    ... au moment de la valider...

    A la place de valider la formule normalement (comme tu le fais pour n'importe quelle formule), tu la valides en matricielle (Ctrl+Maj+Enter)...

  20. #20
    Membre confirmé Avatar de zandru
    Homme Profil pro
    Ingénieur conception mécanique
    Inscrit en
    Mars 2008
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 507
    Points : 551
    Points
    551
    Par défaut
    Citation Envoyé par kristoch91 Voir le message
    Il me met toujour Ninf=0 et Nsup =751 (chiffre de depart pour Cycle_N)
    Et suivant les valeurs de ton tableau, quel devrait être les bons chiffres ("à la main") ?

    C'est bizarre que Ninf reste à zero. Est-ce qu'il existe des valeurs dans ton tableau entre 0 et Cycle_N ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Debutant]Tableau d'objet : trouver les valeur supérieur a un maximum
    Par gathrog dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 16/06/2015, 10h20
  2. [MySQL] trouver toutes les valeurs inférieures à un nombre
    Par abouilyas dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/04/2014, 21h38
  3. Supprimer les valeurs inférieures à un seuil
    Par annael dans le forum MATLAB
    Réponses: 20
    Dernier message: 28/08/2008, 19h00
  4. Trouver les valeurs uniques d'un vecteur
    Par Ptinéwik dans le forum MATLAB
    Réponses: 3
    Dernier message: 21/01/2008, 17h14
  5. Comment trouver les valeurs manquante d'une série ?
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/10/2006, 10h38

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