1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
Private Sub Worksheet_Change(ByVal Target As Range)
Dim PlageCellules, Rng As Range
Dim Nbr, RgIndex, x, y, RngRow, RngCol As Integer
Dim FeuilleCible As Worksheet
Dim ColIndex As Range
x = Target.Row 'pour récupérer l'index présent sur cette ligne
y = Target.Column ' pour identifier la colonne sur laquelle contrôler les doublons
Set FeuilleCible = ThisWorkbook.Worksheets("Gestion") ' pour définir le nom de la feuille de travail en 1 seule fois (faciliter la copie du code dans d'autres feuilles)
Set Rng = FeuilleCible.Range("A:FA").Find(What:="Index")
RngCol = Rng.Column
RngRow = Rng.Row
' Cacher le travail d'Excel pour ne pas gêner l'utilisateur :
Application.ScreenUpdating = False
'Supprimer la protection de la feuille MAJ
Sheets("MAJ").Select
ActiveSheet.Unprotect "nath"
' 1 // Sur la partie gauche, suivre les mises à jour en passant les cellules modifiées en surbrillance
' et en les listant dans la feuille MAJ
' La variable PlageCellules contient les cellules dont les modifications seront suivies (La cellule qui contient "Index" sert de référence)
Set PlageCellules = FeuilleCible.Range(Cells(RngRow + 1, 1), Cells(RngRow + 10, RngCol))
If Not Application.Intersect(Target, PlageCellules) Is Nothing Then
' Si l'une de ces cellules a été modifiée, alors
Target.Interior.Color = RGB(255, 255, 0) 'passer la cellule concernée en jaune
'Récupérer le nombre de ligne existant sur la feuille MAJ pour écrire dessous
Nbr = Sheets("MAJ").Range("G1").Value + 1 'le nombre de lignes est stocké en G1 de la feuille MAJ (écriture non visible)
'Alimenter la première ligne vide trouvée avec les différents éléments dans le tableau de la feuille MAJ :
Sheets("MAJ").Range("A" & Nbr) = Now '.........................................Date de modification
Sheets("MAJ").Range("B" & Nbr) = Environ("username") '.........................Utilisateur qui a apporté la modification
Sheets("MAJ").Range("C" & Nbr) = Target.Worksheet.Name '.......................Matrice concernée
Sheets("MAJ").Range("D" & Nbr) = Target.Address(False, False, , False, "A1") '.Cellule modifiée
'Sheets("MAJ").Range("E" & Nbr) = FeuilleCible.Range("I" & x) '.......Index correspondant / cette commande fonctionne mais je veux identifier la colonne "I" via la variable RngCol
Sheets("MAJ").Range("E" & Nbr) = FeuilleCible.Range(Cells(x, RngCol)).Value '.......Index correspondant / Cette commande ne fonctionne pas : "méthode range de l'objet worksheet a échoué"
Sheets("MAJ").Range("F" & Nbr) = Target.Value '................................Nouveau contenu de la cellule
End If
'Rétablir la protection de la feuille MAJ
Sheets("MAJ").Select
ActiveSheet.Protect "nath", DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
AllowUsingPivotTables:=True
'Se repositionner sur la feuille d'origine (pour que ce soit transparent pour l'utilisateur)
FeuilleCible.Select
'2 // Signaler et gérer les doublons à la saisie des numéros dans les colonnes de la matrice
'S'il existe un doublon dans la colonne active des lignes 8 à 1000 / ne se cantonne pas à la colonne active mais à toute la plage = KO
If y > RngCol And x > RngRow Then
If Application.WorksheetFunction.CountIf(Range(Cells(RngRow + 1, y), Cells(1000, y)), Target) > 1 Then
'alors signaler le doublon et proposer d'annuler la saisie :
If MsgBox("Attention... ce numéro a déjà été utilisé." & Chr(10) & "Voulez-vous l'effacer ?", vbYesNo + vbExclamation, "Doublon") = vbYes Then
Target.Value = "" ' si OUI annuler la saisie
Target.Cells.Select ' et se repositionner sur la cellule saisie pour que l'utilisateur entre directement un nouveau numéro
Else ' Sinon :
Target.Interior.Color = RGB(248, 187, 208) ' colorer la cellule en rose
Target.Font.Color = vbRed ' colorer le texte en rouge
Target.Cells.Select
End If
End If
End If
'Remontrer le travail d'Excel
Application.ScreenUpdating = True
End Sub |
Partager