Boucle pour équivalent d'une recherchev à deux critères

Stess -  
skk201 Messages postés 942 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

Ne maîtrisant pas l'utilisation des boucles, je solicite votre aide car je n'ai pas trouvé de post résolu se rapprochant de ma problématique.

Voici la structure simplifiée de mon fichier :

Colonne A = Client
Colonne B = Produit
Colonne C = Date de commande
Colonne D = Date de la précédente commande (même Client, même Produit)
Disons que ma plage de Cellules est $A$1:$D$3000 (il existe d'ailleurs peut-être une formule pour ajuster automatiquement la plage de cellule à la dernière ligne remplie ?)

Mon besoin : renseigner la colonne D par une boucle qui va chercher pour une ligne donnée, la date de la commande précédente la plus récente pour le même client et le même produit.

Je vous remercie par avance pour votre aide précieuse.

Bien à vous

Stess

2 réponses

  1. skk201 Messages postés 942 Date d'inscription   Statut Membre Dernière intervention   55
     
    Bonjour voilà qqchose qui pourrai marcher :

    Il faut le mettre dans le code de la feuille concernée

    et il faut que la 4 ème collonne ai un format date

    Il peut y avoir un titre

    Il ne doit pas y avoir de ligne vide dans la liste ! si non elle sera considéré comme la dernière ligne


    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 3 Then Exit Sub
    If Target.Column = 3 Then 'S'execute s'il y a un changement dans la collonne "C"
    Dim CTRL_A As String 'V : CTRL de la valeur de la colonne A
    Dim CTRL_B As String 'V : CTRL de la valeur de la colonne B
    Dim CL_A As String 'V : Nom du client à chercher
    Dim PR_B As String 'V : Nom du produit à chercher
    Dim Ligne As Integer 'V : Ligne en cours
    Ligne = 2 'La ligne 2 est définie car la ligne 1 contient surement des titres
    Dim Ligne_end As Integer 'V : N° de la dèrnière ligne
    Dim Date_end As Long 'Valeur de la date en format nombre

    CTRL_A = Cells(Ligne, 1).Value 'Initialisation de la valeur de CTRL avant la boucle
    Do 'Cherche la valeur de la dèrnière ligne
    Ligne = Ligne + 1
    CTRL_A = Cells(Ligne, 1).Value
    Loop While CTRL_A <> ""

    Ligne_end = Ligne - 1 'sauvegarde la dernière ligne
    Ligne = 2 ' Réinitialise la valeur de la ligne
    CL_A = Cells(Ligne_end, 1).Value 'sauvegarde le client
    PR_B = Cells(Ligne_end, 2).Value 'sauvegarde le produit

    CTRL_A = Cells(Ligne, 1).Value 'Initialisation des valeur pour la boucle
    CTRL_B = Cells(Ligne, 2).Value
    Do While Ligne <> Ligne_end
    If CTRL_A = CL_A Then
    If CTRL_B = PR_B Then
    Date_end = Cells(Ligne, 3).Value 'Sauvegarde de la valeur date
    End If
    End If
    Ligne = Ligne + 1
    CTRL_A = Cells(Ligne, 1).Value
    CTRL_B = Cells(Ligne, 2).Value

    Loop
    Cells(Ligne_end, 4) = Date_end

    End If
    End Sub

    Bonne journée :) // N'oubliez pas de mettre RESOLU !

    *Pensez mettre vos messages en [Résolu] et cliquer sur le + des conseil qui vous ont été utils"
    0
  2. Stess
     
    Bonjour skk201,

    Merci beaucoup d'avoir pris le temps de vous pencher sur ma demande, c'est vraiment agréable de pouvoir compter sur les membres du forum et de se sentir aidée!
    En adaptant le code à la réalité de mon fichier, j'ai quelques questions et erreurs à lever. Excusez moi par avance, pour le niveau des questions, je débute en vba...

    1. Quand on inscrit le code directement dans une feuille en tant que Private Sub, il s'éxecute directement ? ici à chaque changement sur la feuille ?

    2. Ma date de commande dans mon fichier complet est en colonne 21, je dois bien remplacer 3 par 21 dans le code ci-dessous ?
    If Target.Count > 3 Then Exit Sub
    If Target.Column = 3 Then

    Par avance, merci pour votre accompagnement!
    Bonne journée à vous

    Stess
    0
    1. skk201 Messages postés 942 Date d'inscription   Statut Membre Dernière intervention   55
       
      Oui Le code s'execute si il y a un changement dans la collonne 3 (La nouvele date de la commande)
      D'ou le :
      If Target.column = then

      Dans l'idée c'était que les infos soient renplies les unes après les autres. et que donc la colonne 3 soit la dernière. Une fois que la dernière info a été transcrite, elle allait chercher l'info a ajouter dans la collonne 4.

      Le numér afficher indique quand il faut aller chercher la date de l'enregistrement en question. à vous d'adapter en fonction de votre document.

      Si vous avez des questions n'hésitez pas :)
      0