Fichier ecrit si modification de la saisie, alors écrire en rouge

anthoYS

XLDnaute Barbatruc
Bonjour,

J'ai un fichier ou j'ai saisi des données. Je souhaite que l'utilisateur auquel je vais envoyer le fichier, apporte des modifications, et si c'est le cas, qu'elles apparaissent en rouge, exemple si en C1 j'ai saisi "Kuy", et que l'utilisateur, écrit "Kyu", ce "Kyu" devra apparaître en rouge, lorsqu'il enregistrera ou avant, et qu'il me l'enverra par mail.

Biensur, je lui dirai d'accepter d'ouvrir le contenu si cela necessite une macro.

Par contre, autre détail, si dans une cellule j'ai écrit : "20H30 / 18h40" et que quand il me renvoie le fichier, je lis "20H30 / 18h50", c'est uniquement la partie modifié qui devra apparaître en rouge, soit le mot ou groupe de lettre dont une partie aura été modifié.


Soit :

Code:
20H30 / [COLOR="Red"]18h50[/COLOR]

Merci par avance.
 

Pièces jointes

  • deu.xls
    17 KB · Affichages: 59
Dernière édition:

mécano41

XLDnaute Accro
Re : Fichier ecrit si modification de la saisie, alors écrire en rouge

Bonjour,

Pour que cela fonctionne, il faut utiliser le même nom de variable pour désigner une même cellule-cible (celle qui est double-cliquée) dans les différentes lignes de la procédure. Il faut utiliser ou Target, ou Cible, mais pas les deux.

Question subsidiaire : est-ce que tu mets en tête de module, la ligne d'instruction : Option explicit ? Cela t'oblige à déclarer toutes tes variables et en cas d'oubli cela t'indique que la variable n'a pas été déclarée..(ici cela l'indiquerait pour Cible).

Cordialement
 
Dernière édition:

mécano41

XLDnaute Accro
Re : Fichier ecrit si modification de la saisie, alors écrire en rouge

Seules certaines instructions peuvent être l'extérieur d'un Sub ... End sub.
Les Dim par ex. lorsque l'on souhaite faire références aux variables correspondantes depuis plusieurs procédures d'un même module ou les Public pour y faire référence depuis d'autres modules

L'instruction Set PlageAdefinir =... doit être écrite à l'intérieur d'un Sub ... End sub

Cordialement
 

anthoYS

XLDnaute Barbatruc
Re : Fichier ecrit si modification de la saisie, alors écrire en rouge

Re,

Merci mécano41.

Ou est le problème ?





Est-ce une Sub()?

Code:
Private Sub Inter()
If Not Intersect(Cible, Range(plage_dyn)) Is Nothing Then
    ' Mise en tableau des mots de la cellule avant modif
    i = 0
    For Cpt = 1 To Len(MemChange) + 1
        Car = Mid(MemChange, Cpt, 1)
        If Car <> " " And Cpt <> Len(MemChange) + 1 Then
            Mot = Mot + Car
        Else
            i = i + 1
            ReDim Preserve MotsAvant(1 To i)
            MotsAvant(i) = Mot
            Mot = ""
        End If
    Next Cpt
    ' Mise en tableau des mots de la cellule après modif
    i = 0
    For Cpt = 1 To Len(Cible) + 1
        Car = Mid(Cible, Cpt, 1)
        If Car <> " " And Cpt <> Len(Cible) + 1 Then
            Mot = Mot + Car
        Else
            i = i + 1
            ReDim Preserve MotsApres(1 To i)
            MotsApres(i) = Mot
            Mot = ""
        End If
    Next Cpt
    ' Traitement
    If UBound(MotsAvant) <> UBound(MotsApres) Then                                          ' Si Nb. mots différent, on colorie le fond de cellule
        Cible.Interior.ColorIndex = 3
    Else                                                                                                              ' Sinon si Nb. de mots identique
        For i = 1 To UBound(MotsAvant)                                                                  ' Pour tous les mots on vérifie si le
            If MotsApres(i) <> MotsAvant(i) Then                                                        ' mot après est différent du mot avant
                If i = 1 Then                                                                                        ' Si c'est le premier mot
                    Lng = Len(MotsApres(1))                                                                 ' Longueur = long. 1er mot (à colorier)
                    Dep = 0                                                                                          ' Départ = au 1er caractère
                Else                                                                                                   ' Pour le deuxième mot et les suivants
                    Lng = Len(MotsApres(i))                                                                  ' Longueur = long. du mot à colorier
                    Dep = 0                                                                                          ' RAZ décalage du départ
                    For j = i - 1 To 1 Step -1
                        Dep = Dep + Len(MotsApres(j)) + 1                                               ' Décalage du départ = Somme des "longueur + 1 espace" de tous les mots précédents
                    Next j
                Dep = Dep + 1                                                                                     ' Départ = position suivante
                End If
                Cible.Characters(Start:=Dep, Length:=Lng).Font.ColorIndex = 3              ' On colorie la partie modifiée suivant valeurs calculées ci-dessus
            End If
        Next i
    End If
End If
End Sub

merci encore
 
Dernière édition:

mécano41

XLDnaute Accro
Re : Fichier ecrit si modification de la saisie, alors écrire en rouge

Bonjour,

Je pense que c'est dû à la double déclaration de i. tu as l'écrite une fois dans : Dim i as Long et une autre fois dans : Dim c as Long, i as Long (mais habituellement le message indiqué est : variable déjà déclarée...).

Pourquoi fais-tu toutes les déclarations en tête de module de feuille? Il vaudrait mieux ne déclarer là que ce qui a besoin d'être accessible de puis plusieurs procédures (Sub ou Function). Regarde dans mon fichier, j'ai seulement mis Dim MemChange As Variant en tête de module de feuille parce que je l'utilise depuis Private Sub Worksheet_SelectionChange(ByVal Cible As Range) et depuis Private Sub Worksheet_Change(ByVal Cible As Range).

Ensuite, pour :

Code:
Private Sub Inter()
If Not Intersect(Cible, Range(plage_dyn)) Is Nothing Then

Il me semble que "plage_dyn" devrait plutôt être "PlageAdefinir" car plage_dyn semble n'être qu'une seule cellule (départ) ; ensuite, la définition de cette plage, que tu as faite dans Private Sub Dplagedyn() devrait se faire dans Private Sub Inter() car Private Sub Dplagedyn() ne va pas se lancer tout seul...Si une procédure n'est pas événementielle, il faut qu'elle soit lancée par quelque chose ... (un bouton, une autre procédure...)


Cordialement
 

syriak

XLDnaute Nouveau
Bonjour mécano41,
Je me permet de me rajouter dans la conversation,
merci à toi pour le code il marche très bien, néanmoins je ne peux plus ajouter de ligne, cela me met le message suivant
1651158137933.png


As-tu une explication?
encore merci
Cdlt
 

Discussions similaires

Statistiques des forums

Discussions
312 397
Messages
2 088 057
Membres
103 709
dernier inscrit
FrrankX