回答:
これを行うには、ROW
およびCOLUMN
関数を使用できます。これらの数式の引数を省略すると、現在のセルが使用されます。これらは、OFFSET
関数、または数値として行と列の両方を指定できる他の関数で直接使用できます。
たとえば=ROW()
、セルD8に入力した場合、返される値は8です。=COLUMN()
同じセルに入力した場合、返される値は4です。
列の文字が必要な場合は、CHAR
関数を使用できます。列を表すために文字を使用することはお勧めしません。2文字の列名(数字を使用する方がとにかく論理的である場合)に渡すときに注意が必要になるためです。
それでも、列の文字を取得する必要がある場合は、列番号に64を追加するだけです(64は1文字少ないA
)ので、前の例では、セルの値をに設定すると=CHAR(COLUMN()+64)
、返される値はD
。セルの値をセルの場所そのものにしたい場合、完全な数式はになります=CHAR(COLUMN()+64) & ROW()
。
参考までに、ASCIIテーブルから64を得ました。CODE
数式を使用することもできるため、これを使用して更新される数式はになります=CHAR(COLUMN() + CODE("A") - 1)
。の最小値COLUMN
は常に1 であるため、1を減算する必要があり、式全体の最小戻り値はになりますB
。
ただし、これは2文字の列では機能しません。その場合、2文字の列を適切に解析するには次の式が必要です。
=IF(COLUMN()>26,IF(RIGHT(CHAR(IF(MOD(COLUMN()-1,26)=0,1,MOD(COLUMN()-1,26))+64),1)="Y",CHAR(INT((COLUMN()-1)/26)+64) & "Z",CHAR(INT((COLUMN()-1)/26)+64) & CHAR(IF(MOD(COLUMN(),26)=0,1,MOD(COLUMN(),26))+64)),CHAR(COLUMN()+64))&ROW()
それを行う簡単な方法があるかどうかはわかりませんが、セルA1
からZZ99
問題なく機能することは知っています。ただし、これは、文字ベースの列識別子の使用を避け、純粋な数値ベースの式に固執する(たとえば、文字の代わりに列番号を使用するOFFSET
)のが最善である理由を示しています。
OFFSET
ので、代わりに使用することをお勧めします。これにより、列を数値として指定できます。とにかく、2文字の列で動作するように拡張するための数式で回答を更新しました。
However, this will not work with two-letter columns. In that case, you need the following formula to properly parse two-letter columns:
これを試して
=SUBSTITUTE(SUBSTITUTE(CELL("address"),"$" & ROW(),""), "$", "")
これにより、$などのない正確な列ヘッダーが得られます。
別の可能な方法は、次のようなものを使用することです。
=INDIRECT("MySheet1!"&LOOKUP(COLUMN(),colid)&ROW())
ここcolid
にいう名前番号1を含む第一のカラムnに対応する:範囲ブック複数の行を有する2つの隣接する列を含む内の他の場所に作成しますCOLUMN()
- ZZ、又はしかし、多くの列参照でき番号、文字Aを含む第二の収容したい。ROW()
細かいことは行番号を返すことであるとして残されています。
したがって、上記の文字列を 'MySheet2'のセルA1にコピーすると=MySheet1!A1
、として評価され、の対応するセルで見つかった値を返しますMySheet1
。
これにより、たとえば、MySheet1
作業領域として使用したり、新しいデータを削除および再挿入したりできますがMySheet2
、それらのコンテンツを参照する書式設定や計算は、ターゲットのタブ付きワークシートの新しいデータセットで引き続き正常に機能します。
これは、VBA、ユーザー定義の数式、ソリューションです。1、2、および3文字の列で動作します。
コードモジュールに以下を入力します。
Function COLUMNLETTER(Optional rng As Range) As String
'Returns the Column Letter of the top left cell in rng.
If rng Is Nothing Then Set rng = Application.Caller
COLUMNLETTER = Left(rng.Address(0, 0), IIf(rng.Column > 26, IIf(rng.Column > 702, 3, 2), 1))
End Function
任意のセルの= COLUMNLETTER()は、セルの列文字を返します。
任意のセルの= COLUMNLETTER(B3)はBを返します。
このユーザー定義関数は、INDIRECT関数内で一般的な数式を作成するときに最適に機能します。
=MID(ADDRESS(ROW(),COLUMN()),2,FIND("$",ADDRESS(ROW(),COLUMN()),2)-2)
アドレス式は、列と行の名前を返すことで機能します。返される形式は常に$(Column Letters)$(Row Numbers)
- $AA$2
または$XAA$243556
$が常に最初の文字で発生することがわかっている場合は、最初のmid数式を使用して、最初の$記号(つまり、2番目の文字)の後に文字を引き始めることができます。
次に、次の$記号を見つけ(2つしかないことを知っているように)、1番目と2番目のドル記号の間にいくつの文字があるかを知ります。残りは単純な減算です。
LIN
を見つけましたCOL
が、問題はそれらが数値を返すことであり、それに列文字が必要INDIRECT
です。