Restaurer l'ancienne valeur d'une cellule si son format ne correspond pas

Bonjour à tous,

Je travaille actuellement sur la création d'un fichier permettant le suivi des opérations de mon entreprise.

J'utilise un tableur Excel comme support mais je n'ai pas le choix de passer par du VBA pour certaines tâches.

4classeur1.xlsm (638.35 Ko)

Je souhaiterai écrire une macro qui pour chaque cellule modifiée dans une plage de cellule donnée, vérifie que le format de la nouvelle valeur soit nulle ou du type (jj/mm/aaaa) et si la valeur est différente de l'ancienne.

Le but de la macro étant que:

  • si la valeur est la même que l'ancienne, on ne change rien
  • si la valeur n'est pas du bon format, on restaure l'ancienne valeur
  • si la valeur est au bon format et différente de l'ancienne, on conserve cette nouvelle valeur.

Pour cela j'enregistre ma plage de cellule dans un tableau dynamique "tab_date" à l'ouverture du classeur:

Private Sub Workbook_Open()

    ActiveWorkbook.Worksheets(Worksheets.Count).Activate 'affiche la dernière page du classeur

    derniere_ligne = ActiveSheet.Range("B65000").End(xlUp).Row
    If derniere_ligne > 2 Then

        remplissage_tab_date

    End If

End Sub

Je déclare mes variables et rempli le tab_date à l'aide d'un module car je souhaite les utiliser pour n'importe quelle page du classeur

Public L As Byte                    'variable associée à la ligne de la cellule sélectionnée
Public C As Byte                    'variable associée à la colonne de la cellule sélectionnée
Public olddata As String            'variable enregistrant la valeur de la dernière cellule selectionnée.
Public newdata As String            'variable enregistratn la nouvelle valeur de la dernière cellule sélectionnée
Public typ As String                'variable enregistrant le type de la demande de mesure lors de l'actualisation de l'état de la mesure,
Public tab_date()                   'tableau dynamique comprenant les valeurs de la page affichée.
Public Ltab As Byte                 'variable servant à remplir le tableau dynamique tab_date
Public Ctab As Byte                 'variable servant à remplir le tableau dynamique tab_date
Public derniere_ligne As Byte       'variable associé au numéro de la dernière ligne renseignée

Sub remplissage_tab_date()

    ReDim tab_date(derniere_ligne - 3, 11)

    For Ltab = 0 To UBound(tab_date, 1)
        For Ctab = 0 To 11
            tab_date(Ltab, Ctab) = ActiveSheet.Cells(Ltab + 3, Ctab + 2)
        Next
    Next

End Sub

J'ai ensuite utilisé l'événement "Workbook_SheetChange" pour lancé le test lors d'un changement dans une cellule mais le résultat n'est pas là.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    newdata = Target.Value
    L = Target.Row
    C = Target.Column

    If newdata = tab_date(L - 3, C - 2) Then 'on vérifie si le contenu de la cellule a changé par rapport à l'instant t-1

    Else
        'si il a changé on s'assure que la nouvelle valeur soit au format "jj/mm/aaaa".

        If Len(newdata) > 10 Or Mid(newdata, 3, 1) <> "/" Or Mid(newdata, 6, 1) <> "/" Then

            Cells(L, C) = tab_date(L - 3, C - 2) 'On restaure l'ancienne valeur si le format de la nouvelle valeur n'est pas de la forme "jj/mm/aaaa"
            Exit Sub
        Else
            tab_date(L - 3, C - 2) = newdata
        End If
    End If

End Sub

J'ai l'impression que la variable n'est pas associé à la cellule qui vient d'être modifiée mais plutôt à la cellule que l'on sélectionne en quittant celle que l'on vient de modifier.

De plus lorsque l'on restaure l'ancienne valeur, la procédure se lance à nouveau car la cellule a changé.

Je vous remercie d'avance pour les pistes que vous pouvez me fournir.

Cordialement,

Jean-Baptiste

Bonjour,

Un formulaire de saisie n'était pas mieux ? au moins il était plus facile de vérifier le contenu et format de chaque "textbox"

avant validation réelle dans la feuille.

Bonjour Xmenpl,

C'est vrai que la vérification serait surement plus simple, surtout que je comptais passer par un Userform pour saisir correctement les premières infos. Du coup je pense que je vais faire en sorte qu'un userform s'ouvre pour les premières infos, et un deuxième quand il s'agira de compléter ou modifier une ligne déjà existante.

Bon bah du coup j'y retourne...

Merci,

Rechercher des sujets similaires à "restaurer ancienne valeur format correspond pas"