領収書等のPDFファイルの名前を変えて保管(エクセルVBA)

サンプル

改正された電子帳簿保存法が2022年1月に施行されました。

うちの法律事務所では、領収書などを全部スキャナーでPDFファイルにして、保管することにしました。でも、ファイル名に「日付」「取引先」「金額」を入力するのが大変です。

スキャナーによっては、日付などを自動的に読み取ってファイル名にしてくれますよね。

そうなのですが、誤入力されてしまう場合もあるし、定額小為替の領収証なんて1日に同じものが何枚もあるので枝番も付けなければならないんですよね。

わかりました。エクセルで解決してみましょう。

サンプルのダウンロード

インストール方法

VBAファイルのインストール方法

操作マニュアル

VA事件データベースシリーズ(統合版)操作マニュアル

仕様

1. プロジェクト概要

本プロジェクトは、指定された複数フォルダからファイル一覧を取得し、Excel上のテーブルでメタデータ(日時、相手先、内容など)を管理・編集した上で、リネームして所定の保管フォルダへ自動移動(または復元)させるExcel VBAツールである。

2. アプリケーション構成(モジュール構成)

以下の構成でVBAモジュールを作成すること。

  • ThisWorkbook: ブックの起動・終了イベント処理。
  • ShtHokan (Worksheet): メイン画面。「保管」テーブルを配置し、UIイベント(ダブルクリック、チェンジ)を記述する。
  • ShtOption (Worksheet): 設定画面。パスやマスタデータを保持する。コードは宣言のみ。
  • ShtManual (Worksheet): マニュアル画面。コードは宣言のみ。
  • Evnt (ClassModule): イベント処理・画面更新のON/OFFを切り替えるユーティリティクラス。
  • basSetup (StandardModule): グローバル変数、初期化処理(外部連携)、バックアップ処理等の共通ロジック。

3. データ構造(シートとテーブル)

3.1. ShtHokan (保管シート)

シート内に 保管 という名前のListObject(テーブル)を配置する。

列構成は以下の通り。

  • 番号 (数値)
  • フォルダ名 (文字列: 元のフォルダパス)
  • ファイル名 (文字列: 元のファイル名)
  • 種別 (文字列: オプションシートで定義されたリストから選択)
  • 日時 (数値または文字列: デフォルトは元ファイル名の先頭8文字)
  • 相手先 (文字列)
  • 内容 (文字列)
  • 枝番 (数値)
  • 保管フォルダ名 (文字列: 移動先のフォルダパス)
  • 保管ファイル名 (文字列: 生成されたリネーム後のファイル名)
  • 保管日時 (日時: 移動が完了した日時)

3.2. ShtOption (オプションシート)

以下の設定値(名前付きセルまたはテーブル)を持つ。

  • フォルダ: 読み込み対象のフォルダパス一覧(セル内改行 vbLf で複数指定)。
  • 枝番: 枝番の付与ルール(「常に付加する」などの文字列)。
  • 保管フォルダ (テーブル): 列として 種別保管フォルダ を持つマスターデータ。
  • バックアップフォルダ: ブック自身のバックアップ先パス。

4. 機能要件

4.1. パフォーマンス制御 (Evntクラス)

マクロ実行時の描画遅延や意図しないイベント発火を防ぐため、以下の機能を持つクラスを作成する。

  • Disable: ScreenUpdating = False, Cursor = xlWait, EnableEvents = False, Calculation = xlCalculationManual
  • Enable: 上記をデフォルトに戻す。

4.2. 初期化・起動時処理 (ThisWorkbook & basSetup)

  • Workbook_Open:
    1. Evnt.Disable を実行。
    2. 保管シートをアクティブにする。
    3. 保管テーブルを上からループし、保管日時が空欄の最初の行を見つけ、その行の種別セルを選択し、画面にスクロール表示する。
    4. basSetup.PerformDailyBackup を呼び出す。
    5. Evnt.Enable で元に戻す。
  • VABridge_AfterLoad (外部連携用フック):
    • 外部アプリケーション(VAブリッジ)から呼び出される初期化処理。
    • 機能は Workbook_Open とほぼ同等に加え、最初に ShtHokan.FormatTable を実行して書式を整える。

4.3. バックアップ機能 (PerformDailyBackup)

  • 1日1回、特定のフォルダに現在のブックをコピー保存する。
  • 条件: 保管テーブルにデータが1件以上あること。
  • ファイル名生成: ThisWorkbook.Name から “V” という文字より前の部分をベース名とし、yyyymmdd_ベース名.xlsx とする。
  • 指定フォルダ内に同日のファイルがなければ ThisWorkbook.Sheets.Copy を行い、.xlsx 形式で保存する。

