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 79 80 81 82 83 84 85 86 87 88 89 90 91
| '--- dans la feuille à logger
Option Explicit
Dim sNewRange As String, sOldRange As String
Dim CutCopyDejaActif As Boolean
Dim OldData()
Dim nR As Long, nC As Long, i As Long, j As Long
Private Sub Worksheet_Activate()
'--- pour forcer premier SelectionChange
If ActiveCell.Row > 1 Then
SendKeys "{up}": SendKeys "{down}"
Else
SendKeys "{down}": SendKeys "{up}"
End If
Application.OnKey "{DEL}", "Efface" '--- empêche utilisation touche Delete
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim kR As Long, kC As Long, kRLog As Long
Debug.Print "Change", , Target.Cells(1, 1).Address, Target.Rows.Count, Target.Columns.Count
Debug.Print "Application.CutCopyMode: "; Application.CutCopyMode
kR = Target.Row
kC = Target.Column
With Sheets("Log")
kRLog = .Cells(Rows.Count, 1).End(xlUp).Row '--- dernière ligne + 1
If Application.CutCopyMode = 0 Then
kRLog = kRLog + 1
.Cells(kRLog, 1) = Now()
.Cells(kRLog, 2) = Environ("USERNAME")
.Cells(kRLog, 3) = Cells(kR, kC).Address(False, False)
.Cells(kRLog, 4) = OldData(0, 0) '--- ancienne valeur
.Cells(kRLog, 5) = Cells(kR, kC) '--- nouvelle valeur
ElseIf Application.CutCopyMode = xlCopy Then
For i = 0 To nR - 1
For j = 0 To nC - 1
kRLog = kRLog + 1
.Cells(kRLog, 1) = Now()
.Cells(kRLog, 2) = Environ("USERNAME")
.Cells(kRLog, 3) = Cells(kR + i, kC + j).Address(False, False)
.Cells(kRLog, 4) = OldData(i, j) '--- ancienne valeur
.Cells(kRLog, 5) = Cells(kR + i, kC + j) '--- nouvelle valeur
Next j
Next i
Else
MsgBox "xlCut non géré !", , " Pour info"
End If
End With
End Sub
Private Sub Worksheet_Deactivate()
Application.OnKey "{DEL}" '--- réactive utilisation normale touche Delete
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Debug.Print "SelectionChange", Application.CutCopyMode
sOldRange = sNewRange
sNewRange = Selection.Address
Debug.Print "sOldRange: "; sOldRange, "sNewRange: "; sNewRange
'--- CutCopyMode: 0 = inactif, 1 = XlCopy, 2 = xlCut
If Application.CutCopyMode = xlCopy Then
If CutCopyDejaActif = False Then
'--- CutCopyMode était inactif (0) avant
CutCopyDejaActif = True
'--- taille de la zone copiée
nR = Range(sOldRange).Rows.Count
nC = Range(sOldRange).Columns.Count
End If
'--- met en mémoire les valeurs qui seront écrasées
ReDim OldData(nR, nC)
For i = 0 To nR - 1
For j = 0 To nC - 1
Debug.Print Target.Cells(1, 1).Offset(i, j),
OldData(i, j) = Target.Cells(1, 1).Offset(i, j)
Next j
Debug.Print
Next i
Else
CutCopyDejaActif = False
nR = 1
nC = 1
ReDim OldData(nR, nC)
OldData(0, 0) = Target.Cells(1, 1)
End If
End Sub
'--- dans un module
Public Sub Efface()
MsgBox "Ne pas utliser la touche Delete," & vbCr & _
"utiliser la touche Supprimer."
End Sub |
Partager