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