4.4. ファイル読み込み機能 (ShtHokan.ReadFileNames)

  • ShtOptionフォルダセルから改行区切りで複数フォルダのパスを取得。
  • 各フォルダ内の全ファイル (*.*) を取得し、保管テーブルの末尾に追加する。
  • ファイル名パースロジック:
    • 元のファイル名が 日時_相手先_内容.ext の形式であることを前提とする。
    • アンダースコア _ で分割し、それぞれ 相手先, 内容 にセット。
    • 先頭8文字を 日時 にセット。
    • 種別 にはマスターの1行目の値をデフォルト設定。
  • 重複除外: 既に同じ ファイル名 がテーブルにある場合、または「常に付加する」設定で同じ 保管ファイル名 がある場合はスキップする。
  • 追加後、枝番・保管フォルダ・保管ファイル名の更新ロジックを呼び出す。

4.5. 保管ファイル名・枝番生成ロジック (ShtHokan)

  • UpdateBranchNumber (枝番更新):
    • 対象行の 日時 & 相手先 & 内容 と一致する行が、テーブルの1行目から対象行までにいくつあるかカウントする。
    • 設定が「常に付加する」以外の場合は、カウントから1を引く。結果を 枝番 にセット。
  • UpdateStoredFileName (保管ファイル名生成):
    • 枝番が 0 の場合: 日時_相手先_内容.拡張子
    • 枝番が 0 以外の場合: 日時_相手先_内容_枝番.拡張子
  • UpdateStoredFolderName (保管フォルダ名更新):
    • 入力された 種別 をオプションシートのマスターからVLOOKUP(Match)検索し、該当するパスをセットする。

4.6. UI/UX制御 (ShtHokanのイベント)

Worksheet_Change イベント

テーブル内のセルが手動変更された際、関連する項目を自動更新する。

  • 種別 変更: 保管フォルダ名を更新。
  • 日時, 相手先 変更: 枝番、保管ファイル名を更新。
  • 枝番 変更: 保管ファイル名を更新。
Worksheet_BeforeDoubleClick イベント

クリックされた列のヘッダー名に応じてアクションを実行する(実行時は Cancel = True にし、Evntで制御)。

  • 番号列 (新規追加行クリック時): ReadFileNames を実行。
  • フォルダ名列 / 保管フォルダ名列: フォルダが実在すればエクスプローラーで開く。
  • ファイル名列 / 保管ファイル名列: ファイルが実在すれば関連付けられたアプリで開く。空欄なら自動生成ロジックを呼び出す。
  • 枝番列: 枝番と保管ファイル名を強制再計算。
  • 保管日時列:
    • 空欄の場合: MoveFile(元フォルダから保管フォルダへファイルを移動・リネーム)を実行。完了時に現在日時をセット。
    • 値がある場合: RstrFile(保管フォルダから元フォルダへ戻す・復元)を実行。完了時に保管日時等をクリア。
    • 最後に FormatTable を実行。

4.7. ファイル移動・復元 (MoveFile / RstrFile)

  • VBAの Name ステートメントを利用して、ファイルのフルパスを変更(移動とリネームを同時に行う)。
  • 実行前に、移動元ファイルの実在確認、移動先フォルダの実在確認、移動先ファイル名の重複確認を行い、エラー時は適切なMsgBoxを出すこと。

4.8. フォーマット定型処理 (FormatTable)

  • 保管日時 の表示形式を yyyy/m/d h:mm に設定。
  • 種別 列に入力規則(ドロップダウンリスト)を設定(オプションシートのマスター配列を利用)。
  • 保管日時 に値があれば行のフォントを xlThemeColorAccent3 にし、空欄なら自動色(黒)にする。
  • セル全体の折り返しを有効にし、行の高さを自動調整する。

5. コーディング規約

  • すべてのモジュールの先頭に Option Explicit を記述すること。
  • 各プロシージャには、機能概要・引数・戻り値を記述したヘッダーコメントを付与すること。
  • 各処理のステップごとに、日本語で意図を説明するインラインコメントを詳細に記述すること。
  • エラーハンドリング (On Error GoTo ... または On Error Resume Next) を適切に実装し、異常終了を防ぐこと。
  • オブジェクト変数を使用した後は必ず解放(例:クラスなら Set obj = Nothing)を行うこと(※特にWorkbook_BeforeClose等で)。

コメント

  1. 管理人 より:

    スキャナが領収書の発行年月日を読み取れなかった場合にファイルを読み込めない不具合を修正しました。(Ver1.10→Ver1.11)

  2. 管理人 より:

    処理済みのファイルと同一名のファイルを読み込まなければならない場合があるため、保管処理が終了していないファイルがある場合も読み込みを行うように修正しました。
    ファイルサイズの増大を防止するため。フォルダやファイルの内容を確認するために設定していたハイパーリンクを削除し、VBAでフォルダやファイルを開くように変更しました。
    併せて、一旦移動したファイルを元のフォルダに戻した際には、保管先フォルダ名や保管先ファイル名を削除するようにしました。
    これに伴い、バージョンを1.11から1.20に変更しました。

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