Fonction SI (plusieurs réponses/conditions) + Dates

Bonjour tout le monde,

J'ai l'impression qu'en ce moment le forum devient un peu ma seconde maison

J'ai de nouveau besoin de votre aide,

En effet, sur mon fichier j'aimerais remplir une colonne en fonction de plusieurs conditions et elle peut se remplir avec différentes réponses.

Je m'explique mieux :

- Si ma date est égale ou dépassée par la date d'aujourd'hui, et que le cycle de vie est "Active commerce", ainsi que si le top publication est à "oui", que l'état de publication est vierge (ou "DR") et enfin que le type de données de publication web a renseigner contient "Média manquant" alors dans la colonne attribut manquant je renvoi 1

- Si ma date est inférieur de 1 à 14 jours par rapport à la date d'aujourd'hui et que les autres conditions comme précédemment sont remplies alors je renvoi 2

- Enfin si ma date est inférieur à plus de 14 jours par rapport à aujourd'hui et que les autres conditions comme précédemment sont remplies, alors je renvoi 3

Je ne sais pas si tout est clair, je vous joint mon fichier.

J'aimerais pouvoir faire une intégration via du VBA car ce fichier est déjà plutôt automatiser de manière générale et il faut que ce soit le cas pour que les utilisateurs puissent l'utiliser fréquemment avec de nouvelles données. (Je sais pas si c'est très clair non plus cette formulation )

Merci d'avance à vous et bonne journée,

16test-si.xlsx (9.57 Ko)

Bonjour kinders59,

Voici un essai:

11test-si.xlsx (9.57 Ko)

Bonjour kinders59,

Voici un essai:

test-si.xlsx

Bonjour Florian53,

Je ne vois pas la différence avec mon fichier est-ce le bon celui que tu as partagé ?

Merci à toi,

Erreur de fichier dsl:

12test-si.xlsm (20.48 Ko)

Erreur de fichier dsl:

test-si.xlsm

Merci de ta réponse rapide,

Je vois que dans la formule tu écris : "And tablo(i, 6) = "Média manquant;Attribut manquant" Then" mon problème étant qu'il est probable qu'un moment il n'y est que "Média manquant" ou qu'il soit précédé de quelque chose d'autre, et donc dans ce cas la formule ne fonctionne plus, je me suis dit que si je m'étais "*Média manquant*" ça réussirait à combler le truc sauf que non ça ne fonctionne pas

Aurais-tu une idée de comment faire pour qu'il ne fasse qu'une recherche sur cette fameuse partie de "Média manquant" et cela peut importe s'il y a d'autres choses avec ?

Merci à toi

Je regardes de mon côté aussi pour éviter de ne faire que demander et avoir du tout cuit

Le reste fonctionne au top, la formule est très propre. Petite question le tableau ralentit le chargement si beaucoup de lignes ? Ou est-ce qu'il permettra tout de même de garder une certaine rapidité (avec d'autres formules) ?

Merci encore

Voici le code modifié:

Sub Analyse()
Dim Ws As Worksheet
Dim tablo
Dim i&, j&

     Application.ScreenUpdating = False

    'Déclaration des Objets

    Set Ws = ThisWorkbook.Worksheets(1)

    With Ws
        ' Ajout des colonnes pour inclure les données manquantes
        tablo = .Range("A1").CurrentRegion

        For i = 2 To UBound(tablo, 1)
                ' Intégration des nouvelles données dans le bon onglet
                If tablo(i, 4) <> Empty And tablo(i, 1) = "Active commerce" And tablo(i, 2) = "OUI" And (tablo(i, 3) = "DR" Or tablo(i, 3) = "") _
                    And Left(tablo(i, 6), 14) = "Média manquant" Then
                        If tablo(i, 4) >= Date Then
                            tablo(i, 5) = 1
                            ElseIf tablo(i, 4) - Date < -1 And tablo(i, 4) - Date > -14 Then tablo(i, 5) = 2
                            ElseIf tablo(i, 4) - Date < -14 Then tablo(i, 5) = 3
                        End If
                Else
                    tablo(i, 5) = Empty
                End If
        Next i

        .Columns(1).Resize(, UBound(tablo, 2)).ClearContents
        .Range("A1").Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo
    End With

        Application.ScreenUpdating = True

End Sub

Même avec des milliers de ligne l’exécution du code sera instantanée

Voici le code modifié:

Sub Analyse()
Dim Ws As Worksheet
Dim tablo
Dim i&, j&

     Application.ScreenUpdating = False

    'Déclaration des Objets

    Set Ws = ThisWorkbook.Worksheets(1)

    With Ws
        ' Ajout des colonnes pour inclure les données manquantes
        tablo = .Range("A1").CurrentRegion

        For i = 2 To UBound(tablo, 1)
                ' Intégration des nouvelles données dans le bon onglet
                If tablo(i, 4) <> Empty And tablo(i, 1) = "Active commerce" And tablo(i, 2) = "OUI" And (tablo(i, 3) = "DR" Or tablo(i, 3) = "") _
                    And Left(tablo(i, 6), 14) = "Média manquant" Then
                        If tablo(i, 4) >= Date Then
                            tablo(i, 5) = 1
                            ElseIf tablo(i, 4) - Date < -1 And tablo(i, 4) - Date > -14 Then tablo(i, 5) = 2
                            ElseIf tablo(i, 4) - Date < -14 Then tablo(i, 5) = 3
                        End If
                Else
                    tablo(i, 5) = Empty
                End If
        Next i

        .Columns(1).Resize(, UBound(tablo, 2)).ClearContents
        .Range("A1").Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo
    End With

        Application.ScreenUpdating = True

