web-dev-qa-db-fra.com

Référence automatique pour la cellule, la colonne et la ligne dans les fonctions de la feuille de calcul

Dans une fonction de feuille de calcul dans Excel, comment auto-référencer la cellule, la colonne ou la ligne dans laquelle vous vous trouvez?

Notez que cela est extrêmement utile pour la mise en forme conditionnelle.

18
Lance Roberts

où F13 est la cellule à référencer:

=CELL("Row",F13)  yields 13; its row number

=CELL("Col",F13)  yields 6; its column number;  

=SUBSTITUTE(ADDRESS(1,COLUMN(F13)*1,4),"1","") yields F; its column letter
8
Matt J

Pour qu'une cellule s'auto-référence elle-même:

INDIRECT(ADDRESS(ROW(), COLUMN()))

Pour qu'une cellule s'auto-référence à sa colonne:

INDIRECT(ADDRESS(1,COLUMN()) & ":" & ADDRESS(65536, COLUMN()))

Pour qu'une cellule s'auto-référence à sa ligne:

INDIRECT(ADDRESS(ROW(),1) & ":" & ADDRESS(ROW(),256))
or
INDIRECT("A" & ROW() & ":IV" & ROW())

Les chiffres sont pour 2003 et les années antérieures, utilisez la colonne: XFD et la ligne: 1048576 pour 2007+.

Remarque: La fonction INDIRECT est volatile et ne doit être utilisée que lorsque cela est nécessaire.

54
Lance Roberts

Je ne vois pas la nécessité d'Indirect, en particulier pour la mise en forme conditionnelle.

Le moyen le plus simple de référencer soi-même une cellule, une ligne ou une colonne consiste à s'y référer normalement, par exemple, "= A1" dans la cellule A1 et à rendre la référence partiellement ou totalement relative. Par exemple, dans une formule de mise en forme conditionnelle permettant de vérifier s'il existe une valeur dans la première colonne des lignes de différentes cellules, entrez les informations suivantes avec A1 en surbrillance et copiez-les si nécessaire. La mise en forme conditionnelle fera toujours référence à la colonne A pour la ligne de chaque cellule:

= $A1 <> ""
10
Doug Glancy

Il existe un meilleur moyen, plus sûr et qui ne ralentira pas votre application. Comment Excel est configuré, une cellule peut avoir une valeur ou une formule; la formule ne peut pas faire référence à sa propre cellule. Sinon, vous vous retrouvez avec une boucle infinie, car la nouvelle valeur provoquerait un autre calcul .... 

Utilisez une colonne d'assistance pour calculer la valeur en fonction de ce que vous avez mis dans l'autre cellule. 

Par exemple:

La colonne A est vraie ou fausse, la colonne B contient une valeur monétaire, la colonne C contient la formule suivante: 

=B1

Maintenant, pour calculer que la colonne B sera surlignée en jaune dans un format conditionnel uniquement si la colonne A est vraie et la colonne B est supérieure à zéro ...

=AND(A1=True,C1>0)

Vous pouvez ensuite choisir de masquer la colonne C

2
Ester

Pour une solution non volatile, qu'en est-il de 2007+:

for cell    =INDEX($A$1:$XFC$1048576,ROW(),COLUMN())
for column  =INDEX($A$1:$XFC$1048576,0,COLUMN())
for row     =INDEX($A$1:$XFC$1048576,ROW(),0)

J'ai un bogue étrange sur Excel 2010 qui n'accepte pas la dernière ligne ou la dernière colonne de ces formules (ligne 1048576 et colonne XFD); Vous ne savez pas si c'est la même chose pour les autres versions, appréciez les commentaires et les modifications.

et pour 2003 (INDEX est devenu non volatile en 1997):

for cell    =INDEX($A$1:$IV$65536,ROW(),COLUMN())
for column  =INDEX($A$1:$IV$65536,0,COLUMN())
for row     =INDEX($A$1:$IV$65536,ROW(),0)
2
osknows

