Des cellules liées... dans les deux sens
(avec ou sans macro)
Une très grande page de calcul, dans laquelle vous devez saisir des paramètres.
Vous voulez donner le choix à l'utilisateur de saisir ses paramètres indifféremment à plusieurs endroits, par exemple en début de fichier dans un tableau regroupant tous les paramètres (hypothèses) ou au milieu des calculs à l'endroit où le paramètre est utilisé.
Facile de lier une cellule à une autre, il suffit d'écrire =B1 dans la cellule A1 pour que les modifications de B1 se répercutent sur A1.
Mais comment faire pour que les cellules soient liées dans les deux sens : pour que, non seulement les modifications de B1 se répercutent sur A1, mais encore les modifications de A1 se répercutent sur B1.
Pas question de formule qui serait écrasée par la saisie.
Première solution sans macro
Utiliser des zones de texte toutes liées à une même cellule :
Chaque fois que la valeur de la cellule est modifiée, celle des zones de texte l'est aussi. Chaque fois que le contenu d'une des zones de texte est modifié, la valeur de la cellule et celle des autres zones de texte suit...
Tout l'ensemble "cellule + zones de texte" est donc completement lié.
En pratique, pour créer une zone de texte liée à la cellule B5,
- Affichage / barre d'outils / Visual Basic
- cliquer sur "boîte à outils"
- cliquer sur "zone de texte" et placer le curseur à l'endroit souhaité
- pour lier la zone de texte, double-cliquer sur la zone de texte pour accéder à ses propriétés, et indiquer B5 dans LinkedCell
- revenir sur Excel, désactiver le mode création, c'est terminé.
- pour ajouter d'autres zones de texte liées à la même cellule, il suffit de recopier la première autant de fois que souhaité.
La technique marche très bien, mais présente l'inconvénient d'allourdir la présentation du fichier par les zones de texte, et d'imposer la récupération des données saisies sur la cellule (difficile de récupérer la valeur de la zone de texte).
Deuxième solution avec VBA
La méthode par macro donne un résultat beaucoup plus élégant : les cellules sont complétement liées. Le changement de l'une se répercute immédiatement sur les autres (recopie des valeurs saisies, pas des formules).
Le principe est simple, on utilise des cellules nommées. C'est le nom qui permet de les regrouper entre elles. Dans l'exemple proposé, la macro fait en sorte que toutes les cellules dont le nom est truc?1, truc?2, truc?3... soient liées.
Si on nomme la cellule A1 zaza?1 et la cellule A4 zaza?2, les deux cellules prendront toujours la même valeur.
A chaque modification d'une cellule de la page Excel (événement Worksheet_Change), la macro va chercher si la cellule est nommée et si le nom comporte un point d'interrogation. Si c'est le cas, elle va rechercher toutes les cellules de la famille pour leur affecter la nouvelle valeur :
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
On Error GoTo fin
nom = Target.Name.Name
If InStr(nom, "?") > 0 Then
nom = Left(nom, InStr(nom, "?"))
Application.EnableEvents = False
num = 1
encor:
Range(nom & num).Value = Target.Value
num = num + 1
GoTo encor
End If
fin:
On Error GoTo 0
Application.EnableEvents = True
End Sub
Une autre solution avec VBA (proposée par AV)
Toutes les cellules devant être liées sont nommées collectivement, par exemple "zaza".
En cas de modification d'une des cellules de la zone, toutes les autres sont modifiées par la macro.
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("zaza")) Is Nothing Then Exit Sub
[zaza].Value = Target
End Sub
Cliquez ici pour télécharger le fichier exemple (.xls zippé)
(exemples avec zones de texte et avec macros)