みなさん、こんにちは!
フジタニ(@libartweb)です。
エクセルVBAで自動化されている業務。せっかく自動化されているのに、エクセルVBAの操作誤りなどでオペレーションミス多発・・・
ケアレスミスで重大な顧客クレームに繋がったり。そんな状態が続けば、ミスは減りませんし、顧客満足度も低下の一方です。
少し視点を変えてエクセルVBAに一工夫を加えるだけで小さなミスは大幅に減らすことが可能です。
実はすごくカンタンなチェック機能を追加するだけだったりします。
今回は、そういった工夫などを取り入れ、人為的な運用ミスを減らす4つの方法を紹介します。
業務でエクセルVBAを実際に運用されている方は必見です!
エクセルVBAを使用した運用で発生する人為的ミス
自動化していても、その中で手作業はどうしても発生します。
エクセルVBAの実行ボタンを押す、ファイルを選択する、ブックを開くなど…
どんなに小さな動作であっても、人が操作する以上、それは「人為的な作業」です。
人が入るとそこには必ずミスが発生します。
ミスが発生する前提で、それを防ぐにはどうすればいいか?を常に考えること。
処理の機能だけをエクセルVBAに記述するのではなく、ミスを減らすための記述も行うこと。
以上を意識するだけで大幅に人為的ミスを減らすことができます。
「工夫する」という意識が常に必要となってきます。
人為的なミスを減らす4つの方法
では具体的に、どのような実装ができるのか?今回は4つの方法とその例を紹介します。
今回紹介する内容から様々な改善のアイデアに繋がればと思います。
シートを保護する
例:シートの保護を活用し、誤入力を防ぐ
エクセルVBAで使用するデータは当然エクセル上に保存されている場合が多いです。
エクセルVBAのブックと同一ブック内にプログラムで使用するシート(データ)があった場合、何らかの拍子に意図せず人が編集してしまう恐れがあります。
そうなると、誤った処理結果が出力される原因となります。編集されたくないシートは保護をかけておきましょう!
①保護したいシートを右クリック
②「シートの保護」を左クリック
これだけです!
エクセルVBAで保護したシートを編集したい場合
しかし、保護したシートをエクセルVBAが編集をかける場合、保護したままだとエラーになってしまいます。
でも大丈夫。エクセルVBAでシートの保護と解除ができます。
Sub sheet_protect()
'処理開始前にシートの保護を解除する
Sheet1.Unprotect
Call main
'処理終了後はシートの保護を有効にする
Sheet1.Protect
End Sub
ProtectメソッドとUnprotectメソッドを使ってシートの保護と保護の解除ができます。
ユーザに操作を求めずにシートの保護と解除を自動で行うことができます。シート内のデータをユーザが誤って編集しちゃうこともなくなりますね。
以下の記事でProtectメソッドとUnprotectメソッドについて説明しております。
人の誤操作をプログラムが検知する
例:日付を判定してボタンを押せなくする
15日締:毎月16日(休→翌営業日)に実施、末日締:毎月1日(休→翌営業日)に実施
以上の処理があったと仮定します。
例えば、今回は15日締処理なのに、末日締のボタンを押してしまったら問題です。
エクセルVBAは日付を判定できますから、間違って押してしまっても気づけるようにすれば良いのです。
Sub matu_click()
'末日締ボタンを押した日が16日以降だったら処理を中断する
If Format(Date, "dd") > 15 Then
MsgBox ("今回は15日締処理です!")
Exit Sub
End If
End Sub
Sub fifteen_click()
'15日締ボタンを押した日が15日以前だったら処理を中断する
If Format(Date, "dd") < 16 Then
MsgBox ("今回は末日締処理です!")
Exit Sub
End If
End Sub
システム日付をDate型(yyyy/mm/dd hh:mm:ss)で返します。
Date型は時間まで返してしまいますから特定の値を指定した書式に変換するFormat関数を使います。
Format関数でDate関数で取得したシステム日付を”dd”に変換。
Format関数の使い方の詳細は下記をご覧ください。
ボタンを押されたタイミングが、想定されたタイミングではない場合にメッセージを出力します。
このようにメッセージを出してあげることでミスの半分以上は防ぐことができます。
インポートするファイルが正しいかどうかをチェックする
人の目では気づけない部分もあります。できる限り自動的にファイルの異常に気づける仕組みを取り入れましょう。
例:エクセルVBAでインポートするファイルが古いものでないかチェックする
他のシステムから吐き出した「本日分」のxlsxファイルやcsvファイルをインポートするエクセルVBAがあります。
ただ、ファイル名がいつも一緒なので、手作業でファイルを指定すると、うっかり前日以前のものをインポートしてしまうというミスが発生することがあります。
それを防ぐために、「ファイルの更新日」をチェックして、更新日が「本日」の日付じゃない(古い)場合にメッセージを出力します。
以下サンプルコードです。
Sub test()
Dim filePath As String
filePath = "C:\vba\sample.csv"
'ファイルの更新日が、システム日付と一致するかをチェックする
'Format関数で、比較対象を年月日のみにします。(時間まで取得されてしまうので)
If Format(FileDateTime(filePath), "yyyymmdd") <> Format(Date, "yyyymmdd") Then
If MsgBox(filePath & "の更新日が異常です。処理を続行しますか?", vbYesNo) = vbNo Then
Exit Sub
End If
End If
End Sub
ファイル更新日時を調べるには以下の関数を使用します。
FileDateTime関数はファイルの作成日時または最終更新日時をDate型(yyyy/mm/dd hh:mm:ss)で返します。
これをDate関数と比較することで、ファイルの作成(更新)日時とシステム日付が一致しているか?をチェックすることができます。
サンプルコードでは比較対象が「日付」で時間までは不要なので先ほど紹介したFormat関数で
「最終更新日時(FileDateTime関数で取得)」と「システム日付(Date関数で取得)」を
“yyyy/mm/dd hh:mm:ss” → ”yyyymmdd”に変換。
それぞれを同じ書式で比較できるようにしています。
ファイルを自動的に選択する
ファイル名に規則性があるのに、ファイルを手動選択させる運用をしていませんか?ファイル名に規則性がある場合はエクセルVBAでファイルの自動選択が可能です。
Sub Auto_Open()
Dim wb As Workbook
Dim filePath As String 'ファイルパス
'事前にファイルパスを格納する変数filePathにインポートするファイルのファイルパスを格納する
filePath = "C:\vba\sample" & Format(Date, "yyyymm") & ".xlsx"
If MsgBox("今回の処理対象ファイルは" & filePath & "ですか?", vbYesNo) = vbYes Then
'処理対象ファイルの存在確認
If Dir(filePath) = "" Then 'Dir関数
MsgBox ("処理対象ファイルが存在しません!")
Exit Sub
End If
Else
'ファイル選択ダイアログを表示
With Application.FileDialog(msoFileDialogFilePicker) 'FileDialogオブジェクト
.Title = "ファイルを選択してください"
.AllowMultiSelect = False '複数ファイルを選択させない
.Show '表示
filePath = .SelectedItems(1) '選択したファイルのパス
End With
End If
Set wb = Workbooks.Open(filePath)
End Sub
サンプルコードは本当にそのファイルパスで正しいか?を確認するメッセージボックスを出力して、正しければ処理続行。
間違っていたらファイル選択ダイアログを表示して、変数filePathの中身を更新する、という処理です。
前提条件はインポートするファイル名に規則性があることです。
規則性があれば、今回の記事で紹介しているDate関数などを駆使して自動的にファイルを選択する機能を追加することができます。
「人にできる限り操作をさせない」ことが、ミス削減に繋がります。
サンプルコードで使用しているDir関数とファイル選択ダイアログの説明は下記記事をご覧ください。
まとめ
今回紹介したミスを減らす4つの方法をまとめると以下の通りです。
- シートを保護する
- 人の誤操作をプログラムが検知する
- インポートするファイルが正しいかどうかをチェックする
- ファイルを自動的に選択する
どれもカンタンに導入ができる方法です。
少しの工夫でミスって大幅に減らすことができるんです。
メインの処理だけに偏りがちですが、人為的ミスを減らすことも業務効率化に繋がります。
是非、業務改善に役立ててください!