条件分岐の落とし穴。入力データを信用するなElseでエラー処理を!

当ページのリンクには広告が含まれています。

同僚にブログをやっていると口を滑らせた中野君。それがボスに伝わり「ブログをやっているなら,PCが得意」と認識された中野君は,その日から事実上のひとり情シスに……。ある日,経理の早稲田さんより,新設された浦和営業所の売り上げが取れないと連絡が入ります。

売り上げデータを集計するマクロを使用しているとのことですが,そのマクロを作成した元経理部長の神楽さんは数年前に定年退職しています。その後、不具合があったときは高田先輩が面倒を見ていたとのこと。しかし,高田先輩が在籍していたころは浦和営業所は存在しません。存在しない事業所を取り込めばエラーが発生しそうでうが,売り上げデータを取り込んでもエラーは発生しないと早稲田さんは言っています。

目次

EUCのメリットとデメリット

今回も架空のお話ですが,EUC(End User Computing)の問題点の一例となります。EUCとは,業務部門のエンドユーザーが業務で使用するシステムを構築すること。EUCの最大のメリットは,業務部門のエンドユーザー,つまり業務をよく理解している担当者が作成するため,日々の業務と相性の良いシステムを構築できることにあります。ExcelやAccessなどのVBAや,Lotus Notesといった比較的習得が容易なツールが使われることが多いようです。

しかし,設計書や仕様書などのドキュメントがない(あっても最新化されていない),処理が複雑で解析が困難(何がやりたいのかわからない),担当者がいなくなると管理できなくなる(放置されて野良DB化してしまう)などのデメリットもあります。また,便利だという理由で,会社非公認の出所不明のマクロが社内に広まるといった事態もおこりうります。

EUCのメリット
  • 利用者が自らの業務に沿った,かゆいところに手が届くツールを作成できる。
  • IT部門を縮小・簡素化することでコスト削減につながる。
  • 社内全体のITリテラシーが向上する。
EUCのデメリット
  • 設計書や仕様書などのドキュメントが適切に整備されていない。
  • ソースコードが混沌としていて,誰も面倒を見ることができない。
  • 引き続きが不十分なため,担当者が退職するとシステムが放置される。

売り上げが集計できない原因を探ろう

早速,中野君は早稲田さんと一緒に,浦和営業所の売り上げが集計されない原因を調査することになりました。

中野君 売り上げデータを取り込んでも,浦和営業所が集計されなけらば,エラーも発生しないんですよね。

早稲田さん そうなのよ。でもね,横浜営業所の売り上げが多すぎるので,もしかしたら浦和営業所の売り上げが横浜営業所に入っているのかも……。

中野君 このボタンを押すと集計されるんですよね。

早稲田さん そうそう。

中野君 プログラムを確認したいので,中身を見せてもらえますか。

早稲田さん ちょっと待ってね。

(中野君は,集計処理のプログラムのチェックをはじめます……)

中野君 あっ!これが原因じゃない?東京本社以外は全て横浜営業所になっている。

If (officeCd$ = "0001") Then
    officeName$ = "東京本社"
Else 
    officeName$ = "横浜営業所"
End If

早稲田さん 本当だ。じゃぁ,東京本社と横浜営業所に間に,浦和営業所を入れればいいのかな。こんな感じに変更すればいいのかしら。

If (officeCd$ = "0001") Then
    officeName$ = "東京本社"
ElseIf (officeCd$ = "0003") Then
    officeName$ = "浦和営業所"
Else 
    officeName$ = "横浜営業所"
End If

中野君 う~ん……。これだと,今回と同じように営業所が新設されたときや,営業所コードが空白のデータも横浜営業所に集計されてしまいますよ。

一見,問題無いように見えます。しかし,この処理では存在しない事業所コードや,事業所コードが空白のデータは「横浜営業所」に集計されて,しかも何事も無かったように正常終了してしまいます。

データエラーを検知しよう

早稲田さん えっ!じゃぁ,今まで,気が付かなかっただけで,存在しない事業所コードや,事業所コードが空白のデータは全て横浜営業所に集計されていたってこと?

中野君 そうでね。そうなりますね。

早稲田さん ひぇ〜。怖っ!

中野君 なので,このように変更するといいと思いますよ。

If (officeCd$ = "0001") Then
    officeName$ = "東京本社"
ElseIf (officeCd$ = "0002") Then
    officeName$ = "横浜営業所"
ElseIf (officeCd$ = "0003") Then
    officeName$ = "浦和営業所"
Else
    ' -- 存在しない事業所コードの場合はエラー処理へ
    errMsg$ = "営業所コードが不正です。"
    Goto errProc
End If

早稲田さん Elseでエラー処理するのね。

中野君 はい。Elseで想定外のデータを拾って,エラー処理するのが安全です。

早稲田さん ほう!

中野君 あと,今回のケースでは分岐の条件が単純なため,If文でなくSelect Caseを使った方がコードが読みやすくなりますよ。

Select Case officeCd$
Case "0001":
    officeName$ = "東京本社"
Case "0002":
    officeName$ = "横浜営業所"
Case "0003":
    officeName$ = "浦和営業所"
Case Else
    ' -- 存在しない事業所コードの場合はエラー処理へ
    errMsg$ = "営業所コードが不正です。"
    Goto errProc
End Select

早稲田さん そうね,こっちの方が見やすいわね。これなら,事業所が増えたとき私でも対応できるかも。中野君,ありがとう。飴ちゃんあげる💕

こうして,中野君は飴玉を貰って自席に戻りました。めでたし、めでたし。

警告終了や異常終了させることは悪いことではありません。処理に不具合が発生した場合は,エラー処理を行いましょう。不具合を隠して(不具合を無かったことにして)処理を進める方が問題です。

まとめ

今回のお話は,新たに「浦和営業所」が新設されてたため発覚した不具合ですが,本来であればElseに入ってくるデータはエラー処理しておくべきでした。今まで,気が付かなかっただけで不正なデータや不完全なデータも「横浜営業所」にカウントされていたかもしれません。想像するだけで怖いですね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次