Renvoyer la valeur suivante d'une colonne selon des conditions

Bonjour à tous,

Je reviens (encore) solliciter votre aide pour un problème que je n'arrive pas à résoudre seul.
Je travaille avec un import qui parfois, ne fonctionne pas correctement et me renvoie des valeurs fausses (n° de sécu "99999999999", noms et prénoms vides dans le fichier joint)

Lorsque c'est le cas, si les cellules de mes colonnes A et C sont égales à celles des lignes suivantes, c'est qu'il s'agit de la même personne et je souhaite donc que les cellules contenant des données fausses renvoient la prochaine valeur correcte de la colonne.

Pour que ce soit plus explicite, j'ai joint un exemple avec le problème et l'objectif recherché (feuille 1 et 2)

Voici l’état actuel de mon code, dont le début semble fonctionner, sauf que je ne sais pas comment renvoyer la valeur suivante et conforme de la colonne.

Merci d’avance pour le coup de pouce et bonne journée !

11aide1.xlsx (14.21 Ko)
Sub test1()
Dim TV As Variant 
Dim I As Integer
Dim OS As Worksheet 

Set OS = Sheets("BASE") 'définit l'onglet source OS
TV = OS.Range("A1").CurrentRegion 'définit le tableau des valeurs TV

For I = 1 To UBound(TV, 1)

If TV(I,5) = "9999999999999" AND TV(I, 1) = TV(I + 1, 1) AND If TV(I, 3) = TV(I + 1, 3)  Then

 TV(I, 4)= Renvoyer la valeur suivante dans cette colonne différente de "9999999999999"
 TV(I, 5)=Renvoyer la valeur suivante dans cette colonne différente de ""

End If
Next
End Sub

Bonjour,

Voici un fichier avec une macro qui devrait faire l'affaire.

Amicalement.

15aide1.xlsm (30.82 Ko)

Bonjour,

Merci beaucoup, ça fonctionne parfaitement.

Par contre, je ne comprends pas vraiment le mécanisme derrière ton code, ni comment Derlig permet de renvoyer la première valeur "correcte" de la colonne.

J'ai mis des annotations dans ton code, si tu veux bien m'expliquer pour que je sache faire moi-même la prochaine fois

Sub soluce()

Dim i As Integer, Secu As String, Nom As String, Prenom As String, DerLig As Integer

    Application.ScreenUpdating = False '? 
    DerLig = Range("A" & Rows.Count).End(xlUp).Row '? Derlig = Renvoie une ligne en dessous à chaque fois ? Pourquoi précises-tu la colonne A ? 
    Secu = Range("E" & DerLig)
    Nom = Range("F" & DerLig)
    Prenom = Range("G" & DerLig)

    For i = DerLig To 2 Step -1 ' Je vois que ça boucle sur chaque ligne mais je ne comprends pas d'où vient le "To 2 step -1"
        If Range("E" & i) = "9999999999999" Then 'Renvoie sur la ligne suivante à chaque fois que la cellule renvoie 999..., jusqu'à trouver un autre résultat? 
            Range("E" & i) = Secu
            Range("F" & i) = Nom
            Range("G" & i) = Prenom
        Else
            Secu = Range("E" & i)
            Nom = Range("F" & i)
            Prenom = Range("G" & i)
        End If
    Next i
End Sub

Merci d'avance,

Gal

DerLig cherche la dernière ligne de la colonne A (choisie car elle semble toujours correspondre à la dernière ligne utilisée, sinon il aurait fallu choisir le colonne toujours remplie).

For i = DerLig To 2 Step -1 : comme tes données à reprendre sont placées en fin de liste, je pars du fond (DerLig) jusqu'au sommet (ligne 2) par étape de moins une ligne. Donc si la dernière ligne est par exemple 5, on traite la ligne 5, puis 4, puis 3, puis 2.

La première fois, les données de base (Secu - Nom - Prenom) sont sur la dernière ligne. On en prend note avant de commencer à boucler.

A la première boucle For/Next, sur la dernière ligne, il ne devrait pas y avoir de 99999999999, donc la macro note à nouveau les informations qu'elle connait déjà (i = alors DerLig).

Ensuite on remonte dans les lignes et soit il y a 9999999999, alors les dernières valeurs connues de Secu-Nom-Prenom sont inscrites, soit on prend note des nouvelles valeurs (If-Else-End If).

Application.ScreenUpdating : place ton curseur sur ScreenUpdating et tape F1 (touche magique :-)). Tu reçois alors plein d'infos intéressantes.

Si nécessaire, reviens à la charge.

Cordialement.

Merci beaucoup !

En fait, la partie mise en commentaire ci-dessous est parfaitement inutile, puisqu'à la première boucle For/Next, la condition If/Else/End If ne peut pas trouver de 9999999999 sur la dernière ligne (variable DerLig) et passe obligatoirement par la partie Else, donc charge les premières références nécessaires.

Sub Corrections()
    Dim i As Integer, Secu As String, Nom As String, Prenom As String, DerLig As Integer

    Application.ScreenUpdating = False
    DerLig = Range("A" & Rows.Count).End(xlUp).Row
'''    Secu = Range("D" & DerLig)
'''    Nom = Range("E" & DerLig)
'''    Prenom = Range("F" & DerLig)

    For i = DerLig To 2 Step -1
        If Range("D" & i) = "9999999999999" Then
            Range("D" & i) = Secu
            Range("E" & i) = Nom
            Range("F" & i) = Prenom
        Else
            Secu = Range("D" & i)
            Nom = Range("E" & i)
            Prenom = Range("F" & i)
        End If
    Next i
End Sub

Sincèrement.

Rechercher des sujets similaires à "renvoyer valeur suivante colonne conditions"