Extraction de ligne suivant une condition

Bonjour à tous,

J'ai un tableau Excel, qui comprend 7 colonnes (qui viennent qu'une source externe), pour avoir une date lisible je concatène les colonnes JJ, MM, AA pour obtenir une date au format JJ/MM/AA ce qui fait ma 8ième colonne.

Je souhaite effectuer une extraction vers une autre feuille du classeur pour avoir les informations au Jour J et a J-1

j'ai mis dans ma feuille Jour J la date du jour en A1 (=AUJOUDHUI() ) et dans ma feuille J-1 toujours en A1 la date de la veuille ( sans les weekend) (=+SI(JOURSEM(AUJOURDHUI()-1;2)>5;AUJOURDHUI()-3;AUJOURDHUI()-1) )

je ne m'en sors pas pour récupérer les lignes dans ma de données, j'ai essayé avec des imbrications de conditions et des recherches INDEX mais rien ne fonctionnent.

j'ai essayé de contourner le problème en concaténant les données dans une cellule pour ensuite faire une rechercheV mais la encore pas de résultats concluant car il peut y avoir plusieurs lignes qui ont la même date donc seulement la première ressort.

Pour vous m'aiguiller dans ma recherche ? je pense que la solution est dans l'imbrication de conditions mais je ne suis pas assez calé en imbrication de fonctions pour m'en sortir seul et les recherches que j'ai faite sur ces imbrications, ben je ne les comprends pas pour essayer de les adapter

Je vous met le fichier en pièce jointe

8fnc.xlsx (88.56 Ko)

Bonjour,

Voici un essai par formules avec des tableaux structurés :

17fnc.xlsx (98.30 Ko)

Super pratique de mettre un exemple sans données quasiment pour la date du jour et la veille .

J'ai rempli uniquement la première colonne de chaque tableau. J'ai supposé que vous sauriez remplir les autres.

Vous savez, vous pouvez utiliser la fonction DATE(année;mois;jour) au lieu de concaténer. Ca vous renverra une date car je crois que c'est ce qui vous bloquait.

Cdlt,

Bonjour,

Merci de votre retour, je vais regarder et essayer de comprendre la formule pour l'adapter aux autres cellules.

Je me suis aperçu de la différence de format de date entre la date du jour et ma concaténation. la fonction rechercheV que je testais a fonctionnée lorsque j'ai mis les mois du tableau de donnée sur 2 chiffres, il faut que je regarde pour modifier cela en ajoutant un zero devant les mois à 1 chiffres.

Merci encore

Re,

Non, c'est bon. Soit, vous laissez vos dates du tableau principal au format "J/M/AAAA". Dans ce cas, ma formule fonctionnera car elle gère cette conversion de la date du jour en ce format texte.

Soit (ce que je recommande), vous changez votre formule dans la colonne des dates de l'onglet principal. Au lieu d'avoir concatener(...), vous aurez :

=DATE(annee,mois;jour)

Ca renverra une date et la correspondance sera plus simple mais il faudra modifier dans mes formules le TEXTE($A$1:"J/M/AAAA") par $A$1.

Cdlt,

Bonjour à tous,

Je ne sais pas si c'est la bonne méthode mais je réouvre ce sujet, dites moi si cela ne convient pas j'ouvrirai un autre fil.

c'est toujours sur la même problématique, mais cette fois j'ai tenté de passer par une macro, elle semble fonctionner mais je ne récupère pas les bonnes dates dans la colonne date, les autres données semblent correctes.

je vous mets le fichier avec les macros, elles sont toutes construite de la même manière:

Sub Filtreencours()

  Dim Lig As Long, Col As String, NbrLig As Long, NumLig As Long

  Sheets("FNC En cours").Activate ' feuille de destination

  Col = "H"                 ' colonne de la donnée non vide à tester
  NumLig = 3
  With Sheets("FNC")     ' feuille source
  NbrLig = .Cells(1000, Col).End(xlUp).Row
  For Lig = 1 To NbrLig
    If .Cells(Lig, Col).Value = Sheets("FNC En cours").Range("A1") Then
      .Cells(Lig, Col).EntireRow.Copy
      NumLig = NumLig + 1
      Cells(NumLig, 1).Select
      ActiveSheet.Paste
    End If
  Next
  End With

