A1参照形式でマクロ記録されるようになった


すみません、この話はExcel 2016に関してではなく、私が使っている「Office Insider」での変更点です。Office Insiderとは、いわばOfficeソフト(ExcelとかWordなど)の"ベータ版"みたいなやつで、アプリの不具合修正や新機能追加などが、だいたい1~2週間のペースで実施されています。誰でも利用できますので、興味のある方は「Office Insider」というキーワードで検索してください。新機能の追加では、一度実装されはしたものの「やっぱ、や~めた」みたいに削除されるケースもあります。たとえば、昨年(2020年)の7月に追加された変更で「保護されているシートのシート見出しに鍵アイコンが表示される」という新機能がありました。

このときは「へぇ~」って思ったのですが、その後正式に実装される気配もなく、気がつくとInsiderでも消滅していました。このように、Insiderで追加された新機能や変更点であっても、正式に採用されるとは限りません。そんな程度に受け取っています。しかし、今回の変更点に関しては「へぇ~」どころではなく「ええ!?」という驚きでしたので、コンテンツとして残しておきます。なお、本稿は2021年5月12日に執筆しています。まだInsiderの公式ページにも記載されていませんので、たぶん、ここ数日内で変更されたのだと思います。

VBAの話です。たとえば、下図のようなデータでセルD2を選択し「=SUM(A2:C2)」という数式を手入力したとします。その操作をマクロ記録すると、今までは次のようなコードが記録されました。

Sub Macro1()
    Selection.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"
End Sub

結論から先に書きますが、それが現在は次のように記録されます。

Sub Macro1()
    Selection.Formula = "=SUM(A2:C2)"
End Sub

「はぁ?ナニ言ってんの?」って拍子抜けした方、お気持ちはよく分かります。マクロ記録というのは、ユーザーが行った操作をVBAで記録する機能です。セルに"田中"と入力したら「"田中"が入力された」と記録されるのが当たり前です。しかし、今回のように、セルに数式を入力したときには、その当たり前が行われなかったんです。この、当たり前のことが行われるようになったという今回の修正は、Excelの長い歴史的に見て、とても大きな"変化"いや"進化"と言っても良いでしょう。

【追記(2021年12月)】
悲報です。悪い予感が当たってしまいました。確認したところ、また以前のR1C1参照形式が記録されるように戻っていました。まぁ、それだけMicrosoftも右往左往しているというか、少しでもExcelをよくしようと、あれこれがんばっているのでしょうね。現在は、またR1C1参照形式で記録されるのですが、Microsoftがこのへんに注意を向けているのは事実です。将来に期待しましょう。一度「こうしよう」と決めたことを「やっぱりやめた」と方向転換するのは、決して悪いことではありません。組織運営には、当然あり得ます。これに対して"朝令暮改"だとか「なんかぁ~コロコロ変わるんですけどぉ~」みたいな文句を言う人がいますけど、まったく分かっていません。少し黙っててくれませんかね。まず、何かを始めなければ変化しません。変化しなかったら発展もしません。だから、充分に検討した上でやってみます。でも、その判断が間違っていることもあります。あったり前です。判断が間違っていたと判明したら、方針を変えます。じゃ何ですか?一度決めたことを変えちゃいけないという人は、間違っていると判明しても、ずっとそのまま間違った方向で進めってことですかね?バカなの?で、そういう人は言うんでしょうね~「ほらな~だからダメだと思ったんだよ~俺は最初から感じてたんだ~でも決めたのは上だからさ~」みたいな。あ~いやだいやだ。あれ?何の話をしているんでしたっけw?すみません、少し酔っているのでかんべんしてください。酔って苦言を呈するのは年寄りの特権ですからw。さて、とりあえずマクロ記録は戻ってしまいましたが、せっかく書いたので、本稿はこのまま残しておきます。特に後半の「なぜ2つの参照形式があるのか」に関しては、知っておいて欲しいです。

A1参照形式とR1C1参照形式

そもそも「=SUM(A2:C2)」と「=SUM(RC[-3]:RC[-1])」の違いは何でしょう?Excelなどの表計算ソフトにとって、最も基本的な機能は「別のセルに入力されている値を利用する」ことです。たとえば、セルC5に入力されている値を別のセルで利用するには、一般的に次のような数式を使います。

