みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Googleスプレッドシートに搭載されたマクロ記録の機能について初心者向けに解説をしています。
前回の記事はコチラ。
マクロのインポートをする方法と削除をする方法についてお伝えしました。
ただ、今までスルーしてきちゃいましたが、マクロ記録の際に「絶対参照」と「相対参照」があったの覚えていますか?
気になりますよね。
今回は、スプレッドシートでのマクロ記録時の絶対参照と相対参照の違いについてお伝えしていきます。
マクロ記録の絶対参照と相対参照
さて、マクロ記録の使い方についてこれまでお伝えしてきましたが、以下の設定項目…気になっていましたよね…?
「絶対参照を使用」と「相対参照を使用」のラジオボタンです。
デフォルトでは絶対参照が選択されていますので、これまではそちらで進めて来たわけですが…
この二つの設定で何がどう違うのか知りたいじゃないですか。
ということで、今回は「相対参照を使用」でこれまでと同じく、シート1のA1セルにカーソル移動するマクロの記録をして、そのコードがどのようなものかを確認してみたいと思います。
相対参照を使用したカーソル移動のマクロ
相対参照を使用してマクロを記録する
では、「相対参照を使用」でのマクロ記録を進めていきましょう。
スプレッドシートのメニューから「ツール」→「マクロ」→「マクロ記録」と進めるのは、これまでと同じです。
その次。
以下のダイアログが出たところで、「相対参照を使用」を選択しましょう。
すると赤丸のところも「相対参照を使用しています」と出ますね。
続いて、記録したい動作をそのまま操作していきます。
まずはシート1を選択。
次にA1セルを選択して、「保存」をクリックします。
「新しいマクロの保存」ダイアログが表示されますので、今回は名前を「カーソル移動(相対参照)」として「保存」します。
これでマクロ記録は完了です。
相対参照のカーソル移動マクロを実行する
では、作成したカーソル移動のマクロを実行してみましょう。
スプレッドシートのメニューから「ツール」→「マクロ」とたどると、先程作成した「カーソル移動(相対参照)」がメニューに表示されていますので、選択します。
すると…以下図のように
The coordinates or dimensions of the range are invalid.
というエラーが表示されて実行することができません。
Google翻訳で直訳してみると…
範囲の座標または寸法が無効です。
とのこと。
どういうことでしょうか?
相対参照のマクロ記録で書き出されたコード
スプレッドシートのメニューから「ツール」→「マクロ」→「マクロの管理」から「カーソル移動(相対参照)」の「スクリプトの編集」で書き出されたコードを確認してみましょう。
以下のようなコードが記録されていました。
function myFunction1() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.setActiveSheet(spreadsheet.getSheetByName('シート1'), true); spreadsheet.getCurrentCell().offset(-13, -1).activate(); }
まず、2,3行目ですがアクティブな(つまりバインドしている)スプレッドシートを取得し、変数spreadsheetに取得、その後「シート1」をアクティブシートとしてセットする、というところまでは、「絶対参照」で書き出されたコードと一緒ですね。
getCurrentCellメソッドで現在のセルを取得
次のところで以下のようなステートメントがあります。
getCurrentCellメソッドは、スプレッドシートの現在のセルを取得するメソッドです。
なお、単一セルを返すというルールになっていて、セル範囲を選択しているときは左上のセルが取得されます。
offsetメソッドで指定した行列移動したセル範囲を取得
続いて、offsetメソッドですね。さも「相対」っぽいメソッドが出てきました。
行オフセット、列オフセットは整数で指定し、対象のRangeオブジェクト(今回の場合は単一セルですね)から、指定した行オフセット、列オフセット分移動した位置のRangeオブジェクトを返します。
つまり、今回書き出されたコードでは、13行分マイナスして、1列分マイナスした位置のセルをRangeオブジェクトとして取得せよ…ということになりますよね。
そりゃ、「getCurrentCell」が13行より小さい行数の位置だったら、「そのセルは存在していない」となりますよね。
だからエラーが出てしまうのです。
マクロ記録の絶対参照と相対参照の違い
つまり、マクロ記録の絶対参照と相対参照の違いは以下のようになります。
絶対参照でマクロ記録をした場合は、現在のカーソル位置に限らず、マクロ記録時のセル位置をそのままコードとして記録します。
一方で、相対参照でマクロ記録をした場合は、マクロ記録時のセルの移動距離でコードを記録するということになります。
なので、固定のセル範囲を操作したい場合は絶対参照を、実行時にカーソルがあるセルを基点にして操作したい場合には相対参照を使う、ということになりますね。
まとめ
以上、スプレッドシートのマクロ記録時の絶対参照と相対参照の違いについて解説をしました。
エクセルやスプレッドシートで「$」を使った絶対参照、相対参照の切り替えについて慣れている方は、そのままズバリ理解できますよね。
セル位置がかかわるマクロを記録したいときには、この違いを把握している必要がありますので、ぜひここでつかんじゃってくださいね。