#15 GAS は、Google の VBA マクロを分析する(その2 相対参照)
前回の #14 では「絶対参照を使用」で記録したマクロがどのように記録されているのかを、1行ずつ解説しました。2回目は、「相対参照を使用」で同じことをしたら、どのように記録されるのかを確認して、違いを見ていきます。
マクロを記録する(相対参照)
前回のスプレッドシートに続けて操作していきますが、違いが分かりやすいように、セルに入力されている内容を一旦クリアしてからマクロを記録させます。
ここで、
カーソル位置を A1 に指定。
メニューバーから「拡張機能」→「マクロ」→「マクロを記録」と選択。
下部に表示されたウィンドウで「相対参照を使用」を選択。
とした上で、前回と同じように、次のように操作します。
「1」を入力
→ 入力すると、カーソルは A2 に移動「→」を押してカーソルを移動
→ カーソルは B2「2」を入力
→ 入力すると、カーソルは B3 に移動「→」を押してカーソルを移動
→ カーソルは C3「3」を入力
→ 入力すると、カーソルは C4 に移動
ここまで操作したところで、下部に表示されているウィンドウの「保存」ボタンを押します。
すると、下図のような「新しいマクロの保存」ダイアログが表示されるので、適当な名前をつけて保存します。今回は、「相対参照マクロ」と設定してみます。「ショートカット」には保存されたマクロを呼び出すためのキーを割り当てられるので、ひとまず「2」を設定しておきます。
保存されたマクロの内容を、「拡張機能」→「マクロ」→「マクロを管理」で、確認したいマクロのメニューから「スクリプトを編集」で確認してみましょう。
記録されたマクロを確認
前回の「絶対参照を使用」で記録されていたマクロは 12行まででしたが、13行目からプログラムが追加されて、22行になっています。
それでは、追加された分について説明していきます。
13行目
何もない行です。
プログラムの動作としては、意味がありませんが、3 ~ 12行目までの関数 myFunction と、14行目からの関数 myFunction1 の区切りを表すために、空行となっています。
プログラムを読みやすくするために意図して入れてある空行なのだと思います。こういった配慮が、プログラムの可読性(読みやすさ)を高めるのだと思います。
14 ~ 15行目
function myFunction1() {
var spreadsheet = SpreadsheetApp.getActive();
この辺りは、前回と同じような感じです。
14行目の関数の宣言については、同じプログラムの中で同じ名前の関数が存在していてはいけないので、myFunction1 と数字が追加されています。
16行目
spreadsheet.getCurrentCell().setValue('1');
ここが「絶対参照を使用」と「相対参照を使用」で記録されたマクロの大きな違いの一つ目です。
「絶対参照を使用」のマクロでは、5行目のプログラムのようにまずアクティブセルを指定するプログラムが記述されていましたが、「相対参照を使用」ではそれがありません。
マクロの中でアクティブセルを指定することなく、入力された操作がはじまるのです。このマクロの場合では、
「1」を入力
に相当する処理が行われ、アクティブセルに ’1’ を入力しています。
17行目
spreadsheet.getCurrentCell().offset(1, 1).activate();
17行目では
意図して行った操作ではなく、入力した操作によって行われた「→ 入力すると、カーソルは A2 に移動」が「カーソルを下に移動」と処理
「→」を押してカーソルを移動
が処理されています。
spreadsheet.getCurrentCell() までは「絶対参照を使用」と同じですが、今回は offset(1, 1) と offset() というメソッドが使われています。
これは、
というもので、offset() の 1つ目の引数(パラメータ)に縦方向(行方向)の移動量、2つ目の引数に横方向(列方向)の移動量、を指定することで、その移動先のセルを取得しています。
今回の場合、入力されたことでカーソルが下に 1つ移動し、「→」が押されたことで左に 1つ移動しているので、offset(1, 1) となっています。
そして、その移動先のセルを activate() して、カーソル位置を変更しています。
18 ~ 19行目
spreadsheet.getCurrentCell().setValue('2');
spreadsheet.getCurrentCell().offset(1, 1).activate();
18行目では「→ カーソルは B2」ということを意識せずに、
「2」を入力
を行っています。
続く 19行目では、
意図して行った操作ではなく、入力した操作によって行われた「→ 入力すると、カーソルは B3 に移動」が「カーソルを下に移動」と処理
「→」を押してカーソルを移動
が処理されています。
20 ~ 21行目
spreadsheet.getCurrentCell().setValue('3');
spreadsheet.getCurrentCell().offset(1, 0).activate();
20行目では、「→ カーソルは C3」を意識せずに、
「3」を入力
を行っています。
続く 21行目では、
意図して行った操作ではなく、入力した操作によって行われた「→ 入力すると、カーソルは C4 に移動」が「カーソルを下に移動」と処理
が処理されています。
17行目・19行目と違って、入力されたことでカーソルが下に 1つ移動しているだけなので、offset(1, 0) となっています。
22行目
};
22行目は、14行目の行末にある { に対応した、ブロックの終わりを示す } になります。
マクロを実行してみる
記録されたマクロを実行してみましょう。
このまま実行しても変化がわからないので、
いくつかのセルに入力されている内容をクリア
セル C6 をクリック
※マクロを記録したときとは違って、A1 にカーソルがない「Ctrl」+「Alt」+「Shift」+「2」を押す
と操作すると、マクロが実行されます。
前回は「承認が必要」ダイアログが表示されましたが、前回のマクロを実行したときに確認されているので、マクロが追加されてもプログラムの内容にに変更(プログラムが使用する命令の種類が変わらなければ大丈夫)がなければ、確認されずに実行されます。
実行した結果は、下図のようになるはずです。
マクロを実行したときにカーソルのあった C6 を基準にして、そこから以下のような操作が行われたのです。結果として、カーソルは E9 に移動します。
「1」を入力
→ 入力すると、カーソルはA2下に移動「→」を押してカーソルを移動
→ カーソルは B2「2」を入力
→ 入力すると、カーソルはB3下に移動「→」を押してカーソルを移動
→ カーソルは C3「3」を入力
→ 入力すると、カーソルはC4下に移動
この状態でもう一度、「Ctrl」+「Alt」+「Shift」+「2」を押すと、E9 を基準にして、マクロが実行されます。
このように、「相対参照を使用」で記録されたマクロは、カーソルのあるセル(アクティブセル)を基準にして、どのように操作をするのかを記録しています。
まとめ
「絶対参照を使用」と「相対参照を使用」の違いが理解できましたか?
また、Google スプレッドシートのマクロが GAS のプログラムとして、記録されていることが理解できたでしょうか?
自分で GAS のプログラムを作成するというのは、マクロを記録したときに作成されたプログラムを自分で記述するようなものです。
何をしたいのかが明確になっていれば、この 2回の記事で説明したように、順番に処理を記述していくだけでプログラムになります。
怖がらずに、試してみましょう!