Interdépendance du contenu de 2 cellules, répliquer ce procéder

Signaler
-
yg_be
Messages postés
10326
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 avril 2020
-
Bonjour à la communauté,

Dans le prolongement de la discussion concernant l’interdépendance de deux cellules, résolue par la macro du membre via55, je voudrai aller plus loin, et l'étendre à une ligne

https://www.commentcamarche.net/forum/affich-35836449-interdependance-du-contenu-de-2-cellules

En effet, je souhaiterai que lorsque je modifie la valeur de la cellule A1 d'une de mes feuille, cette valeur soit reflétée dans toutes les feuilles que j'aurai identifié dans la macro

Mais, je voudrai aussi répliquer ce procéder pour les cellules A2, A3, ...An, et aussi B1, B2, B3, Bn

Ex: Si j’écris "Test" dans A1 de ma feuille 1, "Test" sera inscrit en A1 de ma feuille 2 et vis versa
Ensuite si j'écris "Test2" en A2 de ma feuille 1, "Test2" sera inscrit en A2 de ma feuille 2, mais je garderai la valeur "Test" dans les cellules A1 de mes deux feuilles

J'ai essayé de me former en macro via internet, mais cela a ses limites, et je ne trouve pas la solution, car quand j'augmente le range de cellules cibles, TOUTES les cellules deviennent interdépendantes (A1, A2, A3, An - sur toutes les feuilles).
J'aimerai donc "isoler" chaque interdépendance (les An avec les An, les Bn avec les Bn)

Voici la macro de Via55 sur laquelle je suis parti

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("A1")) Is Nothing Then
If Sheets("Feuil2").Range("A1").Value = Target.Value Then Exit Sub
Sheets("Feuil2").Range("A1") = Target.Value
End If
End Sub

Si je ne suis pas clair, n'hésitez pas à me le dire :)

Merci beaucoup par avance pour votre aide

Configuration: Windows / Chrome 80.0.3987.132

5 réponses

Messages postés
10326
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 avril 2020
582
bonjour,
merci d'utiliser les balises de code quand tu partages du code:https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
je ne vois pas pourquoi tu fais le second test, il me semble inutile.

quand tu écris "une de mes feuille", veux tu dire "n'importe quelle feuille", ou "une feuille déterminée"?

peut-être ainsi:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
    If Target.Column <= 2 Then 'si colonne 1 ou 2
        Sheets("deux").Range(Target.AddressLocal) = Target
    End If
End If
End Sub

Bonjour yg_be

Merci pour ta réponse

Ok pour les balises, je ferrai attention les prochaines fois

La macro que j'ai partagé est celle proposée dans un poste précédent par un contributeur. Je ne connais pas assez les macro pour juger de l'utilité ou non de la ligne :)

Pour répondre à ta question:
"quand tu écris "une de mes feuille", veux tu dire "n'importe quelle feuille", ou "une feuille déterminée"?"

Dans mon classeur de feuille, j'aimerai effectivement appliquer la macro à certaines feuilles que j'aurai sélectionner. Donc pas TOUTES les feuilles du classeur, mais celles dont j'aurai besoin (5 feuilles en l'occurrence)

Je ne veux pas abuser, mais l'ideal, ce serait que, si tu me proposes une macro, tu puisses m'expliquer (un peu) comment elle fonctionne, afin que je puisse changer les feuilles "cibles"( celles pour lesquelles la macro s'applique), les cellules "cibles" (celles qui sont concernées par l'interdépendance), ... Le but étant que je puisse un jour être autonome (c'est la raison pour laquelle je ne fourni pas de fichier avec mon post, j'aimerai pouvoir me débrouiller à l'intégrer tout seul)

Merci encore pour le temps que tu consacres à m'aider, n'hésite pas à me dire si tu as besoin de plus de précisions
yg_be
Messages postés
10326
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 avril 2020
582
le code que j'ai suggéré est très court.
le code doit être présent dans les feuilles sources
le commentaire indique que le code ne travaille que si la cellule source est dans la colonne 1 ou 2
je n'ai pas mis de commentaire, et il me semble simple de comprendre que la feuille destination est la feuille dont le nom est "deux"

Bonjour

Merci pour ta réponse

Cela fonctionne, sauf que quand je rentre une valeur dans les cellules (A1 par exemple), le debugger s'ouvre en me surlignant la ligne de code en gras ci dessous

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
    If Target.Column <= 2 Then 'si colonne 1 ou 2
<gras>        Sheets("deux").Range(Target.AddressLocal) = Target
</gras>    End If
End If
End Sub


Aussi afin de rajouter une feuille qui sera également interdépendante avec les autres = qui modifiera les autres si je rentre une valeur dans les cellules sélectionnées, j'ai fait ceci (ex de la feuille 1), mais les changements de le feuille 3 affectent les deux premières feuilles, mais pas l'inverse. J'ai rentré le même code dans les 3 feuilles, en changeant le noms des feuilles

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
    If Target.Column <= 2 Then 'si colonne 1 ou 2
Sheets("deux").Range(Target.AddressLocal) = Target
 If Target.Column <= 2 Then 'si colonne 1 ou 2
Sheets("trois").Range(Target.AddressLocal) = Target
End If
End If
End If
End Sub


Et afin de pouvoir customiser comme je le souhaite mes données, pourrai tu s'il te plait me dire comment je sélectionne une plage de données qui sera affectée par le code. Si par exemple demain je veux que ce code ne s'applique que pour la plage (B11:B100) et (C11:C100)?
J'as pas mal cherché sur le net comment identifier un range de cellules, mais mes tests ne fonctionnent pas..

J'espère être clair, encore merci pour ton aide
yg_be
Messages postés
10326
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 avril 2020
582
1) "Cela fonctionne, sauf": dans quel cas cela fonctionne-t'il? quelle erreur donne le débogueur?

