エクセル実践塾 > エクセル実践塾2016

ユーザー定義関数で発生するエラーを無効にしたい

 

ユーザー定義関数内のエラー発生箇所を見つけて、 そのエラーを無効化する方法があります

エラーが発生する可能性がある箇所では、エラーが発生した場合に備えて特定の手段を講じることが一般的です。それに対処する方法を定義するプログラムの一部は、エラーハンドリング(Error Handling)と呼ばれます。エラーハンドリングは、プログラムを強化し、エラーが発生してもプログラムがクラッシュするのを防ぐのに役立ちます。

VBA(Visual Basic for Applications)では、On Error Resume Next ステートメントを使用してエラーハンドリングを行うことがあります。このステートメントは、エラーが発生した場合に即座に実行を停止せず、プログラムの実行を次のステートメントに進める役割を果たします。

On Error Resume Next

このステートメントの意味は、エラーが発生した場合にもプログラムを中断せずに続行し、次のコードを実行するというものです。これにより、エラーが発生してもプログラム全体が停止することなく、他の処理を続行できるようになります。

通常、VBAではエラーが発生すると実行が中断され、エラーメッセージが表示されます。しかし、On Error Resume Next を使用することで、エラーが発生しても即座に実行を停止せず、次の行に進むことができます。これは、一部のエラーが致命的でなく、プログラムの継続が望ましい場合に有用です。

次のようなユーザー定義関数 CalculateOvertime では、出社時刻と退社時刻から残業時間を計算しています。この関数では、CalculateWorkingHours 関数を使用して労働時間を取得し ていますが、エラーはこのときに空の文字列””を得ると発生します。そこで、On Error Resume Next を使って、エラーが起こったときに、改めて労働時間に0を代入するようにしています。


Function CalculateOvertime(出社時刻 As Date, 退社時刻 As Date) As Variant

 On Error Resume Next ' エラーが発生した場合でも処理を続行する

 

 ' CalculateWorkingHours関数から労働時間を取得

 Dim 労働時間 As Single

 労働時間 = CSng(CalculateWorkingHours(出社時刻, 退社時刻, True))

 

 ' エラーチェック

 If Err.Number <> 0 Then

  労働時間 = 0 ' エラーが発生した場合、0を代入

 End If

 

 On Error GoTo 0 ' エラー処理を元に戻す

 

 ' 所定の労働時間を設定

 Dim 所定労働時間 As Single

 所定労働時間 = 8 ' 8時間を所定としています

 

 ' 所定労働時間を減算して残業時間を求める

 Dim 残業時間 As Variant

 残業時間 = 労働時間 - 所定労働時間

 

 ' 残業時間が0以下の場合は、0ではなく何も表示しない

 If 残業時間 <= 0 Then

  CalculateOvertime = ""

 Else

  CalculateOvertime = Format(残業時間, "0.00")

 End If

End Function

 

@前回に作成したCalculateOvertime関数では、労働時間が0のときにエラーとなります

 

A左図のようにOn Error Resume Next と関連コードを挿入して、労働時間を求めるCalculateWorkingHours関数実行時のエラーを回避します

 

 

 On Error Resume Next ' エラーが発生した場合でも処理を続行する

On Error Resume Next は、VBA(Visual Basic for Applications)やVBScriptなどでエラーハンドリングを制御するためのステートメントです。このステートメントはエラーが発生した場合に、プログラムの実行を中断せずに次の行に進めるように設定します。

 ' CalculateWorkingHours関数から労働時間を取得

 Dim 労働時間 As Single

 労働時間 = CSng(CalculateWorkingHours(出社時刻, 退社時刻, True))

CalculateWorkingHours関数の結果が、空の文字列””だったときにエラーが発生します。

 ' エラーチェック

 If Err.Number <> 0 Then

  労働時間 = 0 ' エラーが発生した場合、0を代入

 End If

Err.Number はエラーオブジェクトのプロパティで、エラーが発生している場合にエラーコードが格納されます。

エラーコードがゼロでない場合、つまりエラーが発生している場合に 労働時間 にゼロを代入します。

 On Error GoTo 0 ' エラー処理を元に戻す

On Error Resume Next で設定されたエラーハンドリングを元に戻すためのコードです。

On Error Resume Next を使用するとエラーが発生しても処理が続行され、その後のコードが実行されます。しかし、この On Error GoTo 0 を設定することで、通常のエラーハンドリングモードに戻ります。

B「数式」タブの「再計算実行」を行うと、エラーが表示されなくなることを確認できます

CalculateWorkingHours関数実行時のエラーが発生すると労働時間に0が代入されるので、残業時間は-8時間となり、空の文字列””が表示されるようになります。

   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 

 

