6回目:エラーの対処方法

更新日:2023/9/7 [投稿日:2023/6/11]

全6回で勉強するプログラミング、最終回です。プログラミングをする上で知っておきたいエラーの対処法を紹介します。また、総括して1つプログラムを作ります。

エラーとは

ここでは、プログラムエラーについてお話します。エラーが起こると最悪の場合、プログラムが中断するか終了してしまいます。例えばクレジットカードの決済画面で急にプログラムが終了してしまったらどうなるでしょうか?これは重大な問題です。

エラーのないプログラム

テストの段階でエラーは潰してます。しかし、100%エラーがないというプログラムはありません。どこかに抜け穴があってそれが思わぬところで出てきます。

エラーの起こる原因

エラーが発生してプログラムが異常終了すると、どこでエラーが起こったのか調べるところから始まります。エラーが起きた段階でプログラムのどこに不具合が起こったのかすぐに分かるのが理想ですが、実はどのコードがエラーになったのかすぐに分からないのが実情です。経験から変数に思わぬ値が設定されていたときにエラーがよく出ていたと感じます。テスト時に使用したデータは想定内ですが実データには想定外のデータが含まれることが多くあります。エラーの原因を究明するのが、プログラムを書くよりも実は大変な作業になります。

エラーを捕まえる

エラーが発生したら、その原因をつきとめすぐに対処できることが理想です。そこでエラーが起こったというイベントを捕らえてなんらかの処理(エラーメッセージを表示するなど)をする機能がプログラム言語にあります。(ないプログラミング言語もあるかもしれませんが、そこら辺は分かりません。)

この処理を「エラーをトラップする」と呼びます。VBA(VBも)ではOn Error ~という命令を使います。プログラム中では次のように書きます。一連の流れを見てみましょう。

Sub ErrorTrap()
Dim intA As Integer
Dim intB As Integer
Dim intC As Integer

On Error GoTo Errlbl  ‘エラー発生時[Errlbl]へ飛ぶと宣言する

  intA = 5
  intB = 0
  intC = intA / intB

  MsgBox “intA÷intB=” & intC & “です。”

Exit Sub  ‘Subを抜ける(正常時ここで終了。次の文は実行されない)

Errlbl:  ‘エラー発生時、この行に飛ぶ

  Stop  ‘実行をストップする命令
  Resume  ‘エラーが起こった箇所へ戻る命令

End Sub

このプログラムは0で除算してエラーが発生します。エラーが発生すると「Errlbl」(任意の名前で自由に名前を付けることができます。)にジャンプして、「Errlbl」以降の命令を実行していきます。

プログラムを実行してみましょう。Stopでプログラムが中断しているはずです。「F8」キーを2回押してください。すると、エラーを発生させた命令にジャンプします。

※もし、Stopで止まらない場合、メニューの「ツール」-「オプション」-「全般」タブで、”エラー処理対象外のエラーで中断”を選択してください。

※「F8」キーはプログラムを1行ずつ実行させます(ステップイン実行)。プログラミングでは”デバッグ”などと呼んでますが、開発環境によって方法がまったく異なります。エクセルVBAのデバッグについては別の機会で紹介します。

エラーを処理する

上記の”Resume”はプログラミングの段階でエラーを見つけるためのものです。本番でこのように書いてしまうと永遠にSubから抜けられないプログラムになってしまいます。上記のプログラムは次のように書くことができます。

Errlbl:
MsgBox “ErrorTrap エラーが発生しました。システム管理者に次のメッセージをお知らせください。” & Err.Description

ユーザーにエラー内容を表示してプログラムを終了させます。ただ、上記のErrorTrap プロブラムでエラーが発生したことが分かりますが、どの行なのかはわかりません。

「Err.Description」という命令がエラー内容を書き出してくれます。ここでは詳しくは説明しませんが、このように書くだけでエラー内容が分かります。

総括:プログラムを書く

第3回でBMI計算関数、第4回の問題でBMI判断関数を作りました。今回はこれらの関数にエラー処理を加えてBMIを計算するプログラムを完成させたいと思います。

全体の流れ

次のような手順でプログラムを完成させていきます。

  1. BMI計算関数にエラー処理を追加
  2. BMI判断関数にエラー処理を追加
  3. BMI計算関数とBMI判断関数を呼び出すメインのプログラム(aMain())を新規作成

早速作り始めます。

BMI計算関数にエラー処理を追加

次のようにエラー処理を追加します。太字が追加部分です。

Function BMI計算(dbl体重 As Double, dbl身長 As Double) As Double
Dim dblRet As Double

On Error GoTo Errlbl

dblRet = dbl体重 / (dbl身長 * dbl身長)
BMI計算 = dblRet

Exit Function

Errlbl:
  Stop
  Resume
