Excelのワークシート関数で、現在のセル、列、行をどのように自己参照しますか?
これは条件付き書式設定に非常に役立つことに注意してください。
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
セルが自己参照する場合:
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 +の場合はcolumn:XFDおよびrow:1048576を使用します。
注:INDIRECT関数は揮発性であり、必要な場合にのみ使用してください。
間接的な、特に条件付き書式の必要性は見当たりません。
セル、行、または列を自己参照する最も簡単な方法は、通常、セルA1の「= A1」などを参照し、参照を部分的または完全に相対的にすることです。たとえば、さまざまなセルの行の最初の列に値があるかどうかを確認するための条件付き書式設定式で、A1を強調表示して次を入力し、必要に応じてコピーします。条件付き書式は、各セルの行の列Aを常に参照します。
= $A1 <> ""
より安全で、アプリケーションの速度を低下させない、より良い方法があります。 Excelの設定方法では、セルに値または数式を設定できます。数式は独自のセルを参照できません。そうしないと、新しい値によって別の計算が行われるため、無限ループになります..。
ヘルパー列を使用して、他のセルに入力した値に基づいて値を計算します。
例えば:
列AはTrueまたはFalse、列Bには金額が含まれ、列Cには次の式が含まれます。
=B1
ここで、列AがTrueで列Bがゼロより大きい場合にのみ、列Bが条件付きフォーマットで黄色で強調表示されることを計算します...
=AND(A1=True,C1>0)
その後、列Cを非表示にすることを選択できます
不揮発性ソリューションについては、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)
これらの式の最後の行または列(行1048576および列XFD)を受け入れないというExcel 2010の奇妙なバグがあるため、これらの短いものを参照する必要があります。他のバージョンでも同じかどうかわからないので、フィードバックと編集をお願いします。
2003年('97年にINDEXは不揮発性になりました):
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を呼び出した数式を含むセルの範囲を取得します。
私の現在の列は次によって計算されます:
方法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()の使用が回避されますが、引き続き機能します。