【COBOLのEVALUATE文】多岐分岐の基本と使い方を初心者向けに解説

2025年4月9日水曜日

COBOL

 


もし、あなたが「IF文がどんどん重なって、もうワケワカメ…」なんて頭を抱えているなら、まさにこの記事は運命の出会いかもしれません!

COBOLには、そんな複雑になりがちな条件分岐を、まるで魔法のようにスッキリ整理してくれる「EVALUATE(エバリュエート)文」という頼もしい味方がいるんです。

この記事では、COBOL初心者さんに向けて、EVALUATE文の世界をやさしく、そして楽しく解説していきます。

読み終わる頃には、「なるほど、EVALUATE文って便利じゃん!」ってきっと思ってもらえるはず。

この記事で、あなたはこんなことができるようになりますよ。

  • EVALUATE文がどんなものか、サクッと理解できる!
  • EVALUATE文の基本的な書き方ルールをマスターできる!
  • 実際のコード例を見て、使い方を具体的にイメージできる!
  • IF文とどっちを使うべきか、迷わなくなる!

「COBOLのEVALUATE文」多岐分岐とは何か?IF文との違い

さて、さっそく「EVALUATE文」とは何者なのか、その正体に迫ってみましょう!

簡単に言うと、EVALUATE文は「たくさんの選択肢の中から、条件に合ったものを一つだけ選んで実行する」ためのCOBOLの命令です。

例えば、「もし信号が青なら進む、黄なら注意、赤なら止まる」みたいな、複数の条件で処理を分けたいときに大活躍します。これを「多岐分岐(たきぶんき)」と呼んだりしますね。

「あれ?それってIF文をたくさん重ねてもできるんじゃない?」と思ったあなた、鋭い!
確かに、IF文をネスト(入れ子に)すれば、同じようなことは実現可能です。
でも、条件が増えてくると、IF文のネストはこんな感じになりがち…

IF 条件A THEN
処理A
ELSE
IF 条件B THEN
処理B
ELSE
IF 条件C THEN
処理C
ELSE
処理D
END-IF
END-IF
END-IF

うーん、ちょっと見た目がゴチャゴチャして、どこで何をしているのか分かりにくいですよね?
一方、EVALUATE文を使うと、もっとスッキリ書けるんです!

EVALUATE 対象
WHEN 条件A
処理A
WHEN 条件B
処理B
WHEN 条件C
処理C
WHEN OTHER
処理D
END-EVALUATE

どうでしょう? まるで箇条書きみたいで、どの条件でどの処理をするのか、一目で分かりやすいと思いませんか?

これがEVALUATE文の大きなメリット、「コードの見た目がスッキリして、読みやすくなる」点なんです。

「COBOLのEVALUATE文」多岐分岐の基本的な書き方(構文)

EVALUATE文の魅力が分かったところで、次は具体的な書き方のルール、つまり「構文」を見ていきましょう。

基本の形はこんな感じです。

EVALUATE 評価したいもの
WHEN 条件1
条件1に一致した場合の処理
WHEN 条件2
条件2に一致した場合の処理
WHEN 条件3
条件3に一致した場合の処理
...
WHEN OTHER
どの条件にも一致しなかった場合の処理
END-EVALUATE

それぞれのキーワードには、こんな意味があります。

  • EVALUATE
    • 「これから条件判断を始めますよー!」の合図。後ろに、何を基準に判断するか(評価対象)を書きます。
  • WHEN
    • 「もし〇〇だったら~」の「もし」の部分。ここに具体的な条件を書きます。WHENはいくつでも並べられます。
  • 処理
    • 各WHENの後には、その条件が成り立った時に実行したいプログラムの命令を書きます。
  • WHEN OTHER
    • 「どのWHENの条件にも当てはまらなかったら~」という場合の処理を書きます。これは省略することも可能です。
  • END-EVALUATE
    • 「EVALUATE文はここまでですよー」の終わりの合図。これを忘れるとエラーになるので注意が必要です。

基本の骨格はこれだけ!思ったよりシンプルでしょう?
次に、それぞれの部分をもう少し詳しく見ていきますね。