●出社時刻と退社時刻から、 所定の休憩時間を除いた労働時間を求めるための、 ユーザー定義関数を作る動画です

Dyson(ダイソン)オンラインストア

関連する他のページ

出退の時刻を簡単に記録したい
簡単なマクロを作れば、 「出社」や「退社」をクリック(タップ)するだけで現在日時を入力できる タイムカードを用意できます

セル範囲を対象とするユーザー定義関数を作りたい
For Each...Next ステートメントを使って、選択範囲に含まれるセルを順番に処理します

オリジナルの関数(ユーザー定義関数)を作りたい
Functionプロシージャとして、Visual Basicで作成できます

マクロを作りたい
「開発」タブを表示しておけば、 そこから「Visual Basic」を実行してマクロを作ることができます

“セキュリティの警告”が表示されるんだけど・・・
マクロを含むブックを開くときには、注意を促すべく、「セキュリティの警告」が表示されます

マクロ有効ファイルって何?
マクロを含むブックは、 マクロ有効ファイル(マクロ有効ブック)として保存しなければ、マクロが失われてしまいます

『セル範囲を検索して、 該当セルの右隣の値を取り出す』ユーザー定義関数を利用して、 文字列全体を置換したい
同じモジュールにあるユーザー定義関数は、 別のユーザー定義関数から利用することができます

セル範囲を検索して、 該当セルの右隣の値を取り出したい
10行程度のユーザー定義関数で可能です

指定色で塗りつぶされているセルの個数を求められる、 ユーザー定義関数を作りたい
ユーザー定義関数は、その処理を拡張できます

指定色で塗りつぶされているセルの個数を求めたい
塗りつぶし色を数値で表すユーザー定義関数を作れば、数式で求めることができます

平日夕方の指定時間帯の労働時間を確認したい
平日と夕方を条件として、 MIN関数で該当時間数を得ます

土日に祝日を加えた労働時間を集計したい
祝日であるか否かは、 COUNTIF関数を使った対象日の検索で確認できます

土日の労働時間を集計したい
WEEKDAY関数を使った配列数式で行えます

シフト時刻より遅れた出社時刻を強調したい
TIME関数で時刻化したシフトを、 出社時刻と比較して、 条件付き書式で強調する方法があります

残業時間を求めたい
労働時間から、 8時間を表す"8:00"を減算します

労働時間を求めたい
退社時刻から出社時刻と休憩時間を減算します

休日の早出時間の計算を無効にしたい
IF関数を使えば、 計算式に空セルが含まれるときなど、 計算結果を別の値に置き換えることができます

残業時間や深夜時間、早出時間を計算したい
MAX関数を使えば、 それが存在するときにだけその時間が表示されるようにできます

所定労働時間を求めたい
MIN関数を使って、 法定労働時間の8時間を最大値とする数式を設定します

勤務時間0を非表示にしたい
休日の勤務時間0は、 表示形式をユーザー定義することで非表示にできます

勤務時間を計算したい
退勤時刻から出勤時刻を減算することで、 勤務時間を求められます

労働時間や残業時間などの集計を行いたい
時間の集計は通常の数式で行えますが、 ○.○時間のようにしたいときには1時間で除算します

出勤していない日の計算は行わないようにしたい
IF関数式への条件の追加は、AND関数などを使って行います

残業があったときにだけ、その時間を表示したい
IF関数を使って、労働時間が8時間を越えるときにだけ、残業時間の計算を行うようにします

計算結果が0になるとき、それが表示されないようにしたい
表示形式で、値が0のときだけ白色で表示されるようにできます

土曜日の日にちを青色で、日曜日の日にちを赤色で表示したい
WEEKDAY関数を使った、条件付き書式を設定します

勤務時間0を非表示にしたい
休日の勤務時間0は、 表示形式をユーザー定義することで非表示にできます

勤務時間を計算したい
退勤時刻から出勤時刻を減算することで、 勤務時間を求められます

深夜時間を求めたい
深夜時間への区切りとなる22時を "22:00"という形で指定して演算し、 24(時間)を乗算して○.○時間で表示します

残業時間を求めたい
勤務時間を○.○時間という形ですでに求めているなら、 そこから8(時間)を引けば、 残業時間を求められます

勤務時間が0になるときには非表示にしたい
「ゼロの表示形式」を#にすると、計算結果が0のときに非表示になります

勤務時間を○.○時間という形で計算したい
時刻同士の演算に24を乗算すれば、○.○時間になります

計算結果の0を無効にしたい
IF関数を使えば、計算結果の0を無効にできます

計算結果の0を非表示にしたい
表示形式を「#」にします

 

 

 

 

 

出前館

アウトドア&フィッシング ナチュラム