recherche de plusieurs valeur avec condition vba + msgbox Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
d
doudou59700
Jeune membre
Jeune membre
Messages : 22
Inscrit le : 11 mars 2016
Version d'Excel : 2000

Message par doudou59700 » 17 mars 2018, 17:09

Bonjour à tous,

J'ai créé un petit programme qui permets de calculer l'IMC d'une personne en VBA en affichant un usf. Jusque là aucun soucis.

Cependant, j'aimerai rajouter une formule qui : Rechercherai la même valeur dans la colonne A à partir du textbox1 (taille) et rechercherai la valeur du textbox 2 (poids) sur la même ligne pour afficher la valeur de la cellule b1 ou d1 ou f1 etc .. selon la valeurs comprise entre b3 et c3 par exemple de ma valeur de ma textbox 2 et l'afficherai dans ma msgbox.


Ce qui ferait par exemple sur le msgbox Imc = 50, refus (dans mon usf, "IMC = 50" est déjà incrémenté)

J'ai commencé à remplir les deux lignes en exemple pour commencer à réfléchir à une piste de formule vba ou excel mais là le cale...

En espérant avoir été clair, mais c'est un peu difficile d'expliquer cela par écrit...

Merci d'avance pour votre aide !
imc.xlsm
(22.66 Kio) Téléchargé 9 fois
Avatar du membre
i20100
Passionné d'Excel
Passionné d'Excel
Messages : 6'049
Appréciations reçues : 352
Inscrit le : 16 mars 2017
Version d'Excel : 2010

Message par i20100 » 17 mars 2018, 17:41

Bonjour,

à tester,
imc = CDbl(TextBox2) / ((CDbl(TextBox1) / 100) ^ 2)
Prenons soins de nous et de notre vaisseau spatial, nous n’en n’avons qu’un ...notre planète terre
isabelle
d
doudou59700
Jeune membre
Jeune membre
Messages : 22
Inscrit le : 11 mars 2016
Version d'Excel : 2000

Message par doudou59700 » 17 mars 2018, 18:16

après quelques recherches, j'ai trouvé cela :
Private Sub CommandButton1_Click()
Dim var As String
 
 
 
MsgBox "imc =" & Chr(10) & Val(TextBox2 / (TextBox1 / 100) ^ 2) & Range("w1")
 
MsgBox IMC(Worksheets("Feuil1"))
 
End Sub
 