EVALUATEの対象指定

EVALUATEの後ろには、「何を基準に条件を判断するか」を指定します。
ここには、いくつかのパターンがあります。

  • 変数を指定する
    • EVALUATE WS-CODE のように、データ項目(変数)を指定します。この場合、WHEN句ではこの変数の値が何かをチェックします。一番よく使われるパターンかもしれません。
  • 式を指定する
    • EVALUATE WS-A + WS-B のように、計算式を指定することも可能です。WHEN句では、この計算結果の値が何かをチェックします。
  • TRUEを指定する
    • EVALUATE TRUE という、ちょっと面白い指定方法もあります。これは、「常に真(TRUE)」を評価対象にする、という意味です。この場合、WHEN句にはそれぞれ独立した条件式(例:WHEN WS-A > 10)を書くことになります。EVALUATE TRUEは柔軟な条件設定が可能です。まるで、IF, ELSE IF, ELSE... を並べるような感覚で使えますよ。

どのパターンを使うかは、実現したい処理によって使い分けるのがコツです。

WHEN句の書き方:条件を指定する

WHENの後には、具体的な条件を記述します。
ここにもいくつか書き方がありますよ。

  • 特定の値と一致するかチェック
    • WHEN 1 や WHEN "A" のように、特定の値や文字列リテラルを書きます。EVALUATEで指定した対象が、この値とピッタリ一致するかどうかを見ます。
  • 複数の値をまとめてチェック (OR条件)
    • WHEN 1 ALSO 3 ALSO 5 のように、ALSOで繋げると、「1または3または5のどれかだったら」という意味になります。便利ですね!
  • 範囲を指定してチェック
    • WHEN 1 THRU 10 のように、THRUを使うと、「1から10までの範囲だったら」という意味になります。点数に応じて成績をつける時なんかに役立ちます。THRUを使うと範囲指定が楽になります
  • 条件式を書く (EVALUATE TRUEの場合)
    • EVALUATE TRUE を使った場合は、WHEN WS-A > 10 AND WS-B = "X" のように、比較演算子(>, <, = など)や論理演算子(AND, OR)を使った条件式を直接書きます。

これらの書き方を組み合わせることで、色々な条件分岐を実現できます。

WHEN OTHER句:どの条件にも当てはまらなかった場合

さて、最後に紹介するのがWHEN OTHER句です。
これは、一連のWHEN句で指定したどの条件にも、評価対象が当てはまらなかった場合に実行される処理を書く場所です。

いわば、「その他の場合」を一手に引き受ける、縁の下の力持ち的な存在ですね。
例えば、エラー処理やデフォルトの処理を記述するのによく使われます。

このWHEN OTHER句は、必ずしも書かなければいけないわけではありません。省略することも可能です。
ただし、想定外の値が入ってきたときに何も処理されない、という事態を防ぐために、予期せぬデータへの備えとしてWHEN OTHERは有効です。書いておくと、より安全なプログラムになることが多いですよ。

もしWHEN OTHERを書く場合は、必ずEND-EVALUATEの直前に、ひとつだけ記述します。

「COBOLのEVALUATE文」多岐分岐の使い方(サンプルコードと解説)

理屈がわかってきたところで、いよいよ実践です!

EVALUATE文を使った簡単なサンプルプログラムをいくつか見て、使い方に慣れていきましょう。

ぜひ、お手元の環境で実際に動かしてみてくださいね。

サンプル1:数値コードによる処理分岐

まずは、一番シンプルな例から。
部署コード(1:人事部, 2:営業部, 3:開発部)に応じて、部署名を表示するプログラムです。

IDENTIFICATION DIVISION.
PROGRAM-ID. EVALUATE-SAMPLE1.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DEPT-CODE PIC 9(1).
88 DEPT-JINJI VALUE 1.
88 DEPT-EIGYO VALUE 2.
88 DEPT-KAIHATSU VALUE 3.
01 WS-DEPT-NAME PIC X(10).

PROCEDURE DIVISION.
MAIN-PROC.
MOVE 2 TO WS-DEPT-CODE. *> ここで部署コードを設定 (今回は2:営業部)

