Sub Macro1()
Dim cel As Range 'déclare la variable cel (CELlule)
Dim col As Integer 'déclare la variable col (COLonne)
Dim li As Integer 'déclare la variable li (LIgne)
Dim dest As Range 'déclare la variable dest (DESTination)
Dim pl As Range 'déclare la variable pl (PLage)
Dim msg As String 'déclare la variable mesg (MeSsaGe)
Application.ScreenUpdating = False 'masque les changements à l'écran
'boucle sur toutes les celullules éditées cel de la colonne A
For Each cel In Range("A1:A" & Cells(Application.Rows.Count, 1).End(xlUp).Row)
If cel.Value > 1000 Then 'condition 1 : si la valeur de la cellule est supérieure à 1000
Select Case cel.Value Mod 1000 'action en fonction du reste de la division de la valeur de la cellule par 1000 (Multiple de 1000 ou pas)
Case 0 'pour les multiple de 1000
col = (cel.Value \ 1000) + 1 'définit la colonne
li = 1000 'définit la ligne
Case Else 'pur les non multiples de 1000
col = (cel.Value \ 1000) + 2 'définit la colonne
li = cel.Value - (1000 * (col - 2)) 'définit la ligne
End Select 'fin de l'action en fonction...
Else 'sinon (condition 1)
col = 2 'définit la colonne
li = cel.Value 'définit la ligne
End If 'fin de la condition
If cel = "" Or IsNumeric(cel.Value) = False Then GoTo suite 'si la cellule est vide oou si elle ne contient pas de valeur numérique, va à l étiquette "suite"
Set dest = Cells(li, col) 'définit la cellule de destination
If dest.Value = "" Then 'condition 2 : si la cellule dest est vide
cel.Copy dest 'copie la valeur de la cellule
Else 'sinon
dest.Interior.ColorIndex = 3 'colore l'interior de dest en rouge pour signaler un doublon
End If 'fin de la condition 2
suite: 'étiquette
Next cel 'prochaine cellule cel de la boucle
col = ActiveSheet.UsedRange.Columns.Count 'définit la dernière colonne utilisée
'définit la plage pl
Set pl = Application.Union(Range(Cells(1, 2), Cells(1000, col - 1)), Range(Cells(1, col), Cells(Application.Rows.Count, col).End(xlUp)))
For Each cel In pl 'boucle sur toutes les cellules de la plage pl
If cel.Value = "" Then 'condition 1 : si la cellule est vide
If cel.Column = 2 Then 'condition 2 : si la colonne de la cellule est la seconde (B)
msg = msg & Chr(13) & cel.Row 'définit le message
Else 'sinon
msg = msg & Chr(13) & (cel.Column - 1) * 1000 + cel.Row 'définit la message
End If 'fin de la condition 2
End If 'fin de la condition 1
Next cel 'prochaine cellule de la boucle
MsgBox "Numéros manquants :" & Chr(13) & msg 'affiche les numéros manquants
Application.ScreenUpdating = True 'affiche les changements à l'écran
End Sub