2009-02-03 8 views
57

J'essaye de faire une mise en forme conditionnelle pour que la couleur de cellule change si la valeur est différente de la valeur dans la cellule gauche de celle-ci (chaque colonne est un mois, en Je veux surveiller facilement les changements de prix sur plusieurs mois.)Formule Excel pour référence 'CELL A LA GAUCHE'

Je peux le faire par cellule et le faire glisser au format, mais j'aimerais qu'une formule générale s'applique à toute la feuille .

Merci!

+3

... et au cas où quelqu'un le chercherait ... pour obtenir la colonne à droite: '= INDIRECT (" RC [1] ", 0)' – prograhammer

+0

C'est une très bonne question. Malheureusement, je ne suis pas sûr si je comprends bien que l'affiche originale voulait que ses cellules changent sans avoir à faire de mise en forme conditionnelle et ensuite coller le peintre de format à chaque cellule. Disons que nous avons des mois dans les rangées, et des bananes, des pommes et des oranges dans les colonnes. Dans la matrice sont les prix. Comment serions-nous en mesure de faire quelque chose qui serait automatiquement COULEUR CELLULE ROUGE s'il y avait un changement de prix du mois précédent au mois en cours? S'il existe aussi un moyen automatique de colorer les cellules en vert si le prix baisse et en rouge si – Bryan

Répondre

63
=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1) 
+0

Nice, merci. La réponse de Michael a fonctionné à - mais j'aime des formules explicites ... – mik

+6

En utilisant CINQ fonctions de besoin-à-chercher-l'emploi rarement utilisées à la place une simple référence relative A1 ou RC [-1]? C'est comme voyager de Brooklyn au Bronx avec une escale à Walla Walla WA! –

+1

Aussi, rappelez-vous que cela va être volatile ... –

11

Lors de la création de votre mise en forme conditionnelle, définissez la plage à laquelle il applique à ce que vous voulez (la feuille entière), puis entrez une formule par rapport (enlever les $ signes) comme si vous ne formatez le coin supérieur gauche coin. Excel appliquera correctement la mise en forme au reste des cellules en conséquence.

Dans cet exemple, en commençant par B1, la cellule gauche serait A1. Il suffit d'utiliser cela - pas de formule avancée requise.


Si vous cherchez quelque chose de plus avancé, vous pouvez jouer avec column(), row() et indirect(...).

1

Vous pouvez utiliser un script VBA qui modifie la mise en forme conditionnelle d'une sélection (vous pourriez avoir à ajuster la condition & mise en forme en conséquence):

For Each i In Selection 
i.FormatConditions.Delete 
i.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, Formula1:="=" & i.Offset(0, -1).Address 
With i.FormatConditions(1).Font 
    .Bold = True 
End With 
Next i 
7

Si vous changez votre référence de cellule à utiliser R1C1 notation (Outils | Options, onglet Général), vous pouvez utiliser une notation simple et la coller dans n'importe quelle cellule.

Maintenant, votre formule est tout simplement:

=RC[-1] 
54

La version la plus courte est plus compatible:

=INDIRECT("RC[-1]",0) 

"RC [-1]" signifie une colonne à gauche. "R [1] C [-1]" est en bas à gauche.

Le deuxième paramètre 0 signifie que le premier paramètre est interprété en utilisant la notation R1C1.

Les autres options:

=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1) 

trop longtemps à mon avis. Mais utile si la valeur relative est dynamique/dérivée d'une autre cellule. par exemple .:

=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0, A1) 

L'option la plus simple:

= RC[-1] 

a l'inconvénient que vous devez activer la notation R1C1 en utilisant les options, ce qui est un non-aller quand d'autres personnes doivent utiliser Excel.

2

remplir la cellule A1, avec la formule suivante:

=IF(COLUMN(A1)=1;"";OFFSET(A20;0;-1))&"1" 

Puis autoextend à droite, vous obtenez

1| A | B | C | ect ect 
2| 1| 11| 111| ect ect 

Si le décalage est hors de la plage de la cellule disponible, vous obtenez le #REF! Erreur.

J'espère que vous apprécierez.

0

Encore plus simple:

=indirect(address(row(), column() - 1)) 

OFFSET renvoie une référence par rapport à la référence actuelle, donc si les rendements indirects de la référence correcte, vous n'avez pas besoin.

