Créer une plage nommée conditionnée
Bonjour à tous,
Pardon si mon erreur est très simple, je suis nouveau en VBA.
J'essaye de créer 93 plages nommées et veux que chaque plage se réfère à une formule comme celle qui suit :
=SI('After BLANK'!C294;'After BLANK'!C5:C293;0)Au final, je veux donc une plage nommée conditionnée pour C5:C293, une pour D5:D293, etc jusqu'à CQ5:CQ293.
J'ai créé cette macro qui ajoute et nomme correctement les plages mais je n'arrive pas à écrire la formule.
Sub PlageNommée()
m = 2
For k = 3 To 95
m = m + 1
NomColonne = Worksheets(3).Cells(1, m).Address(RowAbsolute:=False, ColumnAbsolute:=False)
NomColonne = CStr(Left(NomColonne, Len(NomColonne) - 1))
Formule = "SI('After BLANK'!" & NomColonne & "294;'After BLANK'!" & NomColonne & "5:" & NomColonne & "293;0)"
ActiveWorkbook.Names.Add Name:="Puit_" & Worksheets(3).Cells(4, m).Value, RefersTo:=Formule
Next k
End SubQuand je vais dans le Gestionnaire de Noms, la formule est écrite entre guillemets :
="SI('After BLANK'!C294;'After BLANK'!C5:C293;0)"Je suis sûr que la solution est toute simple mais je n'arrive pas à la trouver en ligne.
Merci d'avance pour votre aide.
Pour ceux que ça pourrait intéresser, j'ai finalement j'ai trouvé une façon détournée de le faire :
Sub Plages()
m = 2
For k = 3 To 95
m = m + 1
NomColonne = Worksheets(3).Cells(1, m).Address(RowAbsolute:=False, ColumnAbsolute:=False)
NomColonne = CStr(Left(NomColonne, Len(NomColonne) - 1))
If Worksheets(3).Cells(294, m).Value = True Then
ActiveWorkbook.Names.Add Name:="Puit_" & Worksheets(3).Cells(4, m).Value, RefersTo:=Worksheets(3).Range(Cells(5, m), Cells(293, m))
Else
ActiveWorkbook.Names.Add Name:="Puit_" & Worksheets(3).Cells(4, m).Value, RefersTo:=0
End If
Next k
End SubEt pour que cette macro s'exécute à chaque fois qu'une cellule de C294:CQ294 est modifiée, j'ai d'abord écris ça :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("C294:CQ294")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Call Plages
End If
End SubMais ça n'a pas marché car les cellules C294:CQ294 sont liées à des CheckBoxes et Worksheet_Change ne détecte pas la modification des cellules quand celle-ci passe par des CheckBoxes. J'ai donc écrit ça à la place :
Sub InitCBs()
Dim cb As CheckBox
For Each cb In Worksheets(3).CheckBoxes
With cb
.OnAction = "Plages"
End With
Next cb
End SubEt je lance cette macro à l'ouverture :
Private Sub Workbook_Open()
Call InitCBs
End SubEt voilà !