スプレッドシートのマクロ記録時の絶対参照と相対参照の違いとは


reference

photo credit: tim ellis Dictionary Corner via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Googleスプレッドシートに搭載されたマクロ記録の機能について初心者向けに解説をしています。

前回の記事はコチラ。

スプレッドシートのマクロ機能で関数のインポートをする方法とマクロの削除の方法
Googleスプレッドシートに搭載されたマクロ記録機能について、初心者向けにその使い方をお伝えしています。今回は作成した関数をマクロとして登録する方法と、マクロを削除する方法についてお伝えしていきます。

マクロのインポートをする方法と削除をする方法についてお伝えしました。

ただ、今までスルーしてきちゃいましたが、マクロ記録の際に「絶対参照」と「相対参照」があったの覚えていますか?

気になりますよね。

今回は、スプレッドシートでのマクロ記録時の絶対参照と相対参照の違いについてお伝えしていきます。

マクロ記録の絶対参照と相対参照

さて、マクロ記録の使い方についてこれまでお伝えしてきましたが、以下の設定項目…気になっていましたよね…?

スプレッドシートのマクロ記録の絶対参照と相対参照

「絶対参照を使用」と「相対参照を使用」のラジオボタンです。

デフォルトでは絶対参照が選択されていますので、これまではそちらで進めて来たわけですが…

この二つの設定で何がどう違うのか知りたいじゃないですか。

ということで、今回は「相対参照を使用」でこれまでと同じく、シート1のA1セルにカーソル移動するマクロの記録をして、そのコードがどのようなものかを確認してみたいと思います。

相対参照を使用したカーソル移動のマクロ

相対参照を使用してマクロを記録する

では、「相対参照を使用」でのマクロ記録を進めていきましょう。

スプレッドシートのメニューから「ツール」→「マクロ」→「マクロ記録」と進めるのは、これまでと同じです。

その次。

以下のダイアログが出たところで、「相対参照を使用」を選択しましょう。

スプレッドシートのマクロ記録を相対参照で実施

すると赤丸のところも「相対参照を使用しています」と出ますね。

続いて、記録したい動作をそのまま操作していきます。

まずはシート1を選択。

スプレッドシートのマクロ記録でシート1を選択

次にA1セルを選択して、「保存」をクリックします。

スプレッドシートのマクロ記録でA1セルを選択して保存

「新しいマクロの保存」ダイアログが表示されますので、今回は名前を「カーソル移動(相対参照)」として「保存」します。

スプレッドシートのマクロ記録で名前をつけて保存

これでマクロ記録は完了です。

相対参照のカーソル移動マクロを実行する

では、作成したカーソル移動のマクロを実行してみましょう。

スプレッドシートのメニューから「ツール」→「マクロ」とたどると、先程作成した「カーソル移動(相対参照)」がメニューに表示されていますので、選択します。

スプレッドシートで相対参照のカーソル移動マクロを実行

すると…以下図のように

The coordinates or dimensions of the range are invalid.

というエラーが表示されて実行することができません。

スプレッドシートのマクロ実行でエラーが表示

Google翻訳で直訳してみると…

範囲の座標または寸法が無効です。

とのこと。

どういうことでしょうか?

相対参照のマクロ記録で書き出されたコード

スプレッドシートのメニューから「ツール」→「マクロ」→「マクロの管理」から「カーソル移動(相対参照)」の「スクリプトの編集」で書き出されたコードを確認してみましょう。

以下のようなコードが記録されていました。

まず、2,3行目ですがアクティブな(つまりバインドしている)スプレッドシートを取得し、変数spreadsheetに取得、その後「シート1」をアクティブシートとしてセットする、というところまでは、「絶対参照」で書き出されたコードと一緒ですね。

getCurrentCellメソッドで現在のセルを取得

次のところで以下のようなステートメントがあります。

Spreadsheetオブジェクト.getCurrentCell()

getCurrentCellメソッドは、スプレッドシートの現在のセルを取得するメソッドです。

なお、単一セルを返すというルールになっていて、セル範囲を選択しているときは左上のセルが取得されます。

offsetメソッドで指定した行列移動したセル範囲を取得

続いて、offsetメソッドですね。さも「相対」っぽいメソッドが出てきました。

Rangeオブジェクト.offset(行オフセット, 列オフセット)

行オフセット、列オフセットは整数で指定し、対象のRangeオブジェクト(今回の場合は単一セルですね)から、指定した行オフセット、列オフセット分移動した位置のRangeオブジェクトを返します。

つまり、今回書き出されたコードでは、13行分マイナスして、1列分マイナスした位置のセルをRangeオブジェクトとして取得せよ…ということになりますよね。

そりゃ、「getCurrentCell」が13行より小さい行数の位置だったら、「そのセルは存在していない」となりますよね。

だからエラーが出てしまうのです。

マクロ記録の絶対参照と相対参照の違い

つまり、マクロ記録の絶対参照と相対参照の違いは以下のようになります。

絶対参照でマクロ記録をした場合は、現在のカーソル位置に限らず、マクロ記録時のセル位置をそのままコードとして記録します。

一方で、相対参照でマクロ記録をした場合は、マクロ記録時のセルの移動距離でコードを記録するということになります。

なので、固定のセル範囲を操作したい場合は絶対参照を、実行時にカーソルがあるセルを基点にして操作したい場合には相対参照を使う、ということになりますね。

まとめ

以上、スプレッドシートのマクロ記録時の絶対参照と相対参照の違いについて解説をしました。

エクセルやスプレッドシートで「$」を使った絶対参照、相対参照の切り替えについて慣れている方は、そのままズバリ理解できますよね。

セル位置がかかわるマクロを記録したいときには、この違いを把握している必要がありますので、ぜひここでつかんじゃってくださいね。

連載目次:【初心者向け】スプレッドシートのマクロ記録の活用法

Googleスプレッドシートに満を持して搭載された「マクロ記録」。このシリーズでは、マクロ機能の概要と、その使い方、また書き出されたコードの編集や活用の仕方などを初心者向けにお送りしていきます。
  1. スプレッドシートのマクロ記録で簡単便利なカーソル移動のマクロを作ってみよう
  2. スプレッドシートのマクロ記録で書き出されたコードを確認する方法
  3. スプレッドシートのマクロ記録で書き出されたコードをリファクタリング
  4. スプレッドシートのマクロ機能で関数のインポートをする方法とマクロの削除の方法
  5. スプレッドシートのマクロ記録時の絶対参照と相対参照の違いとは

  投稿者プロフィール

タカハシノリアキ株式会社プランノーツ 代表取締役
株式会社プランノーツ代表、コミュニティ「ノンプロ研」主宰。1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ
★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ
★フォロー頂ければ嬉しいです。

コメント