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)... !
Il faut donc commencer par là !
Les autres explications (que je n'ai pas plus compris que Curulis !
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!
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 SubBonjour 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
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 SubBonjour 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 SubBonjour h2s04,
Votre code modifié fonctionne à merveille. Mon problème est réglé et je vous remercie beaucoup de votre aide.
Merci.