Excel 2016 - VBA - Identification et ajout de valeurs manquantes

Bonjour à tous !

Je vous soumets mon casse tête que je n'arrive pas à résoudre, j'ai donc du passer par du VBA, mais ce n'est pas encore ça. Je débute et j'ai donc cherché des infos sur les forums mais je suis ... Perdu. !

J'ai donc une liste de courses pour différents foyers qui a été 'mal faite' et il peut manquer des ingrédients dans certaines listes de courses. Pour ce faire, une recherche V me permet d'aller chercher les ingrédients manquants pour chaque recette. La première difficulté que j'ai est d'aller dissocier les éléments à rechercher (les recettes) car il peut y en avoir plusieurs dans la colonne (Recette' de l'onglet ' course'. La seconde difficulté est de pouvoir identifier UNIQUEMENT le delta des ingrédients manquants dans la liste de course pour pouvoir les ajouter à la liste.

Quelques infors supplémentaires :

-La liste de courses doit être au format Ingredient1,Ingrédient2 => C'est une contrainte assez forte, je peux potentiellement convertir avec le séparateur ',' puis re-concaténer ensuite ?

- Les ingrédients ne peuvent être présents que dans une seule recette. La liste des ingrédients à acheter est imparfaite et il peut en manquer

PS : S'agissant de choses confidentielles, je me permets de simplifier / transformer les choses pour que l'exemple soit aussi plus parlant !

Un grand merci si vous pouvez m'aider !!

Bonjour,
Une proposistion Power Query (sans VBA).
Ne gère pas les doublons !
Cdlt.

Whaouh c'est canon, je suis épaté !! merci à vous deux, vous êtes au top.

Je vais prendre le fichier VBA, ca me permet d'apprendre en voyant ton code. est-ce que tu sais ce que je peux faire pour ne pas mettre de vigule si c'est la dernière valeur . J'avais penser ) rajouter un If avec deux conditions pour dire :

- If 'plus de valeur après' => f1.Cells(i, "C") = f1.Cells(i, "C") & f2.Cells(x.Row, "B")

- If not => f1.Cells(i, "C") = f1.Cells(i, "C") & f2.Cells(x.Row, "B") & ","

Le fait est que je ne sais pas comment dire 'plus de valeur après'.

Encore un grand merci, votre aide m'a été précieuse !

Bonjour,

Pour supprimer la dernière virgule, suffit d'ajouter cette ligne avant "Next i"

        f1.Cells(i, "C") = Left(f1.Cells(i, "C"), Len(f1.Cells(i, "C")) - 1)

Ce qui donne:

Sub Controle_Liste()
    Dim f1 As Worksheet, f2 As Worksheet
    Dim i As Long, k As Long
    Dim x As Object
    Dim Plats As Variant
    Application.ScreenUpdating = False
    Set f1 = Sheets("Courses")
    Set f2 = Sheets("Ingredients")
    DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
    DerLig_f2 = f2.Range("A" & Rows.Count).End(xlUp).Row

    For i = 2 To DerLig_f1
        Liste = f1.Cells(i, "B")
        Plats = Split("," & Liste & ",", ",")
        f1.Cells(i, "C").ClearContents
        For k = 1 To UBound(Plats)
            If Plats(k) <> "" Then
                Set x = f2.Range("A1:A" & DerLig_f2).Find(Plats(k), lookat:=xlPart)
                If Not x Is Nothing Then
                    f1.Cells(i, "C") = f1.Cells(i, "C") & f2.Cells(x.Row, "B") & ","
                End If
            End If
        Next
        f1.Cells(i, "C") = Left(f1.Cells(i, "C"), Len(f1.Cells(i, "C")) - 1)
    Next i
End Sub

Pour info, si le code vous convient, pensez à mettre en résolu ici, ainsi que sur les autres forums où vous avez posé la même question.

Cdlt

Bonjour Arturo,

Merci pour ta réactivité! J'ai essayé d'ajouter cette ligne de code mais ca a généré un bug que je n'avais pas initialement (tu ne pouvais pas le deviner, c'est un cas particulier dans mon fichier source) : En faisant du debogage pas à pas , c'est au niveau d'une ligne qui est vide (quand j'ai un scope qui comprend toutes les 'recettes', c'est à vide). Est-ce que je peux remplacer derligne avec le rows.count par un chiffre fixe (283), pour qu'il aille à la ligne suivante même si c'est vide ?

Bonne journée

Bonjour,

NON, on ne travaille pas avec des valeurs fixes. Il suffit d'ajouter un test dans le code, exemple: si la cellule de la colonne A est vide alors on passe à la ligne suivante.

Sub Controle_Liste()
    Dim f1 As Worksheet, f2 As Worksheet
    Dim i As Long, k As Long
    Dim x As Object
    Dim Plats As Variant
    Application.ScreenUpdating = False
    Set f1 = Sheets("Courses")
    Set f2 = Sheets("Ingredients")
    DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
    DerLig_f2 = f2.Range("A" & Rows.Count).End(xlUp).Row

    For i = 2 To DerLig_f1
        If f1.Cells(i, "A") <> "" Then
            Liste = f1.Cells(i, "B")
            Plats = Split("," & Liste & ",", ",")
            f1.Cells(i, "C").ClearContents
            For k = 1 To UBound(Plats)
                If Plats(k) <> "" Then
                    Set x = f2.Range("A1:A" & DerLig_f2).Find(Plats(k), lookat:=xlPart)
                    If Not x Is Nothing Then
                        f1.Cells(i, "C") = f1.Cells(i, "C") & f2.Cells(x.Row, "B") & ","
                    End If
                End If
            Next
            f1.Cells(i, "C") = Left(f1.Cells(i, "C"), Len(f1.Cells(i, "C")) - 1)
        End If
    Next i
End Sub

Cdlt

Bonjour à tous,
Pour le fun !
Une petite mise à jour de la proposition Power Query, avec la gestion des doublons (éventuels), et les ingédients triés par ordre alphabétique.
Les données sont sous forme de tableaux structurés.
Cdlt.

Je comprends pour le fait de ne pas mettre de valeur fixe. Je suis encore en apprentissage, c'est bon à savoir pour la prochaine fois.

Merci à vous deux pour votre contribution !

Rechercher des sujets similaires à "2016 vba identification ajout valeurs manquantes"