Recherche ou modification d'un code VBA

Bonjour à tous

Ci-joint un code qui permet de m'indiquer dans la cellule A1 la dernière modification effectué dans la plage A2:Z100 de textes ou de chiffres. Par contre ce que j'aimerais aussi qu'il prenne en compte les ajouts de ligne, de colonnes, ou suppression de ligne, de colonnes, changement de couleur dans du texte ni les couleurs dans les cellule etc…

Y a-t-il moyen de modifier ce code pour obtenir le maximun de ces fonctions.

Voir fichier joint pour + de compréhension

Merci

Option Explicit

Const celv = "A2:Z100"

Const celd = "A1"

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range(celv)) Is Nothing Then

If Target.Value <> "" Then Range(celd).Value = Now

End If

End Sub

Slts

Bonjour,

Il te suffit de juste vérifier la zone et du moment que la procédure événementielle est appelé, c'est qu'il y a eu changement car même pour formater du texte dans une cellule il faut l'éditer :

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim T

    'seulement de A2 à Z100
    If Target.Row < 2 Then Exit Sub
    If Target.Row > 100 Then Exit Sub
    If Target.Column > 26 Then Exit Sub

    Application.EnableEvents = False

    Range("A1").Value = Now

    Application.EnableEvents = True

End Sub

Maintenant, si tu veux savoir qu'elle modification a eu lieu ça va être coton car il y a trop de possibilités !

Déjà, il n'existe pas de procédure événementielle pour détecter la mise en couleur du fond ou de toute la fonte d'une ou plusieurs cellules

Bonjour Theze

Merci d'avoir pris de ton temps pour voir mon fichier

Un p'tit retour après quelque essais du code VBA que tu m'as proposé, une bonne nouvelle c'est que je n'ai plus de défaut d'erreur d'exécution 13 lors d'une insertion ou suppression ligne ou colonne, ouffff!

Ensuite une bonne nouvelle aussi .... lors d'une insertion ou suppression ligne, colonne, l'heure en A1 est bien modifier yesss!!

Pour les chiffres et lettres c'est toujours OK

Ben!! pour le reste si y pas le choix tant pis

En tout les cas merci de ton aide

Slts

Bonjour,

Ceci doit fonctionner.

Cdlt.

Option Explicit

Const CELV = "A2:Z100"
Const CELD = "A1"

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge > 1 Then Exit Sub
    If Not Intersect(Target, Me.Range(CELV)) Is Nothing Then
        If Not IsEmpty(Target) Then Range(CELD).Value = Now
    End If
End Sub

Bonjour Jean-Eric

Merci à vous aussi d'avoir pris de votre temps pour voir mon fichier

Après quelque essais du code VBA que vous m'avez proposé, je ne bénéficie aucune amélioration vis à vis du code de Theze... je dirais même qu'il est moins avantageux puisque la cellule A1 ne prend pas en compte les insertions ou suppression ligne & colonne comme chez Theze.

En tout les cas merci de votre aide

Slts

Re,

Et avec la ligne 1 inhibée ?

Private Sub Worksheet_Change(ByVal Target As Range)
    'If Target.CountLarge > 1 Then Exit Sub
    If Not Intersect(Target, Me.Range(CELV)) Is Nothing Then
        If Not IsEmpty(Target) Then Range(CELD).Value = Now
    End If
End Sub

Re,

Il y a une possibilité de capter certains changement comme le formatage mais c'est tout de même perfectible !

