VBA - Tester/Modifier plage de cellules fusionnées ou non
Suite à une question posée sur le forum.
La question était Macro pour verrouiller des cellules non vide Fusionnée
Constatant que les fonctions Excel...
Sheets("Feuil1").Range("A1:AF650").Locked = True
Sheets("Feuil1").Range("A1:AF650").SpecialCells(xlCellTypeBlanks).Locked = False
n'ont aucun effet sur les cellules fusionnées.
Deux solutions pour contourner ce petit problème.
En testant par lignes et colonnes
Sub LigneAvecMerge()
Dim Lig As Long
Dim Col As Integer
Dim ColDeb As Integer, ColFin As Integer
Dim Mg As String, TB
'pour l'exemple, les colonnes à tester de 2 à 8
ColDeb = 2: ColFin = 8
With Sheets("Feuil1")
.Unprotect 'éventuellement MotPasse
For Col = ColDeb To ColFin
For Lig = 1 To Cells(Rows.Count, Col).End(xlUp).Row
Mg = .Cells(Lig, Col).MergeArea.Address
TB = Split(Mg, ":")
If .Range(TB(0)).Value <> "" Then
.Range(Mg).Locked = True
Else
.Range(Mg).Locked = False
End If
Next Lig
Next Col
.Protect 'éventuellement MotPasse
End With
End Sub
Ou avec une plage définie
Sub PlageAvecMerge()
Dim Cel As Range
Dim Plage As Range
Dim Mg As String, TB
With Sheets("Feuil1")
Set Plage = .Range("B2:F20") 'pour l'exemple
.Unprotect 'éventuellement MotPasse
For Each Cel In Plage
Mg = Cel.MergeArea.Address
TB = Split(Mg, ":")
If .Range(TB(0)).Value <> "" Then
.Range(Mg).Locked = True
Else
.Range(Mg).Locked = False
End If
Next Cel
.Protect 'éventuellement MotPasse
End With
End Sub
Les deux solutions fonctionne aussi bien pour les cellules simple que pour les cellules fusionnées.
Les exemples verrouilles les cellules non vide et déverrouille les cellules vides.
Ce code peu facilement être adapter pour d'autre emploi, par exemple : vous voulez voir si la colonne "D" contient "Je suis" et que certaine ligne sont fusionnées "B+C+D+E" .. le résultat en colonne D sera OUI, bien entendu si la fusion contient "Je suis"
Evidemment vous aurez le même résultat si vous testez la colonne B ou C..ou E