End Sub

ma feuille de donnée se nomme FNC qui contient les données que je souhaite trier par date

la feuille FNC J-1 doit récupérer que les données de la veille avec comme référence la cellule A1

la feuille FNC Jour J, celle du jour avec comme référence la cellule A1

et la dernière feuille FNC En cours, toutes celles qui ne sont pas soldées avec un S dans la colonne H, et toujours ma référence (vide) en A1

je récupère me semble t il les bonne informations mais toujours avec des dates des premières lignes ensuite ca semble fonctionner, je ne voit pas ou mon erreur peut être.

Pouvez vous me guider ?

Merci

7liste-fnc.xlsm (96.56 Ko)

Bonjour Laurchante,

En effet, il aurait fallu créer un autre sujet car celui-ci est résolu et ce n'est pas vraiment le même problème...

Pour J-1, je crois que c'est normal, il n'y a pas de données le 24/02.

En tout cas, voici une proposition de code avec une macro qui en exécute une seconde, cette dernière dépendant de paramètres variables (la feuille de destination, la colonne du critère, le critère). J'ai renommé un onglet "FNC J" (c'est ce nom qui est utilisé dans le code) :

Sub Exporter()

tfeuilles = Array("FNC J", "FNC J-1", "FNC En cours")
tcrit = Array(Date, Date - 1, "")
tcolcrit = Array(1, 1, 8)

For i = LBound(tfeuilles) To UBound(tfeuilles)
    Call FiltreJant(Sheets(tfeuilles(i)), tcrit(i), tcolcrit(i))
Next i

End Sub

Sub FiltreJant(FeuilleDestination As Worksheet, Critere, Col_Critere)

With Range("Tableau_chromalldb")
    t = .Value
    For i = 1 To .Rows.Count
        If t(i, Col_Critere) = Critere Then
            n = n + 1
            For k = 1 To .Columns.Count
                t(n, k) = t(i, k)
            Next k
        End If
    Next i
End With

If n > 0 Then
    With FeuilleDestination
        nvl = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        .Cells(nvl, 1).Resize(n, UBound(t, 2)).Value = t
    End With
End If

End Sub
6liste-fnc.xlsm (139.82 Ko)

Cdlt,

Merci de ton retour.

Je viens de regarder ta macro, je t'avoue que là c'est un peu compliqué pour moi, je ne saisie pas tout.

En la testant pas a pas, je vais essayer de voir ce qu'elle fait, j'ai vu que tu mettais les critères en 'dur' dans la macro est ce possible de mettre des cellules (valeur de A1 ou autre pour chaque feuille ?)

Autre point est possible vider les résultats, ou les écraser a chaque exécution ?

Merci

Si tu veux, je peux t'expliquer ce que tu ne comprends pas...

Tout ce que j'ai mis en dur était déjà tel quel dans ton fichier (à part Date et Date-1). C'est possible en tout cas...

Voici un nouvel essai avec remplacement des valeurs :

Sub Exporter()

tfeuilles = Array("FNC J", "FNC J-1", "FNC En cours")
tcolcrit = Array(1, 1, 8)

For i = LBound(tfeuilles) To UBound(tfeuilles)
    Call FiltreJant(Sheets(tfeuilles(i)), tcolcrit(i))
Next i

End Sub

Sub FiltreJant(FeuilleDestination As Worksheet, Col_Critere)

With Range("Tableau_chromalldb")
    t = .Value
    For i = 1 To .Rows.Count
        If t(i, Col_Critere) = FeuilleDestination.range("A1").value Then
            n = n + 1
            For k = 1 To .Columns.Count
                t(n, k) = t(i, k)
            Next k
        End If
    Next i
End With

With FeuilleDestination.range("A4").currentregion.offset(1, 0) '<<<< ADAPTER (DOIT ETRE IDENTIQUE SUR CHAQUE FEUILLE)
    .clearcontents
    if n > 0 then .Resize(n, UBound(t, 2)).Value = t
End with

End Sub

J'ai enlevé les critères en dur qui dépendent maintenant de la valeur de A1 de chaque feuille.

