サンプル

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

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

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

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

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

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

ダウンロード

まずは、サンプル・ファイルをダウンロードしてください。

最初にブック(ファイルに保存されたエクセルのデータ全体)を開くと「ファイルがありません」というメッセージがでます。「オプション」シートで読み込みフォルダの設定を行ってください。

使用方法

  • ファイルを開くと、オプションで指定したフォルダ内にあるファイル名が読み込まれ、「読込フォルダ名」と「読込ファイル名」が自動入力されます。
  • ファイル名が読み込まれると、「種別」、「日時」、「相手先」、「金額」、「枝番」、「保管フォルダ名」と「保管ファイル名」が自動入力されますので、必要に応じて修正してください。
  • 保管日時のセルをダブルクリックすると、ファイル名の変更とファイルの移動が行われます。
  • フォルダ名やファイル名をダブルクリックするとフォルダやファイルの内容を確認できます。

細部については、ブックの「マニュアル」シートを参照してください。

なお、このサンプルは、ファイル保管をマクロで行う場合の参考にしていただくためのものです。
使用にあたっては、それぞれの法律事務所に応じた修正を行ったうえでお使いください。

このサンプルをそのまま使うこともできますよね。

そうなんですが、それではマクロを使う意味がありません。できあいのプログラムを使うのであれば、もっと良いソフトがいくらでもあると思います。
マクロの良いところは、自分の使いやすいプログラムを自分自身で手軽に作れることです。ぜひ、このサンプルを参考に自分の法律事務所にピッタリのプログラムを作っていただきたいと思います。

分かりました。
でも、難しそうですね。

ブックとワークシートの構成

まずは、「領収書等ファイル保管」のワークシートについて、説明します。

説明して欲しいのは、マクロのことなのですが...

ワークシートをどのように作っているのかが分かっていないと、マクロがどのように働いているのかが分かりませんので、少しお付き合いください。

ブックの構成

ブックには、次の3つのシートが作られています。

  • 「保管」シート
  • 「オプション」シート
  • 「マニュアル」シート

「保管」シートの構成

「保管」シートには、ファイルの保管に関する情報をテーブル機能を使って入力・表示できるようにしています。

テーブルの作成方法については、こちらのサイトを参考にしてください。

「番号」の列をダブルクリックすると、読み込みフォルダ内にあるファイル名が読み込まれます。まだ保管処理が終了していないファイルがある場合は、同一ファイルを重複して読み込むことを回避するため、読込処理を中止するようにしています。

ファイル名が読み込まれると、「種別」、「日時」、「相手先」、「金額」、「枝番」、「保管フォルダ名」と「保管ファイル名」が自動入力されます。「種別」を変更すると「保管フォルダ名」が自動修正されます。「日時」、「相手先」、「金額」を変更すると「枝番」が自動修正されます。「日時」、「相手先」、「金額」、「枝番」が変更されると「保管ファイル名」が自動修正されます。

「保管日時」の列をダブルクリックすると、ファイル名の変更およびファイルの移動が行われ、日時が入力されます。日時が既に入力されている状態でダブルクリックすると、保管フォルダから読込フォルダへの再移動が行われ、元のファイル名に戻ります。

フォルダ名やファイル名には、ハイパーリンクが設定されていますので、クリックすることでフォルダやファイルの内容を確認できます。

「保管」シート

「オプション」シートの構成

「オプション」シートには、「読込フォルダ」および「保管フォルダ」を設定できるようになっています。ファイルの移動を行わずにファイル名の変更だけを行いたい場合には、「保管フォルダ」に「読込フォルダ」と同一のフォルダを指定することもできます。

また、枝番を「常に付加する」と「ファイル名が重複する場合のみに付加する」から選択できます。ただし、 「ファイル名が重複する場合のみに付加する」 場合には、読み込みフォルダと保管フォルダを同一フォルダには設定できませんので注意してください。(読込ファイル名と保管ファイル名が同一になる場合が生じるため。)

「オプション」シート

「マニュアル」シートの構成

「マニュアル」シートには、「領収書等ファイル保管」の使用法と変更履歴を記載しています。

