VBA: comparaison avec ancienne valeur
Résoluyg_be Messages postés 24281 Statut Contributeur -
Bonjour,
J'ai un tableau dans lequel l'utilisateur peut librement saisir des données. Chaque saisie entraine un traitement de contrôle.
De plus je tiens à la mise en forme de mon tableau. J'ai donc protégé la feuille en déprotégeant ces cellules: l'utilisateur peut modifier la valeur, mais pas la mise en forme.
Avec worksheet_SelectionChange j'enregistre la cellule ou la plage dans une variable globale AncienneValeur
Avec Worksheet_Change je contrôle la valeur vs AncienneValeur et je garde la plus grande des deux.
Tout ça marche bien tant que l'utilisateur ne fait pas de copier/coller: car alors la plage collée ne fait pas la même dimension que AncienneValeur, et la comparaison ne peut se faire.
De plus le copier/coller modifie la mise en forme.
Pour traiter ce cas de figure j'ai fait le contrôle suivant:
If Application.CommandBars("Standard").FindControl(ID:=128).ListCount > 0 Then
With Application.CommandBars("Standard")
I = .FindControl(ID:=128).Index
C = .Controls(I).List(1)
End With
If C = "Coller" Then AnnulerColler
End If
Sub AnnulerColler()
Dim Presse_Papier As String
'on annule le coller
With Application
.EnableEvents = False
.Undo
.EnableEvents = True
End With
On Error GoTo 0
'on récupère le contenu du presse-papier
Presse_Papier = GetPressPapier
longueur = Len(Presse_Papier)
retourligne = 0
colonne = 0
For j = 1 To longueur
Debug.Print Mid(Presse_Papier, j, 1) & " " & Asc(Mid(Presse_Papier, j, 1))
If Asc(Mid(Presse_Papier, j, 1)) = 13 Then retourligne = retourligne + 1
If Asc(Mid(Presse_Papier, j, 1)) = 9 Then colonne = colonne + 1
Next
colonne = colonne / retourligne + 1
If retourligne > 1 Or colonne > 1 Then
AncienneValeur = Range(ActiveCell, ActiveCell.Offset(retourligne - 1, colonne - 1))
End If
With Application
.EnableEvents = False
ActiveCell.PasteSpecial Paste:=xlPasteValues
.EnableEvents = True
End With
End Sub
Function GetPressPapier() As String
With New DataObject
.GetFromClipboard
GetPressPapier = .GetText(1)
End With
End Function
Ce qui marche plutôt bien...jusqu'à ce que l'utilisateur fasse un couper/coller...et là c'est le drame car je ne peux plus faire de PasteSpecial...
Comment puis-je faire pour comparer chaque cellule avec son ancienne valeur, y compris dans le cas d'un copier/couper/coller?
- VBA: comparaison avec ancienne valeur
- Excel compter cellule couleur sans vba - Guide
- Dépassement de capacité vba ✓ - Forum Excel
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Vba range avec variable ✓ - Forum VB / VBA