Pour la destination, il faudra adapter la zone car je n'ai pas rouvert le fichier. J'ai supposé ici que les titres étaient en A4. On efface les données des lignes suivantes et on y colle les nouvelles valeurs.

Cdlt,

ok alors si j'ai bien compris, tu nommes chaque feuille comme étant un tableau, ensuite tu définis les colonnes où je dois chercher les informations.

Il y a une boucle où pour chaque tableau tu appelles la fonction principale.

pour la fonction principale, c'est là ou je me perds...

Tu fais une boucle pour chaque ligne du tableau chromalldb afin de comparer les valeurs a la celle de la zone A1 de chaque feuille

c'est avec le With que j'ai du mal :

With FeuilleDestination.range("A4").currentregion.offset(1, 0) '<<<< ADAPTER (DOIT ETRE IDENTIQUE SUR CHAQUE FEUILLE)
.clearcontents
if n > 0 then .Resize(n, UBound(t, 3)).Value = t
End with

je comprends que tu effaces le contenu des cellules a partir de A4 mais je ne comprends cette ligne : if n > 0 then .Resize(n, UBound(t, 3)).Value = t

J'ai commenté sur le code directement :

Sub Exporter()

'permet de factoriser le code : chaque item du 1er tableau est lié à l'item correspondant dans le second tableau
tfeuilles = Array("FNC J", "FNC J-1", "FNC En cours") 'tableau avec les noms de feuille
tcolcrit = Array(1, 1, 8) 'tableau avec les colonnes à cibler (pour l'évaluation du critère)

For i = LBound(tfeuilles) To UBound(tfeuilles) 'pour chaque cas (chaque feuille de destination en l'occurrence)
    Call FiltreJant(Sheets(tfeuilles(i)), tcolcrit(i)) 'on execute la macro FiltreJant avec comme feuille de destination l'item en cours de tfeuilles et comme colonne de critère l'item en cours de tcolcrit
Next i

End Sub

Sub FiltreJant(FeuilleDestination As Worksheet, Col_Critere)

