エクセルVBAによる運用業務で人為的ミスを減らす4つの方法

ミスを減らすアイキャッチ
みなさん、こんにちは!
フジタニ(@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メソッドについて説明しております。

【エクセルVBA】Protect/Unprotectメソッドでシートの保護設定と解除をする方法
ProtectメソッドとUnprotectメソッドを使って、VBAでシートの保護を設定したり、解除したりする方法をご紹介しています。VBAで作成したレポートを変更させたくない!という時にこのメソッドを加えておけば、シートの保護までVBAがやってくれますよ。シートの保護を忘れずに設定したい!という時におすすめです。

人の誤操作をプログラムが検知する

例:日付を判定してボタンを押せなくする

15日締:毎月16日(休→翌営業日)に実施、末日締:毎月1日(休→翌営業日)に実施

以上の処理があったと仮定します。

vbaボタン

例えば、今回は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関数

システム日付をDate型(yyyy/mm/dd hh:mm:ss)で返します。

Date型は時間まで返してしまいますから特定の値を指定した書式に変換するFormat関数を使います。

Format(値, 書式)

Format関数でDate関数で取得したシステム日付を”dd”に変換。

Format関数の使い方の詳細は下記をご覧ください。

【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
エクセルVBAで文字列を連結する、文字列の書式を変更するなどの「文字列」に関するいくつかのテクニックを紹介しつつ、データ一覧から請求書を自動で作成するというシリーズ連載の序盤の完成を目指します。

ボタンを押されたタイミングが、想定されたタイミングではない場合にメッセージを出力します。

このようにメッセージを出してあげることでミスの半分以上は防ぐことができます。

インポートするファイルが正しいかどうかをチェックする

人の目では気づけない部分もあります。できる限り自動的にファイルの異常に気づける仕組みを取り入れましょう。

例:エクセル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(ファイルパス)

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関数とファイル選択ダイアログの説明は下記記事をご覧ください。

エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを開く
エクセルVBAでファイルを開く作業を自動化する方法についてシリーズでお伝えしています。今回は、エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを表示させる方法です。
エクセルVBAでDir関数を使って指定のファイルが存在するかどうかを判定する方法
エクセルVBAでファイルを開く作業を自動化する方法についてのシリーズ。今回は開くファイルの指定をエクセルシートに変更し、またファイルが存在するかどうかをDir関数で判定する方法についてお伝えします。

まとめ

今回紹介したミスを減らす4つの方法をまとめると以下の通りです。

  • シートを保護する
  • 人の誤操作をプログラムが検知する
  • インポートするファイルが正しいかどうかをチェックする
  • ファイルを自動的に選択する

どれもカンタンに導入ができる方法です。

少しの工夫でミスって大幅に減らすことができるんです。

メインの処理だけに偏りがちですが、人為的ミスを減らすことも業務効率化に繋がります。

是非、業務改善に役立ててください!

タイトルとURLをコピーしました