社内であまりこれを使っている人がいないので、投稿してみた。
ちなみにもっと詳しく、わかりやすく解説した記事や動画がネットにはあると思うので、そちらも参照されたい。
メリットとデメリット
以下の悩みが解消される。
-
vlookupなどでセル範囲を記述し、下に引っ張ってコピペしたら範囲がきれいにズレた - そのために絶対参照(
$A$1:$C$100とか)に書き換えた - でもあとで対象範囲が増減してすべての関数を書き直さないといけない→スタイルも調整する羽目になった
どんな人に有用か?
- プログラマーじゃないけどVBAやApp Scriptなどで仕事の効率を図っている人
- もちろんプログラマーに有用
これを覚えると範囲が変わるごとにプログラムを修正する必要がなくなる。
デメリットは、名前の管理と命名センスが若干必要とされるぐらい。
例えば、range1, range2, range3...といった命名をしていると後々辛くなるので、それをするぐらいなら、shain_list, kyuujitsu, kakakuhyoなどとしておいた方がまだわかりやすいというところだろうか。
プログラマー視点では、このあたりは変数名や関数名、クラス名の命名センスと同じである。
方法
やり方は簡単で範囲選択をして、左上のセル番地が表示される場所に名前をつけるだけ。
名前はワークブック内で一意となっており、確か日本語も使えたはず。
範囲と名前はそれぞれ以下で修正ができる。
プログラミング視点
ここでは例としてGoogle App Scriptを使ってみる。
以下がサンプルコード。
function getHolidays() {
var holidays = {};
var sheet = SpreadsheetApp.getActiveSpreadsheet();
// セル番地で範囲指定
//var values = sheet.getRange('A2:B38').getValues();
// 名前付き範囲を指定
var values = sheet.getRangeByName('holidays').getValues();
Logger.log(values);
for (var i = 0, len = values.length; i < len; i++) {
var date = Utilities.formatDate(values[i][0], 'Asia/Tokyo', 'yyyy-MM-dd');
holidays[date] = values[i][1];
}
Logger.log(holidays);
return holidays;
}
セル番地を指定すると、範囲が変わるたびにコードを書き換えないといけなくなる。
しかし、名前付き範囲なら、アプリ側で範囲を変更するだけになるため保守性が格段に上がる。
例えばスクリプトのメンテナンスをプログラマーがしている場合は、非プログラマーに範囲の修正を任せることができるし、Claspなどでコード管理をしている場合は、範囲が変わるたびにスクリプトのビルド、デプロイをしなくていい。
プログラム的に言えば、範囲に変数名をつけている感覚なので、かなりメンテナンス性が上がるはず。
更にいうと、1つのセルに対しても名前をつけておくと、値をセットするときに非常にいいのだ。
名前だけ固定しておけば、セルの位置はどこに移動させてもOKということなので。
function setResult() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
//sheet.getRange('H1').setValue('Set by cell');
sheet.getRangeByName('result').setValue('Set by named range');
}
APIドキュメントなどの参考リンク
-
Spreadsheet.getRangeByName -
ExcelScript.Worksheet.getRange -
\PhpOffice\PhpSpreadsheet\Spreadsheet\getNamedRange