End Sub

Même avec des milliers de ligne l’exécution du code sera instantanée

Effectivement ça marche au top,

Petite question pour éviter que je redemande, mais le fait de mettre : "And Left(tablo(i, 6), 14) = "Média manquant" Then"

cela veut dire qu'il lit par la gauche ? S'il y a un texte devant "Média manquant" cela ne fera plus fonctionner la formule je me trompe ?

Merci à toi

Petite question pour éviter que je redemande, mais le fait de mettre : "And Left(tablo(i, 6), 14) = "Média manquant" Then"

cela veut dire qu'il lit par la gauche ? S'il y a un texte devant "Média manquant" cela ne fera plus fonctionner la formule je me trompe ?

Oui c'est bien, le chiffre "14" correspond au 14 premiers caractère à partir de la gauche, si d'autre caractère se situe devant alors il faudra utiliser une autre méthode ( peut -être "Like") .

Ps: pour info, l'exécution du code sur plus de 1 millions de ligne prends 16 secondes

Voici le code avec la méthode "Like":

Sub Analyse()
Dim Ws As Worksheet
Dim tablo
Dim i&, j&

    c = Timer

     Application.ScreenUpdating = False

    'Déclaration des Objets
    Set Ws = ThisWorkbook.Worksheets(1)

    With Ws
        ' Ajout des colonnes pour inclure les données manquantes
        tablo = .Range("A1").CurrentRegion

        For i = 2 To UBound(tablo, 1)
                ' Intégration des nouvelles données dans le bon onglet
                If tablo(i, 4) <> Empty And tablo(i, 1) = "Active commerce" And tablo(i, 2) = "OUI" And (tablo(i, 3) = "DR" Or tablo(i, 3) = "") _
                    And tablo(i, 6) Like "*Média manquant*" Then
                        If tablo(i, 4) >= Date Then
                            tablo(i, 5) = 1
                            ElseIf tablo(i, 4) - Date < -1 And tablo(i, 4) - Date > -14 Then tablo(i, 5) = 2
                            ElseIf tablo(i, 4) - Date < -14 Then tablo(i, 5) = 3
                        End If
                Else
                    tablo(i, 5) = Empty
                End If
        Next i

        .Columns(1).Resize(, UBound(tablo, 2)).ClearContents
        .Range("A1").Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo
    End With

        Application.ScreenUpdating = True

   c = Timer - c

   Range("M1") = c

End Sub

[quote=Florian53 post_id=767254 time=1559132157 user_id=34896]

Oui c'est bien, le chiffre "14" correspond au 14 premiers caractère à partir de la gauche, si d'autre caractère se situe devant alors il faudra utiliser une autre méthode ( peut -être "Like") .

Ps: pour info, l'exécution du code sur plus de 1 millions de ligne prends 16 secondes

Je veux bien que tu m'éclaires sur la fonction "Like" je suis un peu de nature pessimiste et je pense qu'il risque fortement d'y avoir des cas avec plus de 14 caractères devant .. :/

Merci à toi

Edit : tu as répondu avant même que je te demande

Je regarde ça

Encore merci

Voici le code avec la méthode "Like":

Sub Analyse()
Dim Ws As Worksheet
Dim tablo
Dim i&, j&

    c = Timer

     Application.ScreenUpdating = False

    'Déclaration des Objets
    Set Ws = ThisWorkbook.Worksheets(1)

    With Ws
        ' Ajout des colonnes pour inclure les données manquantes
        tablo = .Range("A1").CurrentRegion

        For i = 2 To UBound(tablo, 1)
                ' Intégration des nouvelles données dans le bon onglet
                If tablo(i, 4) <> Empty And tablo(i, 1) = "Active commerce" And tablo(i, 2) = "OUI" And (tablo(i, 3) = "DR" Or tablo(i, 3) = "") _
                    And tablo(i, 6) Like "*Média manquant*" Then
                        If tablo(i, 4) >= Date Then
                            tablo(i, 5) = 1
                            ElseIf tablo(i, 4) - Date < -1 And tablo(i, 4) - Date > -14 Then tablo(i, 5) = 2
                            ElseIf tablo(i, 4) - Date < -14 Then tablo(i, 5) = 3
                        End If
                Else
                    tablo(i, 5) = Empty
                End If
        Next i

        .Columns(1).Resize(, UBound(tablo, 2)).ClearContents
        .Range("A1").Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo
    End With

        Application.ScreenUpdating = True

   c = Timer - c

   Range("M1") = c