セルC5は、どのセルからでも「C5」で特定できます。この「C5」をセルのアドレスとか番地などと呼びます。また、このように別のセルに入力されている値を利用する仕組みが「セルの参照」です。さて、Excelには、こうした"セルを参照する"仕組みとして、2つの方法が用意されています。それが「A1参照形式」と「R1C1参照形式」です。A1参照形式というのは、上図で示したように、参照したいセルをアドレスで特定するやり方です。対してR1C1参照形式は、「○列で×行目のセル」という指定ではなく「(数式を入力するセルから見て)×行下で○列右にあるセル」という特定の仕方をします。上図と同じ計算をR1C1参照形式で書くと、下図のようになります。

まず、ワークシート上部の"列番号"に注目してください。A列・B列・C列などのアルファベットではなく、1・2・3…という数字が並んでいます。R1C1参照形式では、列に名前はつけられていません。行と同じように、列も位置で指定します。行の位置はRの後ろに角括弧[]で指定します。列はCの角括弧[]です。「R[3]C[2]」は「3行下で2列右」を表し、「R[-2]C[-3]」は「-2行下で-3列右」つまり「2行上で3列左」のセルを表します。

どちらの参照形式を採用するかは、Excelのオプションで決められます。なお、標準はA1参照形式です。

何のためのオプションか

Excelには多くのオプション(設定項目)があります。Excelの制作元であるMicrosoftが、オプションとして「○という方法と、×という方法がありますよ」のように準備してあるということは、○と×の双方に、何らかのメリットがあり、適切に使い分けることでユーザーは何らかの恩恵を受けると。オプションとして用意されているのだから、何かしらのメリットがあるのだろう、と考えるのが普通です。しかし、そうとは限りません。今となっては何のメリットもない選択肢が、オプションとして残っているケースもあり得ます。この「R1C1参照形式を使用する」オプションは、まさにその典型です。メリットが皆無とはいいません。全Excelユーザーにとってみればゼロではないでしょう。しかし、どう考えても「A1参照形式」と「R1C1参照形式」に、同等のメリットはありません。感覚的には、9対1くらいでしょうか。もちろん「A1参照形式」が9です。

そもそも、なぜ2種類の参照形式があるのでしょうか。その理由を知るには、表計算ソフトの歴史を紐解かなければなりません。1980年代、まだWindowsが存在せず、パソコンの多くがMS-DOSというOSで動いていた頃、今のExcelみたいに世界中で使われていた表計算ソフトがありました。Lotus社が開発した「Lotus 1-2-3」です。それ以前にも表計算ソフトは存在していましたが、このLotus 1-2-3はIBM PCの普及に相まって、表計算ソフトのデファクトスタンダードとなりました。いわば"一人勝ち"で「表計算といえば、1-2-3だよね~」という状態でした。そして実はこのとき、Microsoftも表計算ソフトを販売していたんです。その名を「Multiplan」といいます。当時わたしは、仕事で両方の表計算ソフトを使っていましたが、しかしまぁ、なんともMultiplanは使い物にならなかったです。というよりも、比べものにならないほど1-2-3が秀逸でした。とにかく動作や再計算が超速い。Multiplanを使ったときのイライラ感は、今でも覚えています。処理速度の計測はしませんでしたが、間違いなく10倍以上の差がありました。ちなみに、ご存じの方は少ないでしょうけど、CPUは8086や80286の時代です。何よりも1-2-3が便利だったのは、グラフを作成できたことです。現在のみなさんは、表計算ソフトでグラフを作成できるなんて当然と思われるでしょう。しかし、当時は違ったんです。表計算ソフトは「計算」だけ。グラフを作るには、別のソフトを使わなければなりませんでした。しかし!MS-DOSはWindowsのようなマルチタスクではありません。ソフトは1つしか起動できないんです。表計算ソフトでデータを集計し、グラフを見るときには、その表計算ソフトを終了し、グラフソフトを起動してグラフを見て、また表計算を起動して…って、超面倒くさいです。ああ、ちなみに現在のパソコンとは性能が違います。何かのソフトを起動するのには、速くても数十秒程度の時間がかかりました。それが、1-2-3はシート上にグラフを作れたんです。さらに、強力なマクロ言語も搭載されていました。Multiplanがボロ負けするのも当然です。そして、ここが重要なんですが、ボロ負けのMultiplanが採用していた参照形式は「R1C1参照形式」で、世界標準となった1-2-3は「A1参照形式」だったんです。当時読んだ雑誌や書籍に書かれていましたが、ビルゲイツが「表計算は、R1C1参照形式の方が良いに決まってるだろ!A1形式なんてピーピーしたピー連中が使うものさ!」と主張していたらしいです。