End Function

上記のエラー処理で説明したとおり、エラーが発生するとErrlblまでジャンプしてStopで止まる仕組みになってます。

BMI判断関数にエラー処理を追加

同様にエラー処理を追加します。太字が追加部分です。

Function BMI判断(dblBMI As Double) As String
Dim strBMI As String

On Error GoTo Errlbl

If dblBMI < 18.5 Then
  strBMI = “低体重”
ElseIf dblBMI >= 18.5 And dblBMI < 25 Then
  strBMI = “普通体重”
ElseIf dblBMI >= 25 And dblBMI < 30 Then
  strBMI = “肥満1度”
ElseIf dblBMI >= 30 And dblBMI < 35 Then
  strBMI = “肥満2度”
ElseIf dblBMI >= 35 And dblBMI < 40 Then
  strBMI = “肥満3度”
ElseIf dblBMI >= 40 Then
  strBMI = “肥満4度”
Else
  strBMI = “”
End If

BMI判断 = strBMI
Exit Function

Errlbl:
  Stop
  Resume
End Function

BMI計算関数とBMI判断関数を呼び出すメインのプログラム(aMain())を新規作成

続いてメインのプログラムaMainを作ります。「第3回:関数」では、”体重57.5、身長1.58”という固定の数値を使ってましたが、今回は任意の数値を使えるようにInputBox関数というVBAの関数を使いたいと思います。

InputBox関数

InputBox関数はMsgBox関数のように小さなウインドウにメッセージを表示させ、さらに入力できる関数です。必須の引数はメッセージ(Prompt)のみです。例えば、「体重を入力してください。」というメッセージを表示させます。戻り値は文字列です。次のような書き方をします。

d体重 = InputBox(“体重(Kg)を入力してください。”)

d体重には入力された文字が代入されます。もし、d体重が数値型の変数の場合、自動的に数値に変換されて代入されます。ただし、文字が入力されると変数d体重には文字が入らないのでエラーが発生します。今回は全体を知るために、まずは、必ず数値を入力するという前提のもとでこのようにプログラムを作ります。

続いてaMainを作ります。

aMainプロシージャー

Sub aMain()
Dim d体重 As Double
Dim d身長 As Double
Dim dBMI As Double
Dim sBMI As String
On Error GoTo Errlbl

d体重 = InputBox(“体重(Kg)を入力してください。”)
d身長 = InputBox(“身長(m)を入力してください。”)

dBMI = BMI計算(d体重, d身長)
sBMI = BMI判断(dBMI)

MsgBox “体重” & d体重 & ” 身長” & d身長 & vbCrLf & _
  ”BMIは” & dBMI & vbCrLf & _
  ”あなたは” & sBMI & “です。”

Exit Sub

Errlbl:
  Stop
  Resume
End Sub

最後のMsgBoxの引数に見慣れない文字があるので、説明しますと、

&は文字列(””の間に挟まれた文字)や数値を繋ぎます。 vbCrLf は、文字列を改行するための文字です。 _(半角のアンダーバー)はプログラムを複数行に分けて書くときに使います。プログラムは _があると次に続く文も同じ行のものだと認識します。&の後に半角スペースが必要です。

まずは、上記と同じように書いて実行してみましょう。インプットボックスが2回表示され、体重と、身長を入力。その後、BMI数値とその判断結果が表示されるはずです。

もし、エラーが表示される場合は、タイプミスがどこかにあるはずです。一文字一文字よく確認しましょう。尚、VBは大文字と小文字は同じだと判断します。

何度もよく見ていくうちに慣れてきてエラーの個所も直ぐに分かるようになってきます。数をこなしていきましょう。

最終回は一連のプログラムがスムーズに実行できるところで終了です。うまく実行できたでしょうか?実はaMainプロシージャーで、2点ほど処理を変えたいところがあります。もし余力があればチャレンジしてみてください。

  • Inputboxで入力値が文字列の場合エラーになります。そこで、d体重(double型)ではなく、s体重(string型)の変数に一旦格納して、数値かどうかの確認を行い数値の場合のみ次の処理に進むように変更。数値でない場合はプログラムを終了してもよいが、実用的にするなら、数値が入力されるか、キャンセルされるまで、入力を促す(この場合はIF文とループ文を使用)。
  • BMI計算の結果で、小数点以下が長いので、メッセージを表示するときに小数点第1まで表示させる。

プログラミング:次のステップ

次のステップとしては、どれかプログラミング言語を選択して、その言語特有の規則を学習したのちに、もっと実用的なプログラムを書いていくことが近道です。

プログラムは次から次へと新しい概念が誕生し、追いついていくのが大変です。勉強に終わりはありません。仕事をしながら徐々に力をつけていくことをお勧めします。