Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 VBA et plages nommées

sr94

XLDnaute Occasionnel
Bonjour

J'ai une macro qui me permet de supprimer et de refaire la mise en forme conditionnelle d'un fichier :

Code:
With Range("Y5").Select
Set plage3 = Range("Y5:Y" & Range("Y65536").End(xlUp).Row)

plage3.FormatConditions.Add Type:=xlExpression, Formula1:="=SI($O5<>"""";$Y5>=$O5;et($E5<>"""";$Y5>=$M5) )"
plage3.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.ColorIndex = 3
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
plage3.FormatConditions(1).StopIfTrue = False

End With

Mon fichier est amené à être modifier et j'aimerais remplacer toute la référence à des cellules par les noms des colonnes ou les plages nommées, si je remplace ("Y5:Y") par ("FRI") par exemple j'ai une erreur

L'indice n'appartient pas à la selection

Comment dois je modifier ce code pour ne plus avoir de référence à des cellules ?

Je joins un fichier test

Merci
 

Pièces jointes

  • Classeur test.xlsm
    28.8 KB · Affichages: 57
  • Classeur test.xlsm
    28.8 KB · Affichages: 59
Dernière édition:

sr94

XLDnaute Occasionnel
Re : VBA et plages nommées

Bon je suis finalement repartie sur la formule, mais vu toutes les formules j'essaie de mettre les formules dans les variables, mais j'ai une erreur de objet requis. Pourtant le ETA est bien une plage nommée, qu'est ce qu'il manque ?

Code:
Sub Mise_en_forme_conditionnelle()

Dim Tableau, plage1 As Range
Dim rngETA As Range

Set plage1 = Range("Tableau2")
Set Tableau = Range("Tableau2")
Set rngETA = [ETA].Rows(1).Address(False, True)

Tableau.Select
Selection.FormatConditions.Delete


'Lignes en vert 35 si ETA <>""
With plage1.Select
plage1.FormatConditions.Add Type:=xlExpression, Formula1:="=" & rngETA & "<>0"
plage1.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.ColorIndex = 35

End With
plage1.FormatConditions(1).StopIfTrue = False

End With


End Sub
 

Pièces jointes

  • test 3.xlsm
    29.5 KB · Affichages: 35
  • test 3.xlsm
    29.5 KB · Affichages: 38

sr94

XLDnaute Occasionnel
Re : VBA et plages nommées

Ca risque d'etre compliqué avec listobjects, j'ai beaucoup de MFC

avec la formule ça marche pas mal, mais j'ai du mal à déclarer cette formule en variable (voir mon précédent email), que faut-il modifier ?

Merci
 

Dranreb

XLDnaute Barbatruc
Re : VBA et plages nommées

[ETA].Rows(1).Address(False, True) est une expression de type String, pas Range
Bon j'arrête là, puisque vous ne suivez pas mes conseils. En particulier d'éviter les Select et d'utiliser l'objet FormatCondition renvoyé de toute façon, et pour rien sinon, par la méthode FormatConditions.Add, afin d'éviter de repréciser chaque fois tout le bordel après avoir du faire un .SetFirstPriority pour que ça puisse marcher, bref en laissant les conneries de l'enregistreur de macros .
 

sr94

XLDnaute Occasionnel
Re : VBA et plages nommées

Je suis désolée si vous le prenez comme ça, je ne suis pas du tout informaticienne, je suis juste une utilisatrice lambda qui utilise excel et je fais de mon mieux pour avoir des outils efficaces. Je n'ai jamais eu de formation VBA, ce n'est pas mon métier, par contre je sais ce que l'on peut faire, et donc je chercher à améliorer.

Je n'avais pas spécialement relever dans les messages qu'il fallait

D'ailleurs pour tout avouer je ne saisis pas au premier abord ce que ça signifie et ce que je dois en faire.

et en faisant
Code:
Dim Tableau, plage1 As Range
Dim strETA As String

Set plage1 = Range("Tableau2")
Set Tableau = Range("Tableau2")
Set strETA = [ETA].Rows(1).Address(False, True)

J'ai toujours mon erreur d'objet requis.

Merci beaucoup pour l'aide
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : VBA et plages nommées

Ça signifie ce que je dis, je ne veux plus que vous fassiez de Select et que vous utilisiez ce que renvoie la méthode Add de l'objet FormatConditions, à savoir un objet de type FormatCondition. Inutile donc d'aller le repêcher juste derrière: vous l'avez directement dans les mains !
L'instruction Set sert spécifiquement à affecter une expression objet à une variable objet. Çà ne touche pas au contenu des exemplaires d'objets impliqués, ça affecte juste l'adresse, ça l'initialise pour qu'on puisse l'utiliser ensuite. Pour affecter une expression de valeur à une variable (ou à une propriété d'un objet dûment initialisé), c'est l'instruction Let, dont le mot clé Let est généralement omis.
 

sr94

XLDnaute Occasionnel
Re : VBA et plages nommées

j'ai fait de ce que j'ai compris mais encore une erreur Propriété ou méthode non gérée par cet objet sur la ligne Set FC ...


Code:
Sub Mise_en_forme_conditionnelle()

Dim Tableau, plage1 As Range
Dim strETA As String
Dim FC As FormatCondition

Set plage1 = Range("Tableau2")
Set Tableau = Range("Tableau2")
strETA = [ETA].Rows(1).Address(False, True)

Tableau.FormatConditions.Delete

Set FC = plage1.DataBodyRange.FormatConditions.Add _
   (Type:=xlExpression, Formula1:="=" & strETA & "<>0")

With FC.Interior: .ColorIndex = 35

FC.StopIfTrue = False


End With
End Sub

Et derrière j'ai encore 6 MFC, je les mets l'une après l'autre directement ?
 

Dranreb

XLDnaute Barbatruc
Re : VBA et plages nommées

Les objets Range n'ont pas de propriété DataBodyRange. C'est une propriété des objets ListObject et ListColumn.
En revanche un objet Range peut posséder une propriété ListObject qui est, elle, un objet ListObject.
Déclarez par conséquent un LO As ListObject et initialisez le par Set LO = Range("Tableau2").ListObject

Oui, mettez autant de séquences quil y a de MeFC à créer. Mais pourquoi préférez vous utiliser des noms dans le classeur au lieu des titres de colonnes ?
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…