【VBAリファレンス】生成AI活用研究Geminiと100本ノック 14本目:社外秘シート削除

スポンサーリンク

生成AI活用研究Geminiと100本ノック 14本目:社外秘シート削除の自動化技術

Excel業務において、最も神経を使う作業の一つが「機密情報の管理」です。取引先や外部パートナーにファイルを送付する際、誤って社内限定のデータや計算根拠が含まれたシートを同封してしまうヒューマンエラーは、企業の信用を失墜させかねない重大なリスクです。

本記事では、生成AI「Gemini」を設計パートナーとし、社外秘シートを一括で安全に削除するVBAプログラムの構築手法を解説します。「100本ノック」の14本目として、実務で即戦力となる堅牢なコードの書き方を学びましょう。

なぜ手作業での削除が危険なのか

手作業によるシート削除には、大きく分けて3つのリスクが存在します。

第一に「見落とし」です。非表示設定にされたシートや、非常に小さなサイズのシートは、ファイルを開いた際に認識されにくい傾向があります。第二に「依存関係の破壊」です。削除しようとしているシートを別のシートが参照している場合、数式に「#REF!」エラーが発生し、ファイル全体の整合性が崩れます。第三に「操作ミスによる全削除」です。Excelは一度削除したシートを「元に戻す(Ctrl+Z)」機能で復元できません。

これらを解決するために、VBAによる「条件付き自動削除」を実装します。これにより、ヒューマンエラーを排除し、ログを記録することで「誰が、いつ、どのシートを消したか」の追跡も可能になります。

プログラム設計の要点とGeminiの活用

Geminiを活用してこのプログラムを作成する際、単純に「シートを削除するコードを書いて」と指示するだけでは不十分です。プロフェッショナルなエンジニアとして、以下の要件を定義する必要があります。

1. 特定のキーワード(例:「社外秘」「Internal」「計算用」)を含むシートを自動判定する。
2. 削除前に必ずバックアップを作成する、あるいは確認ダイアログを表示する。
3. 削除対象のシートが「最後の1枚」になる場合は削除を中断する(Excelの仕様制限を考慮)。
4. 削除実行後に、処理結果をイミディエイトウィンドウやメッセージボックスに出力する。

Geminiにこれらの要件を伝えることで、単なる削除コマンドではなく、エラーハンドリングを完備した実務向けのコードが生成されます。

社外秘シート一括削除の実装コード

以下に、実務でそのまま利用可能なプロフェッショナルなVBAコードを提示します。このコードは、指定したキーワードを含むシートを検索し、確認を経て削除する仕様です。


Option Explicit

' シート削除メインプロシージャ
Public Sub DeleteConfidentialSheets()
    Dim ws As Worksheet
    Dim targetKeyword As String
    Dim deleteCount As Integer
    Dim msgResult As VbMsgBoxResult
    
    ' 削除対象とするキーワードを設定
    targetKeyword = "社外秘"
    deleteCount = 0
    
    ' 画面更新を停止して処理速度を向上
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False ' 確認メッセージを一時停止
    
    On Error GoTo ErrorHandler
    
    ' 全シートをループ処理
    For Each ws In ThisWorkbook.Worksheets
        ' キーワードが含まれているか判定
        If InStr(1, ws.Name, targetKeyword, vbTextCompare) > 0 Then
            
            ' 最後のシートでないか確認
            If ThisWorkbook.Worksheets.Count > 1 Then
                Debug.Print "削除対象シートを発見: " & ws.Name
                ws.Delete
                deleteCount = deleteCount + 1
            Else
                MsgBox "最後の1枚のため、シート「" & ws.Name & "」は削除できませんでした。", vbExclamation
            End If
            
        End If
    Next ws
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    
    MsgBox deleteCount & " 枚の社外秘シートを削除しました。", vbInformation
    
    Exit Sub

ErrorHandler:
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub

コードの詳細解説と技術的ポイント

このコードには、エンジニアが守るべきいくつかの重要なプラクティスが組み込まれています。

まず「Application.DisplayAlerts = False」の活用です。VBAでシートを削除する際、標準では「本当に削除しますか?」という警告ダイアログが表示されます。これを制御することで、大量のシートをストレスなく削除できます。ただし、処理終了後には必ずTrueに戻すことを忘れてはなりません。

次に「InStr関数」の利用です。これにより、シート名に「社外秘」という文字列が含まれているか否かを柔軟に判定できます。例えば「2023_社外秘_売上」や「社外秘_顧客リスト」といった命名規則であっても、漏れなく捕捉可能です。

また、エラーハンドリング(ErrorHandler)を実装しています。もし何らかの理由で削除が拒否された場合(保護されたシートである場合など)、プログラムが異常終了するのを防ぎ、ユーザーにエラー内容を通知するように設計しています。

実務アドバイス:さらなる安全性の向上

現場でこのスクリプトを運用する際、以下の3点を検討してください。

1. 削除ログの保存:削除したシート名をテキストファイルや別シートに書き出す処理を追加しましょう。これにより、後から「どのデータが消えたか」を確認できます。
2. 依存関係のチェック:削除対象のシートが他のシートから参照されていないかを確認する関数(Range.DirectPrecedentsなど)を組み込むと、より安全です。ただし、これは非常に複雑なロジックになるため、まずは今回紹介したコードで「削除対象を明確に分ける」運用をお勧めします。
3. バックアップの自動化:削除前に「SaveAs」メソッドを使用して、別名でバックアップファイルを生成する処理をコードの冒頭に追加するのが最も安全なアプローチです。

まとめ

「社外秘シートの削除」という単純な作業であっても、VBAを正しく設計すれば、それは「ヒューマンエラーを排除する強力な盾」へと変わります。今回紹介したコードは、あくまで基本テンプレートです。皆さんの組織の命名規則や業務フローに合わせて、キーワードの変更やログ機能の追加を行ってください。

生成AI「Gemini」は、このような定型業務の自動化において非常に強力なパートナーです。コードを書かせるだけでなく、「このコードで想定されるリスクは何か?」と問いかけることで、さらなる品質向上が期待できます。100本ノックを通じて、Excel VBAのスキルを磨き、単なる「作業者」から「業務改善エンジニア」へとステップアップしていきましょう。次のノックでお会いしましょう。

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