2) "les changements de le feuille 3 affectent les deux premières feuilles, mais pas l'inverse": sans doute une erreur dans les noms des feuilles.
le code suivant est préférable au tien:
If Target.Count = 1 Then
    If Target.Column <= 2 Then 'si colonne 1 ou 2
        Sheets("deux").Range(Target.AddressLocal) = Target
        Sheets("trois").Range(Target.AddressLocal) = Target
    End If
End If


3) pour que le code ne s'applique qu'à (B11:B100) et (C11:C100):
If Not Intersect(Target, Union(Range("B11:B100"), Range("C11:C100"))) Is Nothing Then

ou
If Not Intersect(Target, Range("B11:C100")) Is Nothing Then

Merci,
le message d'erreur du debug est : "Method 'Range' of object_Worksheet' failed
Puis il surligne en jaune, dans le code de la première feuille :
Sheets("deux").Range(Target.AddressLocal) = Target

Voici le code que j'ai rentré dans les 3 feuilles (en changeant le nom des feuilles à chaque fois)
Private [/contents/446-fichier-sub Sub] Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Union(Range("B11:B100"), Range("C11:C100"))) Is Nothing Then
Sheets("deux").Range(Target.AddressLocal) = Target
Sheets("trois").Range(Target.AddressLocal) = Target
End If
End Sub


La feuille 3 n'est pas impactée par les modifications des feuilles 1 & 2, en revanche, les valeur que je rentre dedans impactent les feuilles 1 & 2. Il n'y a pas d'erreur de nom de feuille, j'ai essayé avec une quatrième feuille, puis une cinquième (avec une ligne de plus dans le code pour relier la nouvelle feuille aux autres), et même souci. Les feuilles 1 & 2 s'alimentent, et dès qu'il y a une 3eme feuille ou plus, la dépendance ne se fait plus que dans un sens
Pour info, le code de la feuille 3 est donc
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Union(Range("B11:B100"), Range("C11:C100"))) Is Nothing Then
Sheets("deux").Range(Target.AddressLocal) = Target
Sheets("un").Range(Target.AddressLocal) = Target
End If
End Sub


Merci encore!
yg_be
Messages postés
10326
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 avril 2020
582
1) cela fonctionne parfois, et parfois tu as l'erreur Method 'Range' of object_Worksheet: dans quel cas as-tu l'erreur, dans quel cas cela fonctionne-t'il.
2 je vois que tu as supprimé
If Target.Count = 1
Then. pourquoi?
3) peux-tu partager ton fichier?
Messages postés
10326
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
5 avril 2020
582
je propose ceci:
Option Explicit
Const destination As String = "deux,trois"
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cellule  As Range, fdest
    If Not Intersect(Target, Union(Range("B11:B100"), Range("C11:C100"))) Is Nothing Then
        For Each cellule In Intersect(Target, Union(Range("B11:B100"), Range("C11:C100")))
            For Each fdest In Split(destination, ",")
                If Sheets(fdest).Range(cellule.AddressLocal).Value <> cellule.Value Then
                    Sheets(fdest).Range(cellule.AddressLocal) = cellule
                End If
            Next fdest
        Next cellule
    End If
End Sub