Самостоятельная ссылка на ячейку, столбец и строку в функциях листа - PullRequest
19 голосов
/ 13 июня 2011

В функции рабочего листа в Excel, как вы сами ссылаетесь на ячейку, столбец или строку, в которой находитесь?

Обратите внимание, что это чрезвычайно полезно для условного форматирования.

Ответы [ 9 ]

55 голосов
/ 13 июня 2011

Чтобы ячейка могла ссылаться на себя:

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

Чтобы ячейка самостоятельно ссылалась на свой столбец:

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

Чтобы ячейка самостоятельно ссылалась на свой ряд:

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

Числа для 2003 и более ранних версий, используйте столбец: XFD и строку: 1048576 для 2007 +.

Примечание: функция INDIRECT является энергозависимой и должна использоваться только при необходимости.

10 голосов
/ 14 июня 2011

Я не вижу необходимости в Indirect, особенно для условного форматирования.

Самый простой способ самостоятельной ссылки на ячейку, строку или столбец - это обычная ссылка на нее, например "= A1"в ячейке A1 и сделайте ссылку частично или полностью относительной.Например, в формуле условного форматирования для проверки наличия значения в первом столбце строк различных ячеек введите следующее, выделив A1, и при необходимости скопируйте.Условное форматирование всегда будет ссылаться на столбец A для строки каждой ячейки:

= $A1 <> ""
8 голосов
/ 02 ноября 2012

, где F13 - ячейка, на которую нужно ссылаться:

=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
2 голосов
/ 27 июня 2014

Существует лучший способ, который безопаснее и не замедлит работу вашего приложения. Как настроен Excel, ячейка может иметь значение или формулу; формула не может ссылаться на собственную ячейку. В противном случае вы получите бесконечный цикл, поскольку новое значение приведет к другому вычислению ....

Используйте вспомогательный столбец для вычисления значения на основе того, что вы положили в другую ячейку.

Например:

Столбец A является истинным или ложным, столбец B содержит денежное значение, столбец C содержит следующую формулу:

=B1

Теперь, чтобы вычислить, что столбец B будет выделен желтым в условном формате, только если столбец A равен True, а столбец B больше нуля ...

=AND(A1=True,C1>0)

Затем вы можете скрыть столбец C

.
2 голосов
/ 14 июня 2011

Для энергонезависимого решения, как насчет 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)

У меня странная ошибка в Excel 2010, когда он не принимает самую последнюю строку или столбец для этой формулы (строка 1048576 и столбец XFD), поэтому вам может потребоваться сослаться на эту короткую строку. Не уверен, что так же, как и в других версиях, поэтому оцените отзывы и отредактируйте.

и за 2003 год (INDEX стал энергонезависимым в 97 году):

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)
1 голос
/ 19 июля 2014

Я искал решение для этого и использовал косвенный, найденный на этой странице изначально, но я нашел его довольно длинным и неуклюжим для того, что я пытался сделать.После небольшого исследования я нашел более элегантное решение (для моей проблемы) с использованием нотации R1C1 - я думаю, что вы не можете смешивать разные стили нотации без использования VBA.

В зависимости от того, что вы пытаетесьделать с ячейкой с собственной ссылкой, что-то вроде этого примера должно заставить ячейку ссылаться на себя, где ячейка F13:

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

И затем вы можете ссылаться на ячейки в относительных позициях к этой ячейке, например - где вашячейка - это F13, и вам нужно сослаться на G12 из нее.

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

По сути, вы говорите Excel найти F13, а затем переместитесь вниз на 1 строку и на одну колонку вверх от этого.

Какэто вписалось в мой проект, чтобы применить vlookup ко всему диапазону, где значение поиска было относительно каждой ячейки в диапазоне, без необходимости указывать каждую ячейку поиска отдельно:

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

Мое значение поиска - это ячейка дляслева от каждой ячейки (столбец -1) в моем диапазоне DIM, и DATABYCODE - это именованный диапазон, против которого я смотрю.

Надеюсь, что это делаетнемного смысла?Думал, что это стоит добавить в качестве другого способа решения проблемы.

1 голос
/ 07 августа 2013

Мой текущий столбец рассчитывается по формуле:

Метод 1:

= ВЛЕВО (АДРЕС (ROW (), COLUMN (), 4,1)), LEN (АДРЕС (ROW (), КОЛОННА (), 4,1)) - LEN (ROW ()))

Метод 2:

= ВЛЕВО (АДРЕС (ROW (), COLUMN (), 4,1), INT ((COLUMN () - 1) / 26) +1)

Моя текущая строкарассчитывается по формуле:

= ПРАВО (АДРЕС (ROW (), COLUMN (), 4,1), LEN (ROW ()))

, поэтому косвенная ссылкаto Sheet2! Моя колонка, но другая строка, указанная в колонке A моей строки:

Метод 1:

= INDIRECT ("Sheet2!"& ЛЕВЫЙ (АДРЕС (СТРОКА (), Column (), 4,1), LEN (АДРЕС (СТРОКА (), Column (), 4,1)) - LEN (СТРОКА ())) & ДВССЫЛ (АДРЕС (СТРОКА (),1,4,1)))

Метод 2:

= INDIRECT ("Sheet2!" & LEFT (ADDRESS (ROW (),COLUMN (), 4,1), INT ((COLUMN () - 1) / 26) +1) и INDIRECT (АДРЕС (ROW (), 1,4,1)))

Итакесли A6 = 3, и моя строка равна 6, а мое Col равно C, возвращает содержимое "Sheet2! C3"

Так что если A7 = 1 имой ряд равен 7, а мой столбец D возвращает содержимое "Sheet2! D1"

1 голос
/ 14 июня 2011

В функции UDF рабочего листа VBA вы используете Application.Caller, чтобы получить диапазон ячеек, содержащих формулу, которая называется UDF.

0 голосов
/ 17 мая 2013

Только для строки, но попробуйте сослаться на ячейку чуть ниже выбранной ячейки и вычесть одну из строки.

=ROW(A2)-1

Возвращает строку ячейки A1 (эта формула будет помещаться в ячейку A1.

Это позволяет избежать использования косвенных () и index (), но все еще работает.

...