+0

Ne jamais le faire. INDIRECT brise l'arbre de dépendance - c'est un désastre. – Ollie2893

2

Au lieu d'écrire très long:

=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1) 

Vous pouvez simplement écrire:

=OFFSET(*Name of your Cell*,0,-1) 

Ainsi par exemple, vous pouvez écrire dans la cellule B2:

=OFFSET(B2,0,-1) 

à référence à la cellule B1

Encore merci Jason Young !! Je n'aurais jamais trouvé cette solution sans votre réponse!

+2

Ce n'est pas utile. Si vous savez déjà que votre cellule est B2, vous pouvez simplement écrire B1 pour la cellule à gauche et ne pas utiliser de décalage du tout. Le but est de faire quelque chose de complètement générique. –

1

Lors de la création d'une fonction définie utilisateur, j'ai découvert que les autres réponses concernant les fonctions et OFFSETINDIRECT ne peuvent pas être appliquées.

Au lieu de cela, vous devez utiliser Application.Caller pour faire référence à la cellule dans laquelle la fonction définie par l'utilisateur (UDF) a été utilisée. Dans un deuxième temps, vous convertissez l'index de la colonne au nom de la colonne correspondante.
Enfin, vous pouvez référencer la cellule de gauche à l'aide de la feuille de calcul active Range function.

Function my_user_defined_function(argument1, argument2) 
    ' Way to convert a column number to its name copied from StackOverflow 
    ' http://stackoverflow.com/a/10107264 
    ' Answer by Siddarth Rout (http://stackoverflow.com/users/1140579/siddharth-rout) 
    ' License (if applicable due to the small amount of code): CC BY-SA 3.0 
    colName = Split(Cells(, (Application.Caller(1).Column - 1)).Address, "$")(1) 

    rowNumber = Application.Caller(1).Row 

    left_cell_value = ActiveSheet.Range(colName & rowNumber).Value 

    ' Now do something with left_cell_value 
0

je suis tombé sur ce fil parce que je voulais toujours faire référence à la « cellule à gauche », mais crucialement d'une manière non volatile (pas OFFSET, catastrophes et similaires INDIRECT). Regarder le web de haut en bas, pas de réponses. (Ce thread ne fournit pas de réponse non plus.) Après quelques bricolages, je suis tombé sur la méthode la plus étonnante que j'aime partager avec cette communauté:

Supposons une valeur de départ de 100 dans E6. Supposons que j'entre un delta à cette valeur dans F5, disons 5. Nous calculerions alors la valeur de continuation (105) dans F6 = E6 + F5. Si vous voulez ajouter une autre étape, facile: copiez simplement la colonne F dans la colonne G et entrez un nouveau delta dans G5.

C'est ce que nous faisons, périodiquement. Chaque colonne a une date et ces dates doivent être dans l'ordre chronologique (pour aider avec MATCH etc). Il arrive tellement souvent que nous oublions de faire un pas. Supposons maintenant que vous voulez insérer une colonne entre F et G (pour rattraper votre omission) et copier F dans le nouveau G (pour repeupler la formule de continuation). Ce n'est rien d'un désastre total.Essayez-le - H6 dira maintenant = F6 + H5 et NON (comme nous en avons absolument besoin) = G6 + H5. (Le nouveau G6 sera correct.)

Pour faire ce travail, nous pouvons obscurcir ce calcul banal de la façon la plus étonnante F6 = index ($ E6: F6; 1; colonnes ($ E1: F1) -1) + F5. Copier à droite et vous obtenez G6 = index ($ E6: G6; 1; colonnes ($ E1: G1) -1) + G5.

Cela ne devrait jamais fonctionner, non? Référence circulaire, clairement! Essayez-le et soyez étonné. Excel semble se rendre compte que, bien que la plage INDEX couvre la cellule que nous recalculons, cette cellule elle-même n'est pas adressée par l'INDEX et ne crée donc PAS de référence circulaire.

Alors maintenant je suis à la maison et sèche. Insérez une colonne entre F et G et nous obtenons exactement ce dont nous avons besoin: La valeur de continuation dans l'ancien H se référer à la valeur de continuation que nous avons inséré dans le nouveau G.

0

Pourquoi ne pas simplement utiliser:

=ADDRESS(ROW(),COLUMN()-1) 
Questions connexes