On va utiliser un dictionnaire qui va contenir un tableau et ce tableau va contenir les formatages à surveiller de la cellule et en utilisant la procédure événementielle "Worksheet_SelectionChange()" on va comparer certaines valeurs a celles contenu dans le tableau et si une a changée, on inscrit la date et l'heure; On pourrait éventuellement assimiler ça à la procédure Exit d'un TextBox car c'est à la sélection de la cellule suivante qu'on va contrôler la précédente.Tout d'abord, il te faut mettre le code dans le module de la feuille concernée ceci fait et afin d'initialiser le dictionnaire, il te faut sélectionner une autre feuille puis revenir à la feuille concernée de façon à exécute la Sub "Worksheet_Activate()" (comme elle de possède pas d'argument, tu peux la lancer comme une Sub normale, curseur dedans puis F5). Ici, 6 formatages sont surveillés mais attention, selon le nombre de cellules ça peut vite devenir "lourdaud" :

'déclarées en tête du module de la feuille
Dim Dico As Object
Dim Tbl(1 To 6)
Dim Cel As Range

'le dictionnaire est initialisé à l'activation de la feuille (peut être mis dans "Workbook_Open()"
Private Sub Worksheet_Activate()

    Set Dico = CreateObject("Scripting.Dictionary")

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Count > 1 Then

        'si une sélection multiple est faite, dans le doute, on part du principe qu'une modif va être faite
        Range("A1").Value = Now
        Exit Sub 'sortie car trop complexe de gérer une plage entière

    End If

    'si une sélection a déjà eue lieu...
    If Not Cel Is Nothing Then

        With Cel

            'si la cellule n'a pas encore été sélectionnée, l'inscrit dans le dico
            If Dico.exists(.Address) = False Then

                'ici les paramètres à surveiller (à adapter)
                Tbl(1) = .Font.Color
                Tbl(2) = .Interior.Color
                Tbl(3) = .Font.Name
                Tbl(4) = .Font.Size
                Tbl(5) = .Font.Italic
                Tbl(6) = .Font.Bold

                'inscription du tableau dans le dico
                Dico(.Address) = Tbl

            Else 'si déjà sélectionnée, effectue le contrôle et inscrit la date le cas échéant

                If Dico(.Address)(1) <> .Font.Color Then Range("A1").Value = Now
                If Dico(.Address)(2) <> .Interior.Color Then Range("A1").Value = Now
                If Dico(.Address)(3) <> .Font.Name Then Range("A1").Value = Now
                If Dico(.Address)(4) <> .Font.Size Then Range("A1").Value = Now
                If Dico(.Address)(5) <> .Font.Italic Then Range("A1").Value = Now
                If Dico(.Address)(6) <> .Font.Bold Then Range("A1").Value = Now

                'puis recharge les nouvelles valeurs dans le tableau puis dans le dico
                Tbl(1) = .Font.Color
                Tbl(2) = .Interior.Color
                Tbl(3) = .Font.Name
                Tbl(4) = .Font.Size
                Tbl(5) = .Font.Italic
                Tbl(6) = .Font.Bold

                Dico(.Address) = Tbl

            End If

        End With

    End If

    'affecte à la variable qui va être controlée à la sélection d'après (on pourrait assimiler ça à l'Exit du TextBox)
    Set Cel = Target

End Sub

A Jean-Eric

Effectivement en inhibant la ligne cela permet la prise en compte dans A1 de la suppression ou insertion d'une ligne ou colonne,

A Theze

Je n'ai pas pu tester le code puisque j’obtiens un erreur voir fichier joint

Slts & merci à vous deux pour votre sollicitude et votre dévouement

Bonjour,

C'est normal, ton classeur ne contient qu'une feuille et la procédure événementielle "Activate()" ne s'exécute pas !

Voici ton classeur avec quelques modifs afin que le dico soit initialisé à l'ouverture du classeur.

J'ai formaté aussi 4 cellules et pour faire le test, d'abord tu les sélectionnes les unes après les autres pour voir si la valeur en A1 change puis tu modifie le formatage d'une sans rentrer en mode édition et tu verra le résultat !

Bonsoir Theze, le forum

Un retour sur les essais que j'ai fais suite à ta nouvelle proposition, du coup en ce qui concerne les formats cellules genre changement de couleur texte, insertion couleur, passage italique en normal, gras dans une cellule tous ça c'est au top maintenant ça fonctionne par contre si s’insère, ou supprime un texte ou un nombre dans une cellule, A1 n'indique plus les changements de la dernière modification, au cas où....... il y aurait une possibilité d'y remedier

Merci par avance

Bonne soirée

Slts

Bonjour,

Oui, mais pour ça il te faut continuer à utiliser le premier code que je t'ai donné car les deux procédures événementielles fonctionnent de façon différente mais peuvent cohabiter dans le même module à savoir, celui de la feuille concernée !

Le premier événement, "Worksheet_Change()", gère la partie édition dans la cellule (changement de valeur, insertion ou suppression de lignes et ou colonnes, etc...) et le second événement, "Worksheet_SelectionChange()", se produit quand tu sélectionnes une cellule ou une plage de cellules et pour voir si une modif à eue lieu, le contrôle s'effectue quand tu sélectionnes une autre cellule donc, contrôle de la cellule précédemment sélectionnée !

Bonjour Theze, le forum

Effectivement avec le premier code en plus..... cela fonctionne merci beaucoup pour ta participation, et de l’obtention du résultat espéré merci aussi à Jean-Eric pour sa contribution.

Je vous souhaites de bonne fêtes ainsi qu'au forum

Slts

Bonjour,

Content de t'avoir aidé et joyeuses fêtes à toi !

Rechercher des sujets similaires à "recherche modification code vba"