「マニュアル」シート


以上でブックとワークシートに関する説明を終わります。

テーブルを使うということが重要なんですね。

そうなんです。VBAの参考書では、後ろの方にならないと出てこないですが、データベースとしてエクセルを使うことが多い法律事務所の業務においては、非常に重要なテクニックです。

VBEへの入力位置

「開発」-「Visual Basic」をクリックして、VBEを起動してください。

左上の「プロジェクト・エクスプローラー」部で各モジュールをクリックすると、そこに記載されているコードが真ん中の「コード・エディター」部に表示されます。

VBEの画面

見ていただくとお分かりのとおり、ほとんどのコードがシートモジュールに記載されています。標準モジュールには、ごくわずかしかコードが記載されていません。

私の持っている教科書では、マクロは「標準モジュール」に書くのが基本だと書いてあります。

そうですね。
でも、実は、シートに関係するコードは、そのシートに書いた方が、プログラムを構造化できますし、コードの記述も簡単になるんです。

プロジェクトの構成

「領収書等ファイル管理」プロジェクトの構成は、次の図のようになっています。

プロジェクトの構成

全てのマクロは、イベントプロシージャで起動しています。

これも教科書とは全然違いますよ。
マクロを実行するためには、シート上にボタンを配置したり、ショートカットキーに登録したりするのが基本的なやり方だとされています。

そうですね。イベントプロシージャは、教科書の後ろの方に応用的なテクニックとして記載されていることが多いようですね。
でも、最もエクセルらしい直感的な操作ができますし、特別なボタンを作成したりする手間も省けるので、積極的に使うべきだと考えています。

「ThisWorkbook」モジュールの機能

ThisWorkbook」モジュールには、まず、ブックを開いた時に起動する「Workbook_Open」プロシージャが組み込まれており、ファイル名の読み込みを行います。また、ブックを保存するときに起動する「Workbook_BeforeSave」プロシージャが組み込まれており、テーブルの書式設定を行います。

「Sheet11(保管)」モジュールの機能

Sheet11」モジュールには、まず、「保管」シートをダブルクリックした時に起動する「Worksheet_BeforeDoubleClick」プロシージャ、シートに変更が加えられた時に起動する「Worksheet_Change」プロシージャ、およびシートの選択位置が変わった時に起動する「Worksheet_SelectionChange」プロシージャが組み込まれており、それぞれのイベントに応じたマクロを呼び出しています。

次の3つのプロシージャがこのシステムの中核となるマクロになります。
ReadFileNames」プロシージャは、オプションシートで設定されたフォルダ内にあるファイルのファイル名をシートに読み込みます。
MoveFile」プロシージャは、そのファイルを指定されたフォルダに指定されたファイル名で移動します。
RstrFile」プロシージャは、移動したファイルを元のフォルダに、元の名前で復旧します。

「Module11」の機能

標準モジュールである「Module11」モジュールには、イベントの抑止およびその解除などを行うプロシージャが組み込まれています。

DsblEvents 」プロシージャは、マクロ実行中のイベントの発生を抑止して、イベントが連鎖するのを防止します。併せて、画面の描画などを停止して、マクロの実行速度の向上を図っています。
EnblEvents」プロシージャは、「DsblEvents」が行った設定を解除するプロシージャです。

マクロの内容にもよるのですが、基本的には、マクロの開始時にイベントの発生を抑止し、マクロの終了時に再開するようにしています。

以上で、マクロの構造に関する説明を終わります。

重要なのは「読み込み」「移動」「復旧」の3つのプロシージャなのですね。

そのとおりです。その3つのプロシージャには、ファイルの操作に関するマクロが含まれています。それ以外のプロシージャには、基本的なマクロしか使われていません。ただし、かなり複雑に組み合わされていますので、自分で最初から作ってみた方が理解しやすいかもしれません。

マクロの全体的な構造は分かりました。あとはプログラムの細部ですね。

そうですね。それについては、サンプルファイルのコードにできるだけ詳しいコメントを付けてありますので、そちらをご覧ください。

コメント

  1. 管理人 より:

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

  2. 管理人 より:

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

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