Function IMC(Fe As Worksheet) As String
 
    Dim Plage As Range
    Dim Cel As Range
    Dim Lig As Long
 
    With Fe: Set Plage = .Range(.Cells(3, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
 
    Set Cel = Plage.Find(Int(TextBox1.Text), , xlValues, xlWhole)
 
    If Not Cel Is Nothing Then
 
        Lig = Cel.Row
        With Fe: Set Plage = .Range(.Cells(Lig, 2), .Cells(Lig, .Columns.Count).End(xlToLeft)): End With
 
    End If
 
    Set Cel = Plage.Find(Int(TextBox2.Text), , xlValues, xlWhole)
 
    If Not Cel Is Nothing Then
 
        IMC = Fe.Cells(1, IIf(Fe.Cells(1, Cel.Column).Value = "", Cel.Column - 1, Cel.Column)).Value
 
     End If
 
End Function
Cependant quand je tape une valeur qui est différente de 21 et de 30 mais comprise entre ces chiffres, je n'ai pas le résultat (refus ...). Comment peut-on faire pour incrémenter cela ?
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'473
Appréciations reçues : 428
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 18 mars 2018, 10:57

Bonjour,

comment détermines-tu les différentes valeurs min et max de ton tableau en feuil1

sur wikipedia on retrouve ces différentes catégories pour l'IMC

IMC (kg·m−2) Interprétation
moins de 16,5 dénutrition ou anorexie
16,5 à 18,5 maigreur
18,5 à 25 corpulence normale
25 à 30 surpoids
30 à 35 obésité modérée
35 à 40 obésité sévère
plus de 40 obésité morbide ou massive

si tu pars de ce principe, tu demandes le poids et la taille, tu calcules l'IMC et tu compares avec le tableau ci-dessus ou un tableau semblable pour déterminer la catégorie, pas de besoin de tableau type celui que tu as mis en feuil1
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 4'019
Appréciations reçues : 306
Inscrit le : 26 janvier 2011
Version d'Excel : 2007/2019

Message par Theze » 18 mars 2018, 11:25

Bonjour,

C'est le code que je t'ai donné hier sur un autre forum !
Si des valeurs sont entrées entre les bornes, il suffit de rechercher la valeur égale ou immédiatement supérieure dans la plage :
Function IMC(Fe As Worksheet) As String
 
    Dim Plage As Range
    Dim Cel As Range
    Dim Lig As Long
 
    With Fe: Set Plage = .Range(.Cells(3, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
 
    Set Cel = Plage.Find(Int(TextBox1.Text), , xlValues, xlWhole)
 
    If Not Cel Is Nothing Then
 
        Lig = Cel.Row
        With Fe: Set Plage = .Range(.Cells(Lig, 2), .Cells(Lig, .Columns.Count).End(xlToLeft)): End With
 
    End If
    
    For Each Cel In Plage
        
        'les valeurs étant de la gauche veres la droite de la plus petite à la plus grande, il suffit de rechercher
        'la valeur immédiatement supérieure !
        If Cel.Value >= Int(TextBox2.Text) Then
        
            IMC = Fe.Cells(1, IIf(Fe.Cells(1, Cel.Column).Value = "", Cel.Column - 1, Cel.Column)).Value
            Exit Function
            
        End If
        
    Next Cel
     
End Function
la fonction IIf() est utilisée car les cellules en ligne 1 sont fusionnées ce qui n'est pas conseillé pour un bon fonctionnement du classeur !
Tu peux entrer la même valeur dans les deux cellules et utiliser un format personalisé ";;;" (trois point-virgules) pour masquer la valeur.
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
d
doudou59700
Jeune membre
Jeune membre
Messages : 22
Inscrit le : 11 mars 2016
Version d'Excel : 2000

Message par doudou59700 » 18 mars 2018, 13:02

h2so4 a écrit :
18 mars 2018, 10:57
Bonjour,

comment détermines-tu les différentes valeurs min et max de ton tableau en feuil1

sur wikipedia on retrouve ces différentes catégories pour l'IMC

IMC (kg·m−2) Interprétation
moins de 16,5 dénutrition ou anorexie
16,5 à 18,5 maigreur
18,5 à 25 corpulence normale
25 à 30 surpoids
30 à 35 obésité modérée
35 à 40 obésité sévère
plus de 40 obésité morbide ou massive

si tu pars de ce principe, tu demandes le poids et la taille, tu calcules l'IMC et tu compares avec le tableau ci-dessus ou un tableau semblable pour déterminer la catégorie, pas de besoin de tableau type celui que tu as mis en feuil1
Ce sont des valeurs différentes utilisées dans mon cas que les normes IMC via un tableau prédéfini.
d
doudou59700
Jeune membre
Jeune membre
Messages : 22
Inscrit le : 11 mars 2016
Version d'Excel : 2000

Message par doudou59700 » 18 mars 2018, 13:06

Theze a écrit :
18 mars 2018, 11:25
Bonjour,

C'est le code que je t'ai donné hier sur un autre forum !
Si des valeurs sont entrées entre les bornes, il suffit de rechercher la valeur égale ou immédiatement supérieure dans la plage :
Function IMC(Fe As Worksheet) As String
 
    Dim Plage As Range
    Dim Cel As Range
    Dim Lig As Long
 
    With Fe: Set Plage = .Range(.Cells(3, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
 
    Set Cel = Plage.Find(Int(TextBox1.Text), , xlValues, xlWhole)
 
    If Not Cel Is Nothing Then
 
        Lig = Cel.Row
        With Fe: Set Plage = .Range(.Cells(Lig, 2), .Cells(Lig, .Columns.Count).End(xlToLeft)): End With
 
    End If
    
    For Each Cel In Plage
        
        'les valeurs étant de la gauche veres la droite de la plus petite à la plus grande, il suffit de rechercher
        'la valeur immédiatement supérieure !
        If Cel.Value >= Int(TextBox2.Text) Then
        
            IMC = Fe.Cells(1, IIf(Fe.Cells(1, Cel.Column).Value = "", Cel.Column - 1, Cel.Column)).Value
            Exit Function
            
        End If
        
    Next Cel
     
End Function
la fonction IIf() est utilisée car les cellules en ligne 1 sont fusionnées ce qui n'est pas conseillé pour un bon fonctionnement du classeur !
Tu peux entrer la même valeur dans les deux cellules et utiliser un format personalisé ";;;" (trois point-virgules) pour masquer la valeur.
Parfait ! Merci beaucoup, ça fonctionne :)
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message