Comment détecter les nouvelles lignes par VBA

Bonjour,

Je suis une débutante en VBA et j'ai un projet annuel pour écrire un code VBA pour détecter les nouvelles lignes ajoutées.

J'ai une liste de numéro qui doit être mis-jour chaque mois pour donner un nouveau numéro à la nouvelle ligne ajoutée selon le nom concaténé:

Nom Numéro

20117JohnsonAnnie 1

20153ClarkJohn 2

200111DeppJanice 3

20132AndersonLucy 4

J'ai également un fichier de donnée chaque mois qui inclut les nouvelles données qui seront ajoutées dans la liste de numéro:

Date courante 30/09/2017

Nom Prénom Émis - Année Émis - Mois

Johnson Annie 2011 7

Clark John 2015 3

Depp Janice 2001 11

Anderson Lucy 2013 2

Kelly Alice 2017 9

Laydon Jade 2017 9

Wang Linda 2017 6

Jackson Jerry 2001 8

Ce que je voudrais: un message box qui va montrer:

Nous allons créer 4 nouvelles lignes, dont il y a 2 lignes avec la date d'émission inférieure que la date courante:

2017-6 Wang Linda

2001-8 Jackson Jerry

Vous voulez continuer?

Est-ce que vous pouvez m'aider sur ce problème?

Merci beaucoup de votre aide à l'avance!

Salut linedolc,

il va falloir trouver une autre voie pour expliquer parce que, moi en tout cas... je n'ai à peu près rien compris!

Un fichier avec tes données et un exemple de ce que tu veux faire avec la pourquoi du comment ne serait pas inutile!

A+

Bonsoir, Salut Curulis !

Détecter si une ligne est nouvelle ?