With Range("Tableau_chromalldb") 'avec tableau de FNC (la base)
    t = .Value 't recoit les valeurs (t est un tableau dynamique, une variable a plusieurs dimensions)
    For i = 1 To .Rows.Count 'pour chaque ligne de t
        If t(i, Col_Critere) = FeuilleDestination.range("A1").value Then 'si l'item à la ligne en cours, à la colonne ColCritere vaut A1 de la feuille de destination
            n = n + 1 'incrémentation n
            For k = 1 To .Columns.Count 'pour chaque colonne, la ligne n reprend les valeurs en cours (ligne i)
                t(n, k) = t(i, k) '****a pour effet d'écraser les valeurs précédentes (donc de faire une sorte de tri ou de tassage des bonnes valeurs pour qu'elles figurent en première position du tableau >>> voir plus loin ligne if n > 0)
            Next k
        End If
    Next i
End With

With FeuilleDestination.range("A4").currentregion.offset(1, 0) 'avec la région courante (equivalent ctrl + A) de A4 (de la feuille de destination), décalée d'une ligne (pour éviter de toucher aux entêtes) >>> on est donc sur une plage ("A5:H10" par exemple si region courante valait "A4:H9")
    .clearcontents 'on efface les valeurs
    if n > 0 then .Resize(n, UBound(t, 2)).Value = t '****si n > 0, donc si la condition a été vérifiée au moins une fois, on colle les valeurs limitées à n lignes (ubound(t,2) signifie le nombre de colonnes de t).
End with

End Sub

J'espère que ce sera plus clair...

en effet c'est plus claire merci.

par contre lors de la première exécution tout fonctionne bien et si je relance la macro, elle écrase les entêtes en mettant le résultat sur les feuilles FNC J, FNC J-1 et FNC En cours

Oui, comme je t'ai dit et marqué sur le code, il faut mettre la bonne référence : remplacer A4 par la référence de la première cellule des en-têtes du tableau et les tableaux des 3 feuilles doivent se trouver au même endroit.

J'ai fait un premier code puis je l'ai modifié à te demande mais sans rouvrir le fichier donc j'ai oublié l'endroit précis où se trouvent les tableaux des 3 feuilles...

sur mes 3 tableaux j'ai les entêtes de colonnes qui sont en A2, j'ai donc remplacé A4 par A2, et mes entêtes ont été écrasés par les données il en est de même si je mets A3

Avec une ligne d'espace entre A1 et les en-têtes, ou avec un tableau structuré, il n'y aurait pas ce problème en principe...

Voici un nouvel essai :

Sub Exporter()

tfeuilles = Array("FNC J", "FNC J-1", "FNC En cours")
tcolcrit = Array(1, 1, 8)

For i = LBound(tfeuilles) To UBound(tfeuilles)
    Call FiltreJant(Sheets(tfeuilles(i)), tcolcrit(i))
Next i

End Sub

Sub FiltreJant(FeuilleDestination As Worksheet, Col_Critere)

With Range("Tableau_chromalldb")
    t = .Value
    For i = 1 To .Rows.Count
        If t(i, Col_Critere) = FeuilleDestination.range("A1").value Then
            n = n + 1
            For k = 1 To .Columns.Count
                t(n, k) = t(i, k)
            Next k
        End If
    Next i
End With

With FeuilleDestination
    dl = .cells(.rows.count, 1).end(xlup).row
    with .range("A3:H" & dl) <<<<<<<<<<<<
        .clearcontents
        if n > 0 then .Resize(n, UBound(t, 2)).Value = t
    end with
End with

End Sub

Ca devrait marcher maintenant. Il faut quand même surveiller la colonne de fin (j'ai mis H de mémoire mais c'est peut-^tre I ?).

merci pour tes essais, ca fonctionne pour les 2 feuilles FNC J et FNC En cours mais pas pour FNC J-1 les entêtes sont écrasées juste pour cette feuille ?

J'ai essayé en 'jouant' avec la ligne With .Range("A4:K" & dl) en modifiant la cellule mais pas mieux.

Voici le code que j'ai remis a jour avec mes paramètres

Sub Exporter()

tfeuilles = Array("FNC J", "FNC J-1", "FNC En cours")
tcolcrit = Array(1, 1, 10)

For i = LBound(tfeuilles) To UBound(tfeuilles)
    Call FiltreJant(Sheets(tfeuilles(i)), tcolcrit(i))
Next i

End Sub

Sub FiltreJant(FeuilleDestination As Worksheet, Col_Critere)

With Range("Tableau_chromalldb")
    t = .Value
    For i = 1 To .Rows.Count
        If t(i, Col_Critere) = FeuilleDestination.Range("L1").Value Then
            n = n + 1
            For k = 1 To .Columns.Count
                t(n, k) = t(i, k)
            Next k
        End If
    Next i
End With

With FeuilleDestination
    dl = .Cells(.Rows.Count, 1).End(xlUp).Row
    With .Range("A3:K" & dl) '<<<<<<<<<<<< les entetes de tous mes tableaux sont en ligne 2 (A2:K2)
        .ClearContents
        If n > 0 Then .Resize(n, UBound(t, 2)).Value = t
    End With
End With

End Sub

Si les en-têtes sont écrasées, c'est qu'elles sont en ligne 3 , enfin je pense.

5liste-fnc.xlsm (71.83 Ko)

qu'on se comprenne les entêtes sont bien les titres de mes colonnes ?

si oui elles sont bien toutes en ligne 2 de A à K ci joint le fichier si tu souhaite vérifier.

image image image image

Merci

En effet, lorsqu'il n'y a aucune cellule avant l'exécution, la dernière ligne trouvée est la 2, ce qui crée un souci sur .range("A3:K" & dl) car ça revient à range("A2:K3"), d'où l'écrasement.

J'ai donc modifié la ligne dl ainsi :

dl = Application.Max(.Cells(.Rows.Count, 1).End(xlUp).Row, 3)
7liste-fnc.xlsm (71.05 Ko)

dl est au minimum la ligne 3 !

Cdlt,

Merci beaucoup de ton aide la gestion de tableau c'est encore un peu 'obscure' pour mon niveau...

Je vais y travailler !

Rechercher des sujets similaires à "extraction ligne suivant condition"