Excel Office スクリプト 条件分岐と論理演算子の使い方

2021年6月11日

Office スクリプトにおける条件分岐と論理演算子の基本的な使い方を紹介します。

解説

条件分岐には三つの方法があります。

条件分岐特徴
if/else条件式の結果によって異なるコードを実行。
switch変数の値によって異なるコードを実行。
三項(条件)演算子条件式の結果によって値を返却。

最低限、if/elseを使うことができれば事足りますが、

switchと三項(条件)演算子も覚えておくと便利な場面があります。

条件式と論理演算子

条件式とは結果がboolean型(trueかfalseか)になる式です。

簡単な例は次の通りです。(setValueの中の「num === 11」が条件式)

変数numが11の場合に結果がtrueになります。

演算子内容使用例trueとなる条件優先順位
(小さいほど優先)
<小なり値A < 値B値Aが値Bより小さい1
<=小なりイコール値A <= 値B値Aが値B以下1
>大なり値A > 値B値Aが値Bより大きい1
>=大なりイコール値A >= 値B値Aが値B以上1
==等価値A == 値B値Aと値Bが等しい2
!=不等価値A != 値B値Aと値Bが異なる(等価の逆)2
===厳密等価値A === 値B値Aと値Bが等しい2
!==厳密不等価値A !== 値B値Aと値Bが異なる(等価の逆)2
&&AND(論理積)条件A && 条件B条件Aと条件Bが共にtrue3
||OR(論理和)条件A || 条件B条件Aか条件Bのどちらかがtrue4

優先度は()で囲むことによって調整可能です。(数式と同様)

AND(論理積)とOR(論理和)

ANDとORは条件(trueかfalse)を比較します。(boolean型変数でも可)

他の比較演算子はnumber型などの値の比較です。

例えば 次のような式であると、

変数AとBの両方が10未満の場合のみtrueになります。

変数A < 10 && 変数B < 10

次のような式であると、

変数AとBのどちらかが10未満の場合にtrueになります。

変数A < 10 || 変数B < 10

等価(不等価)と厳密等価(厳密不等価)

厳密等価(不等価)ではデータ型なども意識して、より厳密な比較が行われます。

OfficeScriptでは差が出るケースは少ないのですが、(null比較など)

厳密な比較の方が安全なため、===と!==を中心に利用しましょう。

if/elseによる条件分岐

最も基本的な条件分岐がif/elseです。これには様々な利用パターンがあります。

特定の条件を満たす場合のみ(if)

ifのみ記述すると特定の条件を満たす場合のみの分岐になります。


  if (条件式) {
    条件式がtrueの場合の処理
  }

特定の条件を満たす場合(if)と満たさない場合(else)

  if (条件式) {
    条件式がtrueの場合の処理
  }else{
    条件式がfalseの場合の処理
  }

ifの処理がなく、elseに該当する処理しかない場合は

まず条件式を見直してifだけにすることを検討します。

(a <= 10のelseの場合は、ifをa>10に変えるなど)

boolean型変数の場合は 変数a === false や !変数a とするとifだけで実現できます。

このifは複数記述可能です。(その場合、else ifとなりelseのみは最後の一つのみ可能)

  if (条件式A) {
    条件式Aがtrueの場合の処理
  }else if (条件式B) {
    条件式Aがfalseで条件式Bがtrueの場合の処理
  }else if (条件式C) {
    条件式AとBがともにfalseで、条件式Cがtrueの場合の処理
  }else{
    条件式A・B・Cがすべてfalseの場合の処理
  }

条件のネスト(入れ子)

ifの下にifを何段階でも入れることが可能です。

  if (条件式A) {
    if (条件式B) {
      条件式AとBがともにtrueの場合の処理
    }

    if (条件式C) {
      条件式AとCがともにtrueの場合の処理(この場合、条件式Bのifの中で処理の終了などをしていなければ条件式Bは無関係。)
    }
  }

ただし階層が深くなりすぎると読みにくくなってしまいます。

ネストよりもAND(論理積)とOR(論理和)の方が効率的な場面もあるため

3段階より多くなるようであれば、AND(論理積)とOR(論理和)や

ファンクションを利用してネストを避けることを検討しましょう。

前述のifは次のコードと同じ動きをします。どちらがよいかはケースバイケースです。

  if (条件式A && 条件式B) {
      条件式AとBがともにtrueの場合の処理
 }

  if (条件式A && 条件式C) {
      条件式AとCがともにtrueの場合の処理(この場合、前のifの中で処理の終了などをしていなければ条件式Bは無関係)
 }

switchによる条件分岐

値の一致が複数ある場合はswitchが適しています。

ifがあればswitchが必ずしも必要というわけではありませんが、

押されたボタンによって処理を変えるような、

単純な比較が複数あるケースではifよりswitchが適しています。

switch (変数) {
  case 値1:
    値1と一致した場合の処理
    break;
  case 値2:
    値2と一致した場合の処理
    break;
  case 値3:
    値3と一致した場合の処理
    break;
  default:
    どの値とも一致しなかった場合の処理
}

ifで記述すると次のようになります。

こういったケースでは後から読んで把握しやすいのはswicthの方です。

breakがない場合

breakがない場合、caseで止まらずに継続して実行します。

次の例ではCancelのcaseからdefaultまですべて実行されます。

頻度は非常に少ないですが、OR(論理和)のような動きのために

あえてbreakを外すケースもあります。(その場合、ifの方が無難ですが)

三項(条件)演算子による条件分岐

ifはコードを条件式の結果に応じて処理を実行しますが、

三項(条件)演算子は値を返すのみ、次のように記述します。

条件式 ? 条件式がtrueの場合の値 : 条件式がfalseの場合の値

使いどころを間違えるとわかりづらくなるため

忘れてしまってもよいですが、(他人が使った場合を除き)

以下のようなケースでは効果的です。(特にifのネストが進んでいる場合)

値の代入

変数の値によって代入する値が変わるようなケースでは有効な場合があります。

0で割る可能性のある割り算

割り算で分母が変数の場合、その変数が0となる可能性があります。

(ゼロ割と呼ばれることがあります)

0で割ってしまうとInfinityという特殊な結果になり、

その後の処理に不都合がある場合があります。(Infinityをセルに設定すると空白)

こういったケースに対処するのに有効です。

変数宣言と範囲(スコープ)

letで宣言した変数は{}で囲まれた範囲(ブロック)と、

より下層のブロックでのみ利用可能です。

ifやswitchのブロックで宣言した変数はループの外ではアクセスできません。

次の例ではifOutValueは11行目でも利用できますが、

ifInValueは12行目では利用できません。

ブロックでのみ使う変数はブロック内で宣言しましょう。

その方が他の人が読んだとき構造を把握しやすくなります。

(ブロックの外では使われない変数とわかるため)

ブロックを出た後、ブロック内変数と同名の変数を宣言できますが、

非常にややこしくなるため非推奨です。

varで変数宣言(非推奨)

変数の宣言はletでなくvarという記述でも可能です。

varではブロック内で宣言した変数をブロックの外でもアクセス可能ですが、

この特性はプログラムを作る段階では便利ですが、後から読む場合には有害です。

JavaScriptに慣れている人はvarを使ってしまいがちなため記述しますが

(古いブラウザでletが使えなかったりしたため)

varは使わずにletで宣言しましょう。

次の記事

ループ(繰り返し処理)

関連記事

Excel Office スクリプトの記事一覧