Si une ligne nouvelle a (ou n'a pas) ne serait-ce qu'un tout petit quelque chose infinitésimal, qu'une ligne ancienne n'a pas (ou a)... ! Là on peut détecter ! Il suffit juste de savoir quoi qui fait la différence !

Il faut donc commencer par là !

Les autres explications (que je n'ai pas plus compris que Curulis ! ) pourront venir ensuite... accompagnées d'un fichier autant que possible.

Cordialement.

Bonjour,

Merci de votre réponse. J'ai ajouté un fichier pour mieux expliquer ma question:

Le côté Data: ce sont les données renouvelées chaque mois;

Le côté List: c'est la liste que je dois mettre à jour chaque mois afin que je puisse donner un numéro pour chaque nouvelle ligne ajoutée.

Ce que je voudrais est: un message box va apparaitre pour me montrer combien de nouvelles lignes qui seront ajoutées dans la Liste, dont il y a combien de lignes dans lesquels la date d'émission est inférieure que la date courante, qui me donne également les détails sur ces lignes (la date d'émission, le nom etc).

Merci beaucoup!

25test.xlsx (9.66 Ko)

Bonjour,

une proposition, j'ai légèrement dévié de ta demande , la demande confirmation de l'ajout se fait après chaque nouvelle ligne trouvée et non sous forme d'une synthèse des lignes à ajouter qu'ilfaut accepter ou refuser en bloc.

Sub aargh()
    With Sheets("test") 'feuille
        dld = .Cells(6, "A").End(xlDown).Row 'dernière ligne data
        dll = .Cells(6, "K").End(xlDown).Row 'dernière ligne liste
        For i = 6 To dld 'on parcourt data
            n = .Cells(i, "C") & .Cells(i, "D") & .Cells(i, "A") & .Cells(i, "B") 'n =clé concaténée
            Set pl = .Range("K6:K" & dll) 'plage de recherche
            Set re = pl.Find(n, lookat:=xlWhole, LookIn:=xlValues) 'recherche de n dans la plage
            If re Is Nothing Then 'si pas trouvé
                m = "ok to add " & .Cells(i, "A") & " " & .Cells(i, "B") & " " & .Cells(i, "C") & "-" & .Cells(i, "D") 'génération d'un message
                If .Cells(i, "C") & Format(.Cells(i, "D"), "00") < Format(Date, "yyyymm") Then m = m & vbCrLf & "issue date is lower than current date"
                ans = MsgBox(m, vbYesNo) 'ok pour ajouter ?
                If ans = vbYes Then si oui
                    ra = ra + 1 'incrémente compteur ligne ajoutée
                    dll = dll + 1 'incrémente nombre d'éléments dans liste
                    .Cells(dll, "K") = n 'mise des données dans liste
                    .Cells(dll, "L") = .Cells(dll - 1, "L") + 1 ' numero
                End If
            End If
        Next i
    End With
    MsgBox ra & " records added"
End Sub

Bonjour h2s04,

Merci beaucoup de votre aide. Je pense que peut-être j'ai pas bien expliqué: ce que je voulais est de sortir un message box qui montre :

1. En total il y a combien de nouvelles lignes qui seront ajoutées dans la plage de List; comme dans mon exemple - il y a en total 4 nouvelles lignes qui seront ajoutées (La ligne : Alice Kelly, Jade Laydon, Linda Wang et Jerry Jackson);

2. Dans le même message, j'aimerais bien voir combien de nouvelles lignes dont la date d'émission est inférieur que la date courante; comme dans mon exemple - il y a 2 cas (Linda Wang et Jerry Jackson).

Voici le message box en exemple:

We are going to creat 4 new lines in which there are 2 lines whose issue date is inferior than the current date

2017-6 Wang Linda

2001-8 Jackson Jerry

Would you want to continue?

Yes No

Merci beaucoup!

Bonjour,

tu avais très bien expliqué, mais il me semblait que ce que tu demandais risquait de ne pas atteindre l'objectif souhaité.

j'ai adapté la macro à ton souhait, sans plus. mais il me semble qu'il manque quelque chose la réponse à la question "ok pour ajouter ? "n'est pas traitée.

Sub aargh()
    With Sheets("test")    'feuille
        dld = .Cells(6, "A").End(xlDown).Row    'dernière ligne data
        dll = .Cells(6, "K").End(xlDown).Row    'dernière ligne liste
        m = ""
        For i = 6 To dld    'on parcourt data
            n = .Cells(i, "C") & .Cells(i, "D") & .Cells(i, "A") & .Cells(i, "B")    'n =clé concaténée
            Set pl = .Range("K6:K" & dll)    'plage de recherche
            Set re = pl.Find(n, lookat:=xlWhole, LookIn:=xlValues)    'recherche de n dans la plage
            If re Is Nothing Then    'si pas trouvé
                ra = ra + 1
                If .Cells(i, "C") & Format(.Cells(i, "D"), "00") < Format(Date, "yyyymm") Then
                    m = m & vbCrLf & .Cells(i, "C") & "-" & .Cells(i, "D") & " " & .Cells(i, "A") & " " & .Cells(i, "B")
                    rd = rd + 1
                End If
                   End If
            Next i
            m = "we are going to create " & ra & " new lines of which " & rd & " have their issue date inferior to current date" & m
            m = m & vbCrLf & "do you want to continue ?"
            ans = MsgBox(m, vbYesNo)    'ok pour ajouter ?
    End With
End Sub

Bonjour h2s04,

Merci beaucoup encore une fois de votre aide. Votre code fonctionne super bien. J'ai une question: Est-ce qu'on peut utiliser la fonction VLookup au lieu de Find pour faire la recherche de clé concaténée?

J'ai modifié un peu de votre code avec la fonction VLookup, mais il y a une erreur: Erreur définie par l'application ou par l'objet. Est-ce que vous pouvez m'aider à voir ça?

Voici la code que j'ai modifié légèrement:

Dim dld, dll, i, pl, m, ans, ra, rd, re, n As Variant

With Sheets("test") 'feuille

dld = .Cells(6, "A").End(xlDown).Row 'dernière ligne data

dll = .Cells(6, "K").End(xlDown).Row 'dernière ligne liste

m = ""

For i = 6 To dld 'on parcourt data

n = .Cells(i, "C") & .Cells(i, "D") & .Cells(i, "A") & .Cells(i, "B") 'n =clé concaténée

re = Application.VLookup(n, Sheets("Test").Range("K6:L"), 2, False)

If IsError(re) Then 'si pas trouvé

ra = ra + 1

If .Cells(i, "C") & Format(.Cells(i, "D"), "00") < Right(Range("A3"), 4) & Left(Right(Range("A3"), 7), 2) Then

m = m & vbCrLf & .Cells(i, "C") & "-" & .Cells(i, "D") & " " & .Cells(i, "A") & " " & .Cells(i, "B")

rd = rd + 1

End If

End If

Next i

m = "we are going to create " & ra & " new lines of which " & rd & " have their issue date inferior to current date" & m

m = m & vbCrLf & "do you want to continue ?"

ans = MsgBox(m, vbYesNo) 'ok pour ajouter ?

End With

Merci beaucoup!

Bonjour,

c'est possible aussi avec vlookup, si tu y tiens absolument.

Sub test()
    Dim dld, dll, i, pl, m, ans, ra, rd, re, n As Variant
    With Sheets("test")    'feuille
        dld = .Cells(6, "A").End(xlDown).Row    'dernière ligne data
        dll = .Cells(6, "K").End(xlDown).Row    'dernière ligne liste
        m = ""
        For i = 6 To dld    'on parcourt data
            n = .Cells(i, "C") & .Cells(i, "D") & .Cells(i, "A") & .Cells(i, "B")    'n =clé concaténée
            re = Application.VLookup(n, Sheets("Test").Range("K6:L" & dll), 2, False)
            If IsError(re) Then    'si pas trouvé
                ra = ra + 1
                If .Cells(i, "C") & Format(.Cells(i, "D"), "00") < Right(Range("A3"), 4) & Left(Right(Range("A3"), 7), 2) Then
                    m = m & vbCrLf & .Cells(i, "C") & "-" & .Cells(i, "D") & " " & .Cells(i, "A") & " " & .Cells(i, "B")
                    rd = rd + 1
                End If
            End If
        Next i
        m = "we are going to create " & ra & " new lines of which " & rd & " have their issue date inferior to current date" & m
        m = m & vbCrLf & "do you want to continue ?"
        ans = MsgBox(m, vbYesNo)    'ok pour ajouter ?
    End With
End Sub

Bonjour h2s04,

Votre code modifié fonctionne à merveille. Mon problème est réglé et je vous remercie beaucoup de votre aide.

Merci.

Rechercher des sujets similaires à "comment detecter nouvelles lignes vba"