企業で請求書などを作成していると、同じ作業の繰り返しで、作業者によって、保存先などが異なるなど多々発生します。また、大手などでは管理システムなどもありますが、使い勝手が悪いということがよくあります。今回は、Excel VBAを使用して、簡単に請求書作成・管理システムを作る方法を紹介します。
・手作業で請求書を作るのが大変
・複数の請求書を管理するのが難しい
・同じことをずっと繰り返しているな~~。。。
こんな疑問を解決します。
ブログの対象者
・初心者のエクセルユーザー
・請求書作成に興味があるビジネスオーナーやフリーランサー
・事務作業で同じことを繰り返している人
今回は同じようにプログラムを作成すれば簡単なシステムを作ることができるようになります
実際にプログラムを動かすとこんな感じのシステムが作ることができます。VBAなのでPC持っていれば誰でもできます。
請求書作成システムを自分で作ることのメリット
- 効率的な請求書作成: 自動化されたシステムを使用することで、手作業での入力や計算を省略できます。
- 一貫性の確保: テンプレートを使用することで、一貫性のある請求書を簡単に作成できます。
- データ管理の改善: 請求書データを集中管理することで、請求書の履歴や支払い状況を追跡しやすくなります。
企業では資料がしっかり管理されていないものの、システムを作成するには費用がかかり、対応しないなどよくあるので、今回は簡単に自分で作る方法を紹介します。
必要な準備
Excelで請求書作成システムを自分で作成する前に、以下の準備が必要です。
3.1. Excelの基本知識
- Excelの基本的な操作方法やセルの入力、関数の使用方法などについての理解が必要です。セルの参照方法やセル範囲の操作など、基本的なExcelの機能に慣れておくと作業がスムーズに進みます。
3.2. VBAの基礎知識
- VBA(Visual Basic for Applications)は、Excelのマクロ言語です。VBAを使用して自動化機能を実装するために、VBAの基礎知識が必要です。VBAの概念、変数の宣言、条件分岐、ループ構造、関数やサブルーチンの作成などを学んでおくと良いでしょう。
3.3. サンプルファイルのダウンロードまたは提供
- 請求書作成システムを自分で作成する際には、サンプルファイルがあると作業がスムーズに進みます。サンプルファイルには、台帳シートや請求書フォーマットのシートなど、必要なシートや基本的な設定が含まれています。サンプルファイルをダウンロードするか、もしくはブログ記事の中で提供される場合もあります。
こちらについては、この後実際のコードを紹介します。
プログラムの作成手順
では実際にプログラムを作成していきましょう。
請求書作成システムを自分で作成するためには、以下の手順に従ってプログラムを作成します。これにより、Excelで請求書の自動化が実現されます。
- シートの設計
- 台帳シートの設計: C列に作成日、D列に件名、E列に支払期限、F列に振込先、G列に会社名、H列に郵便番号、I列に住所、J列に電話番号、K列に担当者、L列にリンクを表示する台帳シートを作成します。
- 請求書フォーマットのシートの設計: G1にNo、G3に日付、B6に件名、B7に支払期限、B8に振込先、B5に会社名、F6に郵便番号、F7に住所、F9に電話番号、F10に担当者を表示する請求書フォーマットのシートを作成します。
請求書台帳を下記のように作ってください。ボタンはまだ不要です。
請求書フォーマットを下記のように作ってください。
これでsheet の準備は完了です。今回のプログラムの流れは、下記です。
①台帳に項目を記載
②フォーマットのシートをコピーして、新規で作成。
③新規のシートに、台帳に記載した内容をすべて記入。シートの名前を変更。
④請求書作成の概略が完了。
⑤内訳を手入力する。←ここは毎回変わるはずなので人力で対応
⑥作成完了したら、PDF作成のボタンを押す
⑦ボタンを押すと、PDFファイルが自動で、年度の月のフォルダに自動で保存される。もしフォルダがない場合は、新規で自動で作成されPDFファイルが保存される。
⑧PDFファイルのリンクを台帳に表示する。
こんな流れになっています。ではやってみましょう。
実際のプログラムコード
プログラムコードはこんな感じで、請求書を作成する関数、PDFファイルを作成する関数、フォルダ内に指定のフォルダがあるかを確認する関数で作成されています。
これらを標準モジュールにすべてコピーして貼り付ければできます。
Sub CreateInvoice()
Dim ledgerSheet As Worksheet
Dim invoiceSheet As Worksheet
Dim lastRow As Long
Dim invoiceNo As String
Dim invoiceDate As String
Dim subject As String
Dim dueDate As String
Dim payee As String
Dim companyName As String
Dim postalCode As String
Dim address As String
Dim phoneNumber As String
Dim contactPerson As String
Dim lastCell As String
' 台帳シートを設定
Set ledgerSheet = ThisWorkbook.Sheets("台帳")
' 台帳シートの最後の行番号を取得
lastRow = ledgerSheet.Cells(Rows.Count, 3).End(xlUp).Row
lastCell = ledgerSheet.Range("B" & lastRow).Value
' 請求書フォーマットのシートをコピーして作成
ThisWorkbook.Sheets("請求書フォーマット").Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Set invoiceSheet = ActiveSheet
' 請求書のシート名をNoに変更
invoiceNo = "No" & lastCell
invoiceSheet.Name = invoiceNo
' 台帳シートから必要な情報を取得
invoiceDate = ledgerSheet.Range("C" & lastRow).Value
subject = ledgerSheet.Range("D" & lastRow).Value
dueDate = ledgerSheet.Range("E" & lastRow).Value
payee = ledgerSheet.Range("F" & lastRow).Value
companyName = ledgerSheet.Range("G" & lastRow).Value
postalCode = ledgerSheet.Range("H" & lastRow).Value
address = ledgerSheet.Range("I" & lastRow).Value
phoneNumber = ledgerSheet.Range("J" & lastRow).Value
contactPerson = ledgerSheet.Range("K" & lastRow).Value
' 請求書に情報を入力
invoiceSheet.Range("G1").Value = invoiceNo
invoiceSheet.Range("G3").Value = invoiceDate
invoiceSheet.Range("B6").Value = subject
invoiceSheet.Range("B7").Value = dueDate
invoiceSheet.Range("B8").Value = payee
invoiceSheet.Range("B2").Value = companyName
invoiceSheet.Range("F6").Value = postalCode
invoiceSheet.Range("F7").Value = address
invoiceSheet.Range("F9").Value = phoneNumber
invoiceSheet.Range("F10").Value = contactPerson
' 台帳シートの作成日に請求書の作成日を設定
' ledgerSheet.Range("C" & lastRow + 1).Value = Date
' メッセージを表示
MsgBox "請求書が作成されました。"
End Sub
Sub SaveInvoiceAsPDF()
Dim invoiceSheet As Worksheet
Dim invoiceDate As Date
Dim yearFolder As String
Dim monthFolder As String
Dim savePath As String
Dim pdfFileName As String
Dim ledgerSheet As Worksheet
Dim lastRow As Long
' 請求書のシートを設定
Set invoiceSheet = ThisWorkbook.ActiveSheet
' 請求書の作成日を取得
invoiceDate = invoiceSheet.Range("G3").Value
' 保存先のパスを作成
yearFolder = Format(invoiceDate, "yyyy")
monthFolder = Format(invoiceDate, "mm")
savePath = ThisWorkbook.Path & "\" & yearFolder & "\" & monthFolder
' 保存先のフォルダが存在しない場合は作成
If Not FolderExists(savePath) Then
On Error Resume Next
MkDir savePath
On Error GoTo 0
End If
' PDFファイル名を作成
pdfFileName = savePath & "\" & invoiceSheet.Name & ".pdf"
' 上書き確認のメッセージを表示
If MsgBox("Excelファイルを上書き保存しますか?", vbQuestion + vbYesNo) = vbYes Then
' PDFファイルとして保存
invoiceSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfFileName, Quality:=xlQualityStandard
MsgBox "PDFファイルが保存されました。"
' 台帳シートにPDFファイルのリンクを記録
Set ledgerSheet = ThisWorkbook.Sheets("台帳")
lastRow = ledgerSheet.Cells(Rows.Count, 3).End(xlUp).Row
' ledgerSheet.Range("L" & lastRow).Value = "●"
ledgerSheet.Hyperlinks.Add Anchor:=ledgerSheet.Range("L" & lastRow), address:=pdfFileName, TextToDisplay:="●"
Sheets("台帳").Select
End If
End Sub
Function FolderExists(folderPath As String) As Boolean
Dim folder As Object
On Error Resume Next
Set folder = CreateObject("Scripting.FileSystemObject").GetFolder(folderPath)
On Error GoTo 0
FolderExists = Not folder Is Nothing
End Function
実行するとこんな感じです。最初は表に各項目を記入します。ボタンをCreateInvoice()の関数として登録しています。
次にボタン(CreateInvoice())を押します。新しいシートが作成され、請求書が記載されます。ポップアップで請求書が作成されましたと出ます。Sheet名称は最初の台帳のNoの項目が記載されるようにしています。
この黄色の塗りつぶしの項目を記入します。例えば試験費・ジグ費用など適当に入れます。
こんな感じで入力しました。550,000円になります。これで、PDF作成ボタン(SaveInvoiceAsPDF())を押すと、Excelファイルを上書き保存しますか?と出します。(意味と言葉違いますが、意味はPDFファイルを保存しますか?)です。
もちろん、はいをおします。
すると、PDFファイルが保存されましたと表示されます。これでフォルダに保存されます。OKを押すと、最初の台帳に戻ります。ここで注目が、台帳にリンクができています。PDFファイルの保存先のリンクを表示することができます。
リンクをクリックすると、こんな感じでPDFを開くことができます。ファイルはフォルダに勝手に保存されます。
こんな感じで簡単に管理システムを作成することができました。誰でも簡単にPDFファイルで管理できるので、非常に便利です。Groupで使えば、このように一元管理することができます。
まとめ
以上の手順に従ってプログラムを作成することで、Excelで請求書作成システムを自動化することができます。初めてVBAを使用する場合でも、Excelの基本知識とVBAの基礎知識を活用しながら進めることができます。自分で作成することで、自分好みに簡単にカスタマイズすることができるのでお勧めです。