EVALUATE WS-DEPT-CODE
WHEN DEPT-JINJI      *> コードが1 (人事部) なら
MOVE "人事部" TO WS-DEPT-NAME
WHEN DEPT-EIGYO      *> コードが2 (営業部) なら
MOVE "営業部" TO WS-DEPT-NAME
WHEN DEPT-KAIHATSU    *> コードが3 (開発部) なら
MOVE "開発部" TO WS-DEPT-NAME
WHEN OTHER           *> 上記以外なら
MOVE "不明な部署" TO WS-DEPT-NAME
END-EVALUATE.

DISPLAY "部署コード: " WS-DEPT-CODE.
DISPLAY "部署名  : " WS-DEPT-NAME.

STOP RUN.

【解説】
EVALUATE WS-DEPT-CODEで、変数WS-DEPT-CODEの値を評価対象にしています。
WHEN句では、88レベルで定義した条件名(DEPT-JINJIなど)を使っています。こうすると、WHEN 1と書くよりも意味が分かりやすくなりますね。
今回はWS-DEPT-CODEに2を入れているので、WHEN DEPT-EIGYOの処理が実行され、WS-DEPT-NAMEに「営業部」がセットされます。
特定のコードで処理を分ける基本パターンです

【実行結果】

部署コード: 2
部署名  : 営業部

サンプル2:成績評価(範囲指定THRUの活用)

次は、テストの点数に応じて成績(優・良・可・不可)を表示するプログラムです。
ここではTHRUを使った範囲指定が登場しますよ。

IDENTIFICATION DIVISION.
PROGRAM-ID. EVALUATE-SAMPLE2.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-SCORE PIC 9(3).
01 WS-GRADE PIC X(4).

PROCEDURE DIVISION.
MAIN-PROC.
MOVE 75 TO WS-SCORE. *> ここで点数を設定 (今回は75点)

EVALUATE WS-SCORE
WHEN 90 THRU 100  *> 90点から100点なら
MOVE "優" TO WS-GRADE
WHEN 80 THRU 89   *> 80点から89点なら
MOVE "良" TO WS-GRADE
WHEN 60 THRU 79   *> 60点から79点なら
MOVE "可" TO WS-GRADE
WHEN OTHER        *> それ以外 (0点から59点) なら
MOVE "不可" TO WS-GRADE
END-EVALUATE.

DISPLAY "点数: " WS-SCORE.
DISPLAY "成績: " WS-GRADE.

STOP RUN.

【解説】
EVALUATE WS-SCOREで点数を評価しています。
WHEN 90 THRU 100のように、THRUを使うことで「90点以上かつ100点以下」という範囲を簡単に指定できます。IF文で書くと IF WS-SCORE >= 90 AND WS-SCORE <= 100 のようになりますが、EVALUATE文の方がスッキリしますね。
今回はWS-SCOREに75を入れているので、WHEN 60 THRU 79の条件に一致し、「可」が表示されます。
THRUの実践的な使い方がわかります

【実行結果】

点数: 075
成績: 可

サンプル3:EVALUATE TRUEを使った複数条件の評価

最後に、EVALUATE TRUEを使った例を見てみましょう。
注文の種類('A'か'B'か)と、注文数(100以上か未満か)によって処理を変えるプログラムです。

IDENTIFICATION DIVISION.
PROGRAM-ID. EVALUATE-SAMPLE3.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-ORDER-TYPE PIC X(1).
01 WS-ORDER-QTY  PIC 9(3).
01 WS-MESSAGE    PIC X(30).

PROCEDURE DIVISION.
MAIN-PROC.
MOVE "A" TO WS-ORDER-TYPE.
MOVE 120 TO WS-ORDER-QTY. *> 今回はタイプA、数量120

EVALUATE TRUE *> 条件式自体を評価する
WHEN WS-ORDER-TYPE = "A" AND WS-ORDER-QTY >= 100
MOVE "タイプA:大口注文です" TO WS-MESSAGE
WHEN WS-ORDER-TYPE = "A" AND WS-ORDER-QTY < 100
MOVE "タイプA:通常注文です" TO WS-MESSAGE
WHEN WS-ORDER-TYPE = "B"
MOVE "タイプB:特別注文です" TO WS-MESSAGE
WHEN OTHER
MOVE "不正な注文タイプです" TO WS-MESSAGE
END-EVALUATE.

