VBA: comparaison avec ancienne valeur

Résolu/Fermé
Medestrac - 23 août 2022 à 13:03
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 - 23 août 2022 à 16:39

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?

2 réponses

yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
23 août 2022 à 13:25

bonjour,

pourquoi ne pas mémoriser en permanence toutes les "anciennes" valeurs?

0

Je ne suis pas sur de comprendre.

L'idée serait de faire:

worksheet_SelectionChange => AnciennesValeurs = range("A1:C30") pour mémoriser toute la plage

worksheet_change => NouvellesValeurs = range("A1:C30") pour avoir les nouvelles valeurs

et ensuite de comparer toutes les valeurs des 2 tableaux?

0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
23 août 2022 à 16:39

worbook_open => mémoriser les valeurs de la plage dans un tableau.

worksheet_change => pour chaque cellule changée, faire le contrôle et mémoriser la nouvelle valeur

0