End Sub

Afin de dormir moins bêtes et surtout vraiment comprendre plus le VBA, lorsque tu indiques : "Ajout de colonnes pour inclure les données manquantes" cela veut dire que tu "fais" virtuellement (non visible ou trop rapide) un tableau virtuel ? que tu supprimes à la fin du code ?

Pourrais-tu aussi me dire à quoi correspond : For i = 2 To UBound(tablo, 1) ? (la signification)

Je comprends : If tablo(i, 4) <> par le fait que la colonne "D" doit être remplit je me trompe ?

Merci à toi d'avance pour tes explications, en tout cas le code fonctionne du feu de dieu et effectivement le timer m'affiche du 0,44 c'est ultra rapide ahah

Voici en commentaires les explications, et au passage tu m'a fais remarqué que j'ai laissé des commentaires qui ne sont pas bon

Sub Analyse()
Dim Ws As Worksheet
Dim tablo
Dim i&, j&

    c = Timer

     Application.ScreenUpdating = False

    'Déclaration des Objets
    Set Ws = ThisWorkbook.Worksheets(1)

    With Ws
        ' Création & Alimentation du tableau "tablo"
        tablo = .Range("A1").CurrentRegion

        'Boucle sur chaque ligne du tableau "Tablo" de la ligne "2" à la dernière
        For i = 2 To UBound(tablo, 1)
               ' Si la condition est respectée
                If tablo(i, 4) <> Empty And tablo(i, 1) = "Active commerce" And tablo(i, 2) = "OUI" And (tablo(i, 3) = "DR" Or tablo(i, 3) = "") _
                    And tablo(i, 6) Like "*Média manquant*" Then
                        ' Alors on compare les dates
                        If tablo(i, 4) >= Date Then ' Date ">" ou "="
                            tablo(i, 5) = 1
                            ElseIf tablo(i, 4) - Date < -1 And tablo(i, 4) - Date > -14 Then tablo(i, 5) = 2 ' 1<Date<14
                            ElseIf tablo(i, 4) - Date < -14 Then tablo(i, 5) = 3 ' Date >14
                        End If
                Else
                    tablo(i, 5) = Empty ' Si la 1ere condition n'est pas respectée alors rien (Empty) sa évite de voir des "0" partout.
                End If
        Next i

        .Columns(1).Resize(, UBound(tablo, 2)).ClearContents 'Effacement du tableau dans la feuil "Feuil1" dans son intégralitée
        .Range("A1").Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo ' Intégration du nouveau tableau "tablo" dans la feuille "Feuil1"
    End With

        Application.ScreenUpdating = True

   c = Timer - c

   Range("M1") = c

End Sub

Voici en commentaires les explications, et au passage tu m'a fais remarqué que j'ai laissé des commentaires qui ne sont pas bon

Sub Analyse()
Dim Ws As Worksheet
Dim tablo
Dim i&, j&

    c = Timer

     Application.ScreenUpdating = False

    'Déclaration des Objets
    Set Ws = ThisWorkbook.Worksheets(1)

    With Ws
        ' Création & Alimentation du tableau "tablo"
        tablo = .Range("A1").CurrentRegion

        'Boucle sur chaque ligne du tableau "Tablo" de la ligne "2" à la dernière
        For i = 2 To UBound(tablo, 1)
               ' Si la condition est respectée
                If tablo(i, 4) <> Empty And tablo(i, 1) = "Active commerce" And tablo(i, 2) = "OUI" And (tablo(i, 3) = "DR" Or tablo(i, 3) = "") _
                    And tablo(i, 6) Like "*Média manquant*" Then
                        ' Alors on compare les dates
                        If tablo(i, 4) >= Date Then ' Date ">" ou "="
                            tablo(i, 5) = 1
                            ElseIf tablo(i, 4) - Date < -1 And tablo(i, 4) - Date > -14 Then tablo(i, 5) = 2 ' 1<Date<14
                            ElseIf tablo(i, 4) - Date < -14 Then tablo(i, 5) = 3 ' Date >14
                        End If
                Else
                    tablo(i, 5) = Empty ' Si la 1ere condition n'est pas respectée alors rien (Empty) sa évite de voir des "0" partout.
                End If
        Next i

        .Columns(1).Resize(, UBound(tablo, 2)).ClearContents 'Effacement du tableau dans la feuil "Feuil1" dans son intégralitée
        .Range("A1").Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo ' Intégration du nouveau tableau "tablo" dans la feuille "Feuil1"
    End With

        Application.ScreenUpdating = True

   c = Timer - c

   Range("M1") = c

End Sub

Au top, écoute je regardes pour ajouter ça avec mes nombreuses autres "formules". Après test j'ai l'impression que mon fichier fait une boucle infini je vais voir si je réussis à trouver le pourquoi. Mais ce qui est sûr c'est que ta réponse fonctionne du feu de dieu !

Encore un énorme merci à toi !

Rechercher des sujets similaires à "fonction reponses conditions dates"