DISPLAY "注文タイプ: " WS-ORDER-TYPE.
DISPLAY "注文数  : " WS-ORDER-QTY.
DISPLAY "メッセージ: " WS-MESSAGE.

STOP RUN.

【解説】
EVALUATE TRUEと書くことで、「これからWHEN句に書く条件式を順番にチェックして、最初にTRUE(真)になったものを選びますよ」という意味になります。
各WHEN句には、WS-ORDER-TYPE = "A" AND WS-ORDER-QTY >= 100のような独立した条件式を書けます。
今回はタイプA、数量120なので、最初のWHENの条件が真となり、「タイプA:大口注文です」が表示されます。
IF文のIF... ELSE IF... ELSE...の構造に似ていますが、複雑な条件分岐もこれでスッキリします

【実行結果】

注文タイプ: A
注文数  : 120
メッセージ: タイプA:大口注文です 

「COBOLのEVALUATE文」多岐分岐を使う上での注意点

EVALUATE文、便利ですよね! でも、使う上でちょっとだけ気をつけておきたいポイントもあります。
より良いコードを書くために、以下の点を頭の片隅に置いておきましょう。

IF文との使い分けを意識する

EVALUATE文は多岐分岐に強いですが、どんな時でもEVALUATE文がベストとは限りません。
IF文の方が適している場面もあります。

じゃあ、どう使い分けるのがいいのでしょう?
明確なルールはありませんが、一般的にはこんな風に考えると良いかもしれません。

  • EVALUATE文が向いているケース
    • 3つ以上の選択肢がある場合
    • 1つの変数や式の値によって分岐する場合 (例: コードの値、点数の範囲)
    • 条件が比較的シンプルで、一覧性が求められる場合
  • IF文が向いているケース
    • 単純な2択の分岐 (IF ... ELSE ... END-IF)
    • それぞれの条件が全く独立していて、EVALUATE TRUEを使うと逆に複雑になりそうな場合
    • 非常に複雑な条件式が少数だけある場合

結局のところ、「どちらがより読みやすく、理解しやすいか」という観点で選ぶのが一番です。
絶対的な正解を求めすぎず、状況に応じて最適な方を選びましょう。プログラムは自分だけでなく、他の人が読む(保守する)可能性も常にありますからね!

また、EVALUATE文のWHEN句に書く処理があまりにも長くなる場合は、PERFORM文で別の段落に処理をまとめる(サブルーチン化する)と、さらにコードがスッキリして見通しが良くなりますよ。

【まとめ】COBOLのEVALUATE文をマスターして分かりやすいコードを!

お疲れ様でした!今回はCOBOLの頼れる助っ人、「EVALUATE文」について探検してきました。

ポイントを振り返ってみましょう。

  • EVALUATE文は、たくさんの条件で処理を分ける「多岐分岐」に便利な命令です。
  • IF文のネストよりも、コードがスッキリして読みやすくなります。
  • 基本的な構文は EVALUATE 対象 WHEN 条件 ... END-EVALUATE です。
  • ALSOやTHRU、EVALUATE TRUEを使いこなせば、柔軟な条件指定が可能です。
  • WHEN OTHERで、どの条件にも当てはまらない場合の処理も書けます。
  • 何でもかんでもEVALUATE文ではなく、IF文との使い分けも意識しましょう。

EVALUATE文を使いこなせるようになれば、あなたの書くCOBOLプログラムは、きっと今よりもっと分かりやすく、そして保守しやすくなるはずです。

今回学んだ知識を、ぜひ実際のプログラミングで試してみてくださいね。
最初はちょっと戸惑うかもしれませんが、使っていくうちにきっと「EVALUATE文、便利!」と実感できると思います。

自信を持って、どんどんコードを書いていきましょう!

【関連記事】

>> 今さら聞けない「COBOLとは?」

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