web-dev-qa-db-fra.com

Mise en forme conditionnelle à l'aide de la fonction AND ()

J'essaye le formatage conditionnel sur une feuille. Je dois remplir les cellules avec une certaine couleur conformément à la déclaration conditionnelle suivante:

=AND((INDIRECT(ADDRESS(4;COLUMN()))>=INDIRECT(ADDRESS(ROW();4)));(INDIRECT(ADDRESS(4;COLUMN()))<=INDIRECT(ADDRESS(ROW();5))))

Lorsque j'essaie les instructions dans la fonction AND () séparément, elles semblent fonctionner, mais lorsque je les rassemble dans la fonction, aucune mise en forme ne se produit.

Voici quelques informations de base: La ligne 4 de la "colonne en cours" contient une date (DATE1). Il existe également des dates dans les colonnes D et E de la "ligne en cours" (DATE2 et DATE3). Donc, je voudrais remplir la cellule avec une couleur si DATE1 est entre DATE2 et DATE3.

Je ne vois pas pourquoi la formule ne fonctionne pas. Toute aide est très appréciée.

Mise à jour (13 décembre 2011):

J'ai implémenté une fonction que j'appelle depuis les cellules dont j'ai besoin. La fonction retourne des valeurs entières. Ensuite, la mise en forme conditionnelle utilise uniquement les nombres entiers des cellules. De cette façon, la mise en forme conditionnelle est moins compliquée. Je passe INDIRECT (ADDRESS (ROW (); COLUMN ())) dans la fonction que j'implémente. J'ai donc toutes les informations dont j'ai besoin lorsque je travaille sur des cellules relatives et/ou absolues. Il serait bon de connaître un moyen plus simple de passer la cellule actuelle comme plage dans la fonction.

Remarque: ActiveCell n'a pas semblé fonctionner pour moi. Il utilise les données de la cellule sélectionnée au moment de l'exécution de la fonction. Ce n'est pas ce que je cherche. Je pourrais bien sûr passer la cellule elle-même (comme en A4, B7, etc.) mais je ne suis pas sûr que cela compte vraiment en termes de performance.

Merci à tous ceux qui ont répondu à ma question.

12
some user

J'avais le même problème avec AND () en cassant la mise en forme conditionnelle. Il m'est arrivé d'essayer de traiter l'AND comme une multiplication, et cela fonctionne! Supprimez la fonction AND () et multipliez simplement vos arguments. Excel traitera les booléens comme 1 pour vrai et 0 pour faux. Je viens de tester cette formule et cela semble fonctionner.

=(INDIRECT(ADDRESS(4,COLUMN()))>=INDIRECT(ADDRESS(ROW(),4)))*(INDIRECT(ADDRESS(4,COLUMN()))<=INDIRECT(ADDRESS(ROW(),5)))
32
James

Vous pouvez utiliser une formule beaucoup plus simple. Je viens de créer un nouveau classeur pour le tester.

Column A = Date1 | Column B = Date2 | Column C = Date3

Mettez en surbrillance la colonne A et entrez la formule de mise en forme conditionnelle: 

=AND(A1>B1,A1<C1)
4
Lee Tickett

J'ai eu un problème similaire avec une formule moins compliquée: 

= If (x > A & x <= B) 

et a constaté que je pouvais supprimer la AND et rejoindre les deux comparaisons avec + 

  = (x > A1) + (x <= B1)        [without all the spaces]

J'espère que cela aide les autres avec des comparaisons moins complexes.

1
David

COLUMN() et ROW() ne fonctionneront pas de cette façon car ils sont appliqués à la cellule qui les appelle. Dans le formatage conditionnel, vous devrez être explicit au lieu de implicit .

Par exemple, si vous souhaitez utiliser cette mise en forme conditionnelle sur une plage commençant par la cellule A1, vous pouvez essayer:

`COLUMN(A1)` and `ROW(A1)`

Excel adaptera automatiquement la mise en forme conditionnelle à la cellule current.

0
JMax

Ceci est probablement dû aux fonctions column () et row (). Je ne suis pas sûr de savoir comment ils sont appliqués à la mise en forme conditionnelle. Essayez de créer une nouvelle colonne avec la valeur de cette formule, puis utilisez-la pour répondre à vos besoins de mise en forme.

0
ivan

Mêmes problèmes que d'autres rapportés - en utilisant Excel 2016. Constaté que lors de l'application de formules conditionnelles contre tableaux ; ET, multiplier les conditions et ajouter les conditions a échoué. J'ai dû créer moi-même la logique VRAI/FAUX:

=IF($C2="SomeText",0,1)+IF(INT($D2)>1000,0,1)=0
0
Grampa Ken

Je suis actuellement responsable d'une application Excel avec beaucoup de code hérité. L'une des parties les plus lentes de ce code parcourait 500 lignes en 6 colonnes, définissant des formules de mise en forme conditionnelle pour chacune. Les formules doivent identifier où le contenu de la cellule n'est pas vide, mais ne fait pas partie d'une plage nommée. Il est donc fait référence à deux reprises à la cellule elle-même, à l'origine sous la forme:

=AND(COUNTIF(<rangename>,<cellref>)=0,<cellref><>"")

De toute évidence, les frais généraux seraient considérablement réduits en mettant à jour toutes les cellules de chaque colonne (plage) à la fois. Cependant, comme indiqué ci-dessus, l’utilisation d’ADDRESS (ROW (), COLUMN (), n) ne fonctionne pas dans cette situation, c’est-à-dire que cela ne fonctionne pas:

=AND(COUNTIF(<rangename>,ADDRESS(ROW(),COLUMN(),1))=0,ADDRESS(ROW(),COLUMN(),1)<>"")

J'ai beaucoup expérimenté avec un classeur vierge et je ne pouvais rien y faire en utilisant différentes alternatives telles que ISBLANK. En fin de compte, pour contourner ce problème, j'ai créé deux fonctions définies par l'utilisateur (à l'aide d'une astuce trouvée ailleurs sur ce site):

Public Function returnCellContent() As Variant

  returnCellContent = Application.Caller.Value

End Function

Public Function Cell_HasContent() As Boolean

  If Application.Caller.Value = "" Then
    Cell_HasContent = False
  Else
    Cell_HasContent = True
  End If

End Function

La formule conditionnelle est maintenant:

=AND(COUNTIF(<rangename>,returnCellContent()=0,Cell_HasContent())

qui fonctionne bien.

Cela a accéléré le code, dans Excel 2010, de 5 à 1. Étant donné que ce code est exécuté chaque fois que des données sont chargées dans l'application, cette sauvegarde est importante et visible pour l'utilisateur. C'est aussi beaucoup plus propre et réutilisable.

J'ai pris le temps de poster ceci parce que je n'ai trouvé aucune réponse sur ce site ou ailleurs qui couvre toutes les circonstances, alors que je suis sûr qu'il y en a d'autres qui pourraient bénéficier de l'approche ci-dessus, potentiellement avec des nombres beaucoup plus grands des cellules à mettre à jour.

0
Rich Harding