ExcelのR1C1形式のメリットについて

皆さんはEXCELのR1C1形式というオプションをご存知でしょうか?

おそらく、VBAやEXCEL関数をかなり使いこなしている人でないと存在自体を知らないのではないでしょうか。

私は、以前にEXCELのVBA開発の仕事をしていたことがあったのですが、そのチーム内でも知らない人がいたくらいなので、一般の認知率はかなり低いのではないかと思っています。

しかし、このR1C1形式は関数やVBAを簡素にする上でそれなりに役に立つ要素なので、使いこなせておいて損はないかと思います。

私が感じているメリットについて記載をしていきたいと思います。

そもそもR1C1形式とは何か?

R1C1形式とは、EXCELの列番号を1、2、3、4…と数字の連番で表示させるオプションです。(通常はA、B、C、D … という表示です)

通常の形式(A1形式)

R1C1形式

通常の形式は、 A1形式と呼ばれています。この形式は、元々Excelのコピー元であるLotus1-2-3が採用していた形式です。

ビル・ゲイツはR1C1の形式のほうにしたかったらしいのですが、当時は Lotus1-2-3のシェアが圧倒的であったため、ユーザーが移行しやすいようにデフォルトで A1形式としたようです。

今の若い方はLotus1-2-3自体を知らないかもしれませんのでピンとこないかもしれませんが、 Lotus (現在はIBMに吸収された)の表計算ソフトです。

実は30代の私も社会人になるまで Lotus1-2-3 を知らなくて、「ロータスいち、に、さん」と読んでしまい、大恥を書いたことがありますw

R1C1形式のメリットについて

このR1C1形式を使用するメリットですが、列を数字で表すことになるのでプログラムと相性が良いというのが挙げられます。

決まったアドレスの1セルを参照する場合には、あまりメリットは感じませんが、動的にアドレスを指定する時には非常に便利です。

逆にデメリットを考えてみると…

  • デフォルトの設定でないため使用している人があまりいない
  • セルのアドレスを伝えにくい

パッと思いつくのはこのくらいですかね。特に大きいデメリットはないと思います。

2つ目の「セルのドレスを伝えにくい」というのは、例えば他人にこのセルを見てほしいと伝える時に、通常であれば「E1を見て」といえば良いのですが、R1C1の場合は「R1C5 を見て 」と言うことになります。

慣れてないのもあるかと思いますが、すごく違和感があってわかりにくい気がします。

まあ列名のみを指定する場合は「AX列を見て」というより「50列目を見て」ということが出来るので便利だったりしますが。

一方のメリットも「R1C1にすると凄く捗る」という程のものではないのです。ただ、前述の通りデメリットも小さいので、どうせなら設定したほうが良いのではないかと考えています。

それでは、EXCEL関数とVBAの両方でメリットになる具体例を記載してみたいと思います。


Excel関数でR1C1形式を使用するメリット

EXCEL関数を使用する際のメリットは、複雑なセル参照をしなければいけない時に「INDIRECT」と併用することで簡単に書けることです。

例えば、以下の表があった時を考えます。

この表を利用して、「Orange」という文字列から「みかん」を取り出したいとします。

そのままだとHLOOKUP関数が使えないので、 MATCHやINDEXを組み合わせてやる感じでしょうか。かなり難しそうです。

しかし、R1C1形式の場合は、以下のように書けます。

=INDIRECT("R2C"  & MATCH("Orange",R2C1:R2C3,0),FALSE)

INDIRECTは、参照するアドレスを文字列で指定できる関数です。

例えば、「=INDIRECT(“A1”)」 は「=A1」と同等です。

この時、通常のA1形式だと列の番号がアルファベットであるため計算など算出するのが面倒なのですが、 R1C1形式の場合は数値なので割と簡素に書ける場合が多いです。

あとVlookUpなどで対象の列数を数える時は多いと思うのですが、その際に「AX列からAB列は何列あるんだろう」みたいのは直感でわかりにくいです。

R1C1形式だと「50-28だから22だ」というのがすぐに分かるのもメリットですね。

VBAでR1C1形式を使用するメリット

相対参照の場合、R1C1形式は1つ上のセルを指定するという条件を以下のように書けます。

=R[-1]C

VBAで計算式を埋め込みたい時に、参照先のセルのアドレスを知る必要がないため非常に便利です。

例えば、A1形式で「自分の1つ上のセルを参照する」という計算式を埋め込みたい場合は、素直に書くと以下になります。

  1. 自分のセルの1つ上のセルのRangeを取得
  2. アドレスを取得
  3. 数式に埋め込む

上記をソースにすると以下のとおりです。

Set r = Range(Cells(2, 2), Cells(2, 2))
add = r.Address
Cells(3, 2).Formula = "=" & add

Offsetとかを使えよと言われそうですが、アドレスを取得するのは変わらないのでコード量は変わりません。

一方でR1C1形式を使用すれば…

Cells(3, 2).FormulaR1C1 = "=R[-1]C"

凄くシンプルでわかりやすいです!!

表示形式をR1C1形式に切り変える方法

このように、R1C1形式であれば簡単にかけるということが多いので、普段からR1C1形式に慣れておくとスマートなソースを書きやすいです。

特に、VBAはともかくEXCEL関数のR1C1は普通の表示だけしか使ったことがないと上手く使いこなせない気もします。

なので、自分が使っているEXCELの設定を変えてしまっておくのがおすすめです。

デフォルトのA1形式からR1C1形式に変更するには、EXCELのオプションから変更します。

私が使用しているOffice365の設定は以下のとおりです。

1.メニューバーの「ファイル」を選択

2.下の方にある「オプション」を選択

3.数式タブからR1C1参照形式を使用するにチェックを入れる

これで、EXCELがR1C1形式の表示になったかと思います。

まとめ

  • R1C1形式はEXCEL関数やVBAでメリットが有る
  • A1形式の表示を使用していると慣れないので、普段からR1C1を使っておくのがオススメ


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)