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 :

excel 2010-2016 Centralisation des recherches de valeurs, a une feuille maitre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut excel 2010-2016 Centralisation des recherches de valeurs, a une feuille maitre
    bonjour a tous
    on n'est dans un contexte de saisie d'aliments, composant fiche technique de recette de cuisine.
    vaut mieux, un petit schémas, qu'un long discours.
    comme vous pouvez le voir, sur ma capture d'écran ci-dessous

    Nom : demoRechercheAliments080818.png
Affichages : 2065
Taille : 90,0 Ko


    je peine, a centraliser, toutes mes recherches d'aliments qui compose ma recette; de la feuille "base" à ma feuille "FTRV1" ( fiche technique recette version1)
    soit le scénario suivant recherché:

    1) je saisie tous les aliments, composant ma recette , les unes à la suite des autres

    2) je la recherche dans la feuille "base", je la trouve, et je fais correspondre leurs valeurs nutritionnelles à ma feuille "FTRV1" a des plages ranges bien précis

    3) systématiquement, les valeurs s'additionneront à chaque aliments trouvés de ma feuille "base", composant ma recette, vers ma feuille "FTRV1" ( fiche technique recette version1)

    pour info : ma feuille "base" de recherche est: BaseRange="B2:B5521" contenant 5521 lignes .
    celle-ci est alimenté, avec de nouveaux aliments, et leurs valeurs énergétiques.
    ci-joint le code de ma fonction recherche de base ci-dessous

    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
     
    Function FindAll(ByVal sDenree As String, ByRef baseFeuil As Worksheet, ByRef BaseRange As String, ByRef resCalorie() _
      As String) As Boolean
        On Error GoTo Err_Trap
            Dim rFnd As Range ' Range Object
                Dim iCalor As Integer ' Compteur pour tableau
                    Dim rFirstAddress ' Addresse de la premiere recherche
                        Erase resCalorie ' efface le tableau
                           Set rFnd = baseFeuil.Range(BaseRange).Find(what:=sDenree, LookIn:=xlValues, lookAt:=xlPart) ' alloue toi, a la recherche
            If Not rFnd Is Nothing Then
                rFirstAddress = rFnd.Address
                 Do Until rFnd Is Nothing
                    iCalor = iCalor + 1
                        ReDim Preserve resCalorie(iCalor)
     
                             resCalorie(iCalor) = rFnd.Row  'c'est a ce niveau que je bloque, je souhaiterai formaté cette ligne, en fonction des valeurs que je veux restituer 
                                                                          ' comme le montre l'arrière plan de ma capture de mon écran
                                             --->suite  de mon code
     
                                  Set rFnd = baseFeuil.Range(BaseRange).FindNext(rFnd) ' passe à la recherche suivante
                                    If rFnd.Address = rFirstAddress Then Exit Do ' sort de la boucle Do
                                    Loop
                                    FindAll = True
                                    Else
                                    Err_Trap:  'La gestion des erreurs
                                    If Err <> 0 Then
                                MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
                            Err.Clear
                        FindAll = False
                    Exit Function
                End If
    End Function


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Function RedimArray(Table)
            RedimArray = Application.WorksheetFunction.Transpose(Table)
    End Function
    code ci-dessous à la mise en œuvre de ma fonction recherche des aliments qui compose ma recette saisie
    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
     
     
    Sub CalorieCal()
    Dim PlagNature As Range: Set PlagNature = Range("G21:H61")
    Dim strTabCalo() As Variant
    Dim istrCal As Long
    Dim caloTemp() As String 'variable tableau pour la fonction Findall
    Dim Feuil_base As String
    Dim iCal As Integer
    Feuil_base = "base"
    strTabCalo = RedimArray(PlagNature)  'dimenssionnement des aliments saisies, a passer en arguments à la fonction recherche
        For istrCal = 1 To UBound(strTabCalo)
            Debug.Print strTabCalo(istrCal)
     '---------------------------------------------------------------
                bFound = FindAll(strTabCalo(istrCal), Sheets(Feuil_base), BaseRange, caloTemp()) 'mise en oeuvre de ma fonction recherche des aliments
                    If bFound = True Then
                        Debug.Print "Nb occurences : " & UBound(caloTemp)
                            For iCal = 1 To UBound(caloTemp)
     
                Debug.Print caloTemp(iCal) ' ici blocage a se niveau afin d'une restitution sur ma feuille maitre feuille "FTRV1", dans les plages bien précis, comme le montre ma    
                                                        ' capture d'écran  en avant plan
                                                          '----> ce qui a ci-dessous
                                                           'set resKcal=Range("H16:H17")
                                                           'set resProt=Range("K16:K17")
                                                           'set resGluc=Range("N16:N17")
                                                           'set resLipi=Range("P16:P17")
                                                            'se sont les plages, de ma feuille maitre "FTRV1" pour les résultats centralisés
     
            Next
          Next
        End If
    End Sub
    vraiment merci, a toutes aides de votre part; je suis coincé.
    en espérant avoir donné le maximum d'éléments pour se scénario recherché
    je suis un débutant en VBa, je me tarde de finir se petit projet, pour la saisie de recette de cuisine.

    cordialement

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Si j'ai bien compris, ton problème est de trouvé une formule de recherche qui s'adapterais à ton nombre d'ingrédient.
    Je te conseille alors de passer par un tableau intermédiaire:
    -Crée une nouvelle feuille (appelons la "recherche" par exemple)
    -en A1 met la formule "='FTRV1'!G21" (G21 étant la position du premier élément sur ta feuille de recette d'après ta capture d'écran)
    -en B1 une rechercheV du nombre de calories (feuille "base" colonne C) de l'ingrédient en A1
    -idem en C1->E1 pour les protéines, lipides, glucides
    -tu étends les formules suffisamment bas (je pense que 50 ingrédients pour une recette devraient suffire)
    -dans ta feuille recette en H17 (le total colorie) tu met la formule "=somme('recherche'!B:B)
    -idem pour tes autres totaux

  3. #3
    Membre chevronné
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 214
    Par défaut
    Honnêtement votre code est a revoir
    une piste : resCalorie(iCalor) = rFnd.Row : vous ramenez un n° de ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resCalorie(iCalor,1)= rFnd.cells(rfnd.row,1) 'vous rameneriez une valeur

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut
    bonsoir ou bonjour a vous, selon l'heure

    deja, merci à sogedic, halaster08; et Nagel Tha de m'avoir repondus, et d'avoir fait des remarques.
    ceci-dit je repondrais à chaqe situations évoquées, et le scémario recherché; de ma part.
    et pourtant j'ai essayé de donner le maximum d'informations, et une copie d'ecran pour un visuel ou je suis bloqué.

    sogedic, halaster08; et Nagel Tha
    ci-dessous, j'ai remis une capture d'ecran, avec un peu plus d'explication dans mon scénario recherché.
    Nom : demoRechercheAliments100818.jpg