さて、時は流れて、Microsoftは新しいOSとしてWindowsを発表します。現在のWindows普及率を見れば、このOSがいかに大ヒットしたかは言うまでもないでしょう。そしてMicrosoftは、かつて苦汁をなめさせられた表計算ソフトの分野でリベンジすべく、Excelを投入します。そのExcelが、今や世界標準となっているのは、みなさんご存じのとおりです。しかし、ここで忘れてはいけないことがあります。MicrosoftがExcelを開発し始めたとき(Excel 1.0はMac版です。Windowsよりもはるか前に開発されていました)、世の中は1-2-3ユーザーだらけです。つまり、世界中の表計算ユーザーが「A1参照形式」を使っているんです。その大多数の「A1参照形式」ユーザーを、Excelに乗り換えさせたいんです。となればExcelだって「A1参照形式」にするしかありません。とはいえ、ビルゲイツにも信念があります。「A1形式なんてピーピーだ!我が社の表計算には、R1C1形式も選択できるようにしろ!」と、鶴の一声を発したかどうかは分かりませんが、少なくとも、そう判断したのは間違いないでしょう。だから、両者を切り替えるオプションが用意されているんです。私はそう思います。実際にMultiplanを使っていて、惨敗する様子をリアルタイムで見てきた者としては、「R1C1参照形式」ってMicrosoftの遺恨のように感じてなりません。ちなみに、今となってはメリットを感じないオプションは、「R1C1参照形式を使用する」だけではありません。Excelのオプション[詳細設定]の最下部に「Lotusとの互換性」があります。言うまでもなくこれは、大多数の1-2-3ユーザーをExcelに移行させるためのオプションです。ほかにも、昔のExcelには「1-2-3ヘルプ」というのが付属していました。1-2-3の○○操作は、Excelだとこうするんですよ、という対比ヘルプです。Excelのシリアル値にはバグがあると言われています。1900年は閏年じゃないのに、2月29日があると。これ、1-2-3の日付シリアルが間違っていたんです。間違っていても、同じにしないと、データの互換性が保てません。だから、間違っているのを承知で引き継いだんです。この件、後日Lotus社から正式にコメントも出ました。日付の期間を計算するDATEDIF関数や、数値を漢数字に変換するNUMBERSTRING関数は、Excelのワークシート関数一覧に記載されていません。この2つは、1-2-3に存在した関数です。こっそり実装しておかないと互換性を維持できないので、Excelでも使えるようになっています。セルに入力するとき「'001」のように、先頭にシングルコーテーション(')をつけると文字列形式で入力できます。これは1-2-3の仕組みです。すでに存在していた多くの1-2-3データを引き継ぐためには、こうした仕組みを新しいExcelでも、実装しておかなければならなかったんです。などなど、Excelのスタート時期は、ものすごくLotus 1-2-3を意識していました。

すみません、かなり話が長くなってしまいました。もう終わります。いずれにしても今までのExcelでは、「セルに数式を代入する」という操作をマクロ記録すると、Microsoftの遺恨とも感じる「R1C1参照形式」で記録されました。だから、多くのユーザーは、セルに数式を代入するマクロは"R1C1参照形式で書かなければならない"と誤解をし、慣れない書き方に四苦八苦してきました。もう、これからは、そんな苦労をしなくても済みます。これでやっと、過去の呪縛から解き放たれたと感じます。ただ、残念なことに、マクロ記録で「A1参照形式」が記録されるようになったのは、セルに数式を代入したときだけです。実は、ほかにもいくつか、なぜか「R1C1参照形式」で記録される操作があります。確認したところ、そちらは直っていませんでした。残念ですが、こうした"進化"を続けるExcelに期待して待ちましょう。