Excel のワークシート関数で、現在のセル、列、または行をどのように自己参照しますか?
9 に答える
セルが自身を自己参照するには:
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 年以前のものです。2007 年以降の場合は、列:XFD および行:1048576 を使用してください。
注: INDIRECT 関数は揮発性であるため、必要な場合にのみ使用してください。
特に条件付き書式の場合、間接的な必要はないと思います。
セル、行、または列を自己参照する最も簡単な方法は、通常どおりに参照することです。たとえば、セルA1の "= A1"で、参照を部分的または完全に相対的なものにします。たとえば、さまざまなセルの行の最初の列に値があるかどうかを確認するための条件付き書式の数式で、A1を強調表示して次のように入力し、必要に応じてコピーします。条件付き書式は、各セルの行の列Aを常に参照します。
= $A1 <> ""
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
不揮発性ソリューションの場合、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)
VBA ワークシート関数 UDF では、Application.Caller を使用して、UDF を呼び出した数式を含むセル範囲を取得します。
より安全で、アプリケーションの速度を落とさないより良い方法があります。Excel の設定方法では、セルに値または数式を含めることができます。式はそれ自体のセルを参照できません。そうしないと、新しい値が別の計算を引き起こすため、無限ループになってしまいます... .
ヘルパー列を使用して、他のセルに入力した値に基づいて値を計算します。
例えば:
列 A は True または False で、列 B には金額が含まれ、列 C には次の式が含まれます。
=B1
ここで、列 A が True で列 B が 0 より大きい場合にのみ、列 B が条件付き形式で黄色に強調表示されることを計算するには...
=AND(A1=True,C1>0)
次に、列Cを非表示にすることを選択できます
私の現在の列は次のように計算されます:
方法 1:
=LEFT(ADDRESS(ROW(),COLUMN(),4,1),LEN(ADDRESS(ROW(),COLUMN(),4,1))-LEN(ROW()))
方法 2:
=LEFT(ADDRESS(ROW(),COLUMN(),4,1),INT((COLUMN()-1)/26)+1)
私の現在の行は次のように計算されます:
=RIGHT(ADDRESS(ROW(),COLUMN(),4,1),LEN(ROW()))
したがって、Sheet2!My Column への間接リンクですが、私の行の列 A で指定された別の行は次のとおりです。
方法 1:
=INDIRECT("Sheet2!"&LEFT(ADDRESS(ROW(),COLUMN(),4,1),LEN(ADDRESS(ROW(),COLUMN(),4,1))-LEN(ROW()))&INDIRECT (ADDRESS(ROW(),1,4,1)))
方法 2:
=INDIRECT("Sheet2!"&LEFT(ADDRESS(ROW(),COLUMN(),4,1),INT((COLUMN()-1)/26)+1)&INDIRECT(ADDRESS(ROW(),1,4) 、1)))
したがって、A6=3 で行が 6 で列が C の場合、"Sheet2!C3" の内容が返されます。
したがって、A7=1 で行が 7 で列が D の場合、"Sheet2!D1" の内容が返されます。
私はこれに対する解決策を探していて、最初はこのページにある間接的なものを使用しましたが、私がやろうとしていたことはかなり長くて扱いにくいことがわかりました。少し調査した後、R1C1表記を使用して(私の問題に対する)よりエレガントな解決策を見つけました-ただし、VBAを使用せずに異なる表記スタイルを混在させることはできないと思います。
自己参照セルで何をしようとしているかに応じて、この例のようなものは、セルが F13 であるセル自体を参照する必要があります。
Range("F13").FormulaR1C1 = "RC"
次に、セルが F13 であり、そこから G12 を参照する必要がある場合など、そのセルに対する相対位置でセルを参照できます。
Range("F13").FormulaR1C1 = "R[-1]C[1]"
基本的に、Excel に F13 を見つけてから 1 行下に移動し、そこから 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
私のルックアップ値は、DIM された範囲内の各セル (列 -1) の左側のセルであり、DATABYCODE は、私が調べている名前付き範囲です。
それが少し意味をなすことを願っていますか?問題にアプローチする別の方法として、ミックスに投入する価値があると考えました。
行だけですが、選択したセルのすぐ下のセルを参照し、行から1を引いてみてください。
=ROW(A2)-1
セル A1 の行を生成します (この式はセル A1 に入ります。
これにより、すべての indirect() および index() の使用が回避されますが、それでも機能します。