XL 2016 Lancement macro sur cellules fusionnées

joel31

XLDnaute Junior
Bonjour le forum,

Je bute depuis hier sur un casse tête que je n'arrive pas à résoudre.
Je souhaite lancer une macro quand je sélectionne une cellule fusionnée (oui je sais, mais je peux difficilement faire autrement !)
J'ai fait le fichier joint pour exemple :
Je clic sur A4, la macro se lance et le résultat est bon.
Je souhaiterais , quand je reviens ensuite sur cette cellule, l'effacer quand elle est renseignée, et c'est là que je n'arrive pas à trouver ma solution.
La macro fonctionne parfaitement avec de simples cellules, mais pas avec mes cellules fusionnées

Celui ci ne fonctionne pas, sauf si on ne tient pas compte de Z, qui renseigne alors la plage souhaitée, mais impossible de l'effacer ensuite !

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim isect, Z$, plage
plage = "A4:A6 ,A9:A11, D4:D6, D9:D11"
If Target.Count = 3 Then
'Z = Target.Value
Set isect = Application.Intersect(Target, Range(plage))
If Not isect Is Nothing Then
Target.Value = IIf(Z = "", "ü", "")
End If
End If
End Sub

Et celui ci fonctionne parfaitement sur des cellules non fusionnées
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim isect, Z$, plage
plage = "B4:B6,B9:B11,E4:E6,E9:E11"
If Target.Count = 1 Then
Z = Target.Value
Set isect = Application.Intersect(Target, Range(plage))
If Not isect Is Nothing Then
Target.Value = IIf(Z = "", "ü", "")
End If
End If
End Sub

Un petit fichier vaut mieux qu'un long discours !
Merci pour votre aide !
Cordialement
 

Pièces jointes

  • Test.xlsm
    16.5 KB · Affichages: 7

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Joel,
Si vous faites "v = Target.Value" avec des cellules fusionnées vous trouvez :
1630156687471.png

C'est à dire que le VBA renvoie un array avec toutes les valeurs de la plage Target.address.
Une solution est :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'Change(ByVal Target As Range)
Dim isect, Z$, plage
plage = "A4:A6,A9:A11,D4:D6,D9:D11"
If Target.Count = 3 Then
'Z = Target.Value
Set isect = Application.Intersect(Target, Range(plage))
If Not isect Is Nothing Then
If Application.Index(Range(Target.Address), 1) = "" Then
    Application.Index(Range(Target.Address), 1) = "ü"
Else
    Application.Index(Range(Target.Address), 1) = ""
End If
End If
End If
End Sub
J'ai décomposé le IIF pour être plus clair.
Voir PJ.
 

Pièces jointes

  • Test (2).xlsm
    16.7 KB · Affichages: 2

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
291 667
Messages
1 916 972
Membres
179 500
dernier inscrit
oximo
Haut Bas