Affichages : 1003
Taille : 427,7 Ko

    dans mon premier message Naget Tha

    j'avais mis la capture de mon ecran ; a savoir en avant plan. tu vois bien ma feuille maitre qui est FTRV1 ( fiche technique recette v1 )
    en suite ;en arrière plan tu as ma feuille "base" dans lequelle tous les aliments sont répertoriés, avec leurs valeurs énergétiques respectives.
    ont la voit bien derrière. en "arrière plans"

    ma feuille "base" est une sorte de petite base de donnée alimentaire, que j'alimente; et j'informe bien, que ma recherche d'aliments se fait
    sur dans ma feuille "base" .et je centralise les valeurs énergétiques respective, vers la feuille maitre qui est FTRV1 en les addionnants ( fiche technique recette v1).
    autant d'aliments saisies, composant la recette, sera autant de recherche en valeurs énergétique comme tu le vois, et mise en s'additionnant au format d'affichage que tu vois
    la fiche maitre FRTV1 est imposée. elle est représenté de cette façon, a peu de chose prêt et est utilisé en production.
    Nagel Tha , j'avais mis mon code ou je bloquais, et de ça mise en oeuvre.
    méthode avec la fonction Find, et de sont utilisation 'j'ai mis en commentaire les endroit bloquants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    resCalorie(iCalor,1)= rFnd.cells(rfnd.row,1) 'vous ramèneriez une valeur
    puisque sogetic, a ciblé mon point bloquant qui est là plus bas
    ma plage de saisie des aliments est dimensionné avec  PlagNature =Range("G21:H61")  comme tu le voir dans ma capture d'ecran.
    ma question es de savoir
    comment formater les valeurs de sorties, de la feuille "base" vers ma feuille ma feuille FRTV1 ( fiche technique recette v1 )
    autant de fois, les valeurs s'additionneront par rapport aux aliments saisies composant la recette.
    pour te répondre sogedic,

    j'imagine sogedic, que le code est à revoir,
    justement, sur le point que tu exposes,
    c'est a se niveau que je bloque ,justement je cherche a restitué les valeurs de la feuille "base" ( les valeur encerclé en rouge)
    sur ma feuille FRTV1 ( fiche technique recette v1 ) en "avant plan"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    code sogedic,
    resCalorie(iCalor,1)= rFnd.cells(rfnd.row,1) 'vous rameneriez une valeur
    comment formater les valeurs de sorties, de la feuille "base" vers ma feuille ma feuille FRTV1 ( fiche technique recette v1 )
    autant de fois, les valeurs s'additionront par rapport aux aliments saisies composant la recette.
    ma plage de saisie des aliments est dimensionné avec PlagNature =Range("G21:H61")
    jai donné un peu plus d'éléments dans le scénario recherché.
    avec la méthode find, à chaque aliments trouvés; je souhaite prendre les valeurs , et les répliqué sur ma feuille maitre a savoir "FRTV1"

    je vais travaillé ta piste sogdedic.

    merci

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Je survole un peu le sujet et voilà ce que j'en ai compris de ta demande :
    en premier lieu, tu saisis en colonne G les différents aliments qui composent ta recette puis ceci fait, tu lances la recherche de ces différents aliments dans ta feuille de base et tu souhaites obtenir le total des calories, protéines, etc...

    Je suppose que chaque aliment qui compose la recette est unique donc le FindNext est inutile et de là, la boucle Do Loop !

    Ta fonction de recherche devrait être une fonction tableau qui te retourne les valeurs calories, protéines, etc...
    Dans mon exemple ci-dessous, la fonction retourne un tableau qui contient les quatre valeurs qui se trouvent dans les cellules voisines :
    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
     
    Function Valeurs(sDenree As String, Plage As Range, Trouvee As Boolean) As Double()
     
        Dim Tbl(1 To 4) As Double
        Dim Cel As Range
     
        Set Cel = Plage.Columns(1).Find(sDenree, , xlValues, xlPart) 'xlwhole ---> pour recherche exacte
     
        If Not Cel Is Nothing Then
     
            Tbl(1) = Cel.Offset(, 1).Value 'calories
            Tbl(2) = Cel.Offset(, 2).Value 'protéines
            Tbl(3) = Cel.Offset(, 3).Value 'glucides
            Tbl(4) = Cel.Offset(, 4).Value 'lipides
     
            Trouvee = True
            Valeurs = Tbl
     
        Else
     
            Trouvee = False
     
        End If
     
    End Function
    Une variable de contrôle est passée en référence (par défaut dans VB) afin de savoir si la recherche a aboutie et donc l'utilisation de la fonction est :
    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
     
    Sub test()
     
        Dim Tbl() As Double
        Dim Trouvee As Boolean
     
        Tbl = Valeurs("Agneau rognons", Worksheets("base").Range("B2:F100"), Trouvee) 'ici, rechercher la dernière ligne non vide en colonne F
     
        If Trouvee Then
     
            MsgBox Tbl(1) & vbCrLf & Tbl(2) & vbCrLf & Tbl(3) & vbCrLf & Tbl(4)
     
        Else
     
            MsgBox "Non trouvé !"
     
        End If
     
    End Sub
    Il te suffit alors de faire une boucle sur tous les aliments qui composent ta recettes et de totaliser les valeurs retournées dans 4 variables

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    Petite précision, la recherche se fait sur la première colonne de la plage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set Cel = Plage.Columns(1).Find(sDenree, , xlValues, xlPart) 'xlwhole ---> pour recherche exacte
    Donc la plage peut être "B2:B100" ou "B2:F100" la fonction retournera les bonnes valeurs dans un cas comme dans l'autre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. excel 2010-2016 replication de Valeur, par boucle sur plage spécifique
    Par amateur_will dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/07/2018, 00h20
  2. Réponses: 1
    Dernier message: 06/11/2016, 08h53
  3. Incompatibilité versions Excel 2010/2016
    Par Nadinette dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 17/02/2016, 23h36
  4. Réponses: 2
    Dernier message: 08/06/2007, 10h18
  5. Recherche de valeur dans une feuille et affichage dans une autre
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/05/2007, 09h40

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