Excelで電子帳簿保存法対応のVBAを作ってみた

その電子帳簿保存法対応なのですが、零細企業なので安く出来ないか悩んでいました。 弥生会計のオンライン対応とかもあったのですが、意外と面倒で……。

「ファイルのアップロードって!?」「これ何を選べばいいの?」とやり慣れてない人には難しいみたいです。

その為、とりあえず学習までのつなぎとしてExcelと運用規定を定めれば「タイムスタンプなし」でもなんとかなりそうな気がしました。

で、ExcelVBAで作ってほぼ完成していたのですが……この度転職する事になりました。 経理も関係ない所です。

その為、供養もかねてここでどんなものか見て貰おうと。(見る人がいるかは不明ですが)

まずトップ画面

Excelのファイルがある所のフォルダ構成はこんな感じです。

説明を読んでから「帳簿リスト」のシートを下のほうから選んでクリック。

そしてメインである画面が表示されます。

入力するには作業する人の名前をまず入力します。

そして新規入力ボタンを押すと、入力画面が出てきます。 シンプルにしました。

こんな風に入力していきます。

参照ボタンは請求書・領収書なんかのPDFを選択するものです。 自社の都合上、今回はPDFだけですが画像も選択することは、改変可能。 参照ボタンを押すと、ファイルを選択する画面が開きます。

運用上、処理していないファイルを未処理フォルダに入れておいて貰います。

このファイルを選んでOKを押すと、入力画面に戻って以下のようになります。

あとはOKを押すと、データがExcelに転写されて入力画面が日付以外がリセットされて残ります。 複数入力を続けてやる事があるので残すようにしていますが、ここで画面を消す場合はCancelボタンで消えます。

入力後のシートの様子は以下のような感じ。

そして未処理にあったPDFファイルはファイル名を変更して「処理済み」フォルダに移動されます。 「日付金額会社名.pdf」で名前を変更します。重複した場合は「01-日付金額会社名.pdf」という形で保存されます。

次は入力したものが間違っていた場合。 その時、運用上別の人物に確認してもらって承認すれば修正してもよい事になっています。 作業者の名前を変えて、編集するインデックス番号を入力し「index行編集」を押します

以下のような画面に切り替わるので、備考欄を編集してみます。

入力画面が閉じて、修正履歴の欄は以下のようになります。

元の帳簿リストシートも変更されます

さらに添付するPDFファイルが間違っていた、または訂正が送られてきた場合

さっきと同じように「index行編集」を選びます

参照ボタンを押して、訂正するファイルを選択します

そしてOKを押すと以下のように訂正されました。

運用上、前のPDFファイルも捨てられないので訂正前のファイルは「削除・編集済み」のフォルダに移動し、未処理のファイルが「処理済み」のフォルダに移動します。 履歴を残しておくという事ですね。 うーん、見直すと訂正時のファイル移動の文言が駄目なような。後で直そう。 ちなみに一つ前のファイルは削除した事になるので、削除履歴にも残ります。

ちなみにこのファイル名の所はリンクになっており、クリックすると対応するPDFファイルが別のアプリケーションで開いて見ることが出来ます。

最後に花子さんに削除してもらいましょう。

削除indexに、消したい番号を入れてボタンを押します。

確認が面がでるので、「はい」を選択。 こうして削除できました。

修正履歴にも削除した事が残ります。

当然削除履歴にも残ります。ファイルは移動しただけなので消えませんが。

このExcelファイルと運用規定を決めて事務所に設置すれば、一応電子帳簿保存法に対応した事になるのではないかと。

所詮はExcelファイルなので、決算期毎にExcelファイルとフォルダを作成しておいてそれぞれ毎に運用すればバックアップなんかも簡単ですしね。

一応、Excelシートには「シート保護」がかかっていますが、解除パスワードも書いてあります。 それぞれがテーブルとして指定あるので二つ以上の検索要件にも対応していますし、作業者の名前を入れないと入力できないようになっています。

途中の入力を促す画面で会社名が入力できる所があります。 取引先の所です。

このリストは同じExcelファイルに「取引先履歴」というシートがありまして、その中に入力した会社名が記録されます。 またこのシートは保護していないので、自分で手入力もできます。

それが先ほどの画面に反映されて表示されますので、いくつか登録しておくと便利に使えるようになっています。

他には「現シートコピー」というボタンを追加しました。 シート保護されているので、編集して一覧を出したい場合など面倒ですから同じ内容のシートのみをコピーして別のExcelファイルを自動で作成できるようにしました。

……というコンセプトで作成したのですが、無駄になってしまった、残念!

追記

一番面倒だったのがValidationでした。

標準モジュールとして

Public Function txt_year_Validate(ByRef txt_year As MSForms.TextBox)
    Dim cvalue As Long
    Dim ret As Long
    ret = 0
    
    If txt_year.Text = "" Then
        MsgBox "年が入力されていません。"
        txt_year_Validate = 1
        Exit Function
    End If
    
    cvalue = Val(txt_year.Text)
    
    If cvalue < 2010 Or cvalue > 2050 Then
        MsgBox "2010~2050までの数字を入れてください", vbExclamation, "エラー"
        ret = 1
    End If
    txt_year_Validate = ret
End Function

こんな感じのを作ったり、保存するフォルダに同名ファイルがないかチェックしたりすると とかも使いますね。

Set fso = CreateObject("Scripting.FileSystemObject")

fso.FileExists()
fso.GetParentFolderName()
fso.GetFileName()
fso.MoveFile()

あとはシートの保護・解除のタイミングとかValidationの為のチェックが膨大になるので他のプログラミング言語のありがたみがよく分かります。

完成ではありませんが、使ってみたい方がいたら連絡下さい。

自分でテストはしてましたが、削除と改訂はほとんどやらないのでテストが足りないかも。