Dans une fonction de feuille de calcul VBA UDF, vous utilisez Application.Caller pour obtenir la plage de cellules contenant la formule appelée UDF.

1
Charles Williams

Ma colonne actuelle est calculée par:

Méthode 1:

= GAUCHE (ADRESSE (ROW (), COLONNE (), 4,1), LEN (ADRESSE (ROW (), COLONNE (), 4,1)) - LEN (ROW () ()))

Méthode 2:

= LEFT (ADRESSE (ROW (), COLUMN (), 4,1), INT ((COLUMN (1 - 1 - 1)/26) +1)

Ma ligne actuelle est calculée par:

= DROIT (ADRESSE (ROW (), COLONNE (), 4,1), LEN (ROW ())))

donc un lien indirect à Sheet2! Ma colonne mais une ligne différente, spécifiée dans la colonne A de ma ligne est: 

Méthode 1:

= INDIRECT ("Sheet2!" & LEFT (ADRESSE (ROW (), COLONNE (), 4,1)), LEN (ADRESSE (ROW (), COLONNE (), 4,1)) - LEN (ROW ())) & INDIRECT (ADRESSE (ROW (), 1,4,1)))

Méthode 2:

= INDIRECT ("Sheet2!" & LEFT (ADRESSE (ROW (), COLONNE (), 4,1)), INT ((COLUMN (1 - 1)/26) +1) & INDIRECT (ADRESSE (ROW (), 1,4, ,1)))

Donc, si A6 = 3 et que ma ligne est 6 et que Col est C, renvoie le contenu de "Sheet2! C3"

Donc, si A7 = 1 et que ma ligne est 7 et que Col est D, renvoie le contenu de "Sheet2! D1"

1
OSTEC

Je cherchais une solution à ce problème et utilisais initialement la solution indirecte trouvée sur cette page, mais je l’ai trouvée assez longue et maladroite pour ce que j’essayais de faire. Après quelques recherches, j'ai trouvé une solution plus élégante (à mon problème) utilisant la notation R1C1 - je pense que vous ne pouvez pas mélanger différents styles de notation sans utiliser VBA.

Selon ce que vous essayez de faire avec la cellule auto-référencée, quelque chose comme cet exemple devrait obliger une cellule à se référencer elle-même lorsque la cellule est F13:

Range("F13").FormulaR1C1 = "RC"

Et vous pouvez ensuite référencer des cellules dans des positions relatives par rapport à cette cellule, par exemple, où votre cellule est F13 et vous devez référencer G12 à partir de celle-ci.

Range("F13").FormulaR1C1 = "R[-1]C[1]"

Vous dites essentiellement à Excel de trouver F13, puis de descendre d’une rangée et d’augmenter d’une colonne.

Dans le cadre de mon projet, cela correspondait à l'application d'un vlookup sur une plage où la valeur de recherche était relative à chaque cellule de la plage sans avoir à spécifier chaque cellule de recherche séparément:

Sub Code()
    Dim Range1 As Range
    Set Range1 = Range("B18:B23")
        Range1.Locked = False
        Range1.FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],DATABYCODE,2,FALSE),"""")"
        Range1.Locked = True
End Sub

Ma valeur de recherche est la cellule située à gauche de chaque cellule (colonne -1) dans ma plage DIM et DATABYCODE est la plage nommée sur laquelle je cherche.

Espérons que cela a un sens? Je pensais que cela valait la peine d’être jeté dans le mélange comme une autre façon d’aborder le problème.

1
Harley B

Juste pour ligne, mais essayez de référencer une cellule juste en dessous de la cellule sélectionnée et de soustraire une de la ligne.

=ROW(A2)-1

Renvoie la ligne de la cellule A1 (cette formule irait dans la cellule A1.

Cela évite toute utilisation indirecte () et index () mais fonctionne toujours.

0
Jeffrey