2025年6月21日
•約20分で読めます
請求書PDFの手入力にうんざりしていませんか?ExcelのVBAとAzure Document Intelligence(AI OCR)を使えば、請求書の内容を自動でExcelに転記できます。初心者でも実践できる方法を分かりやすく解説します。
毎月の請求書を PDF で受け取って、その内容を手作業で Excel に入力していませんか?
「また今月も何十枚もの請求書を一つずつ打ち込まなきゃ...」
「入力ミスがないか何度も確認して、時間ばかりかかる」
「もっと効率的な方法があるはずなのに...」
そんな悩みを抱えているあなたに朗報です!
Excel の VBA(マクロ)と Azure の AI OCR 技術を組み合わせれば、請求書 PDF の内容を自動で Excel に転記できるんです。しかも、プログラミング初心者の方でも大丈夫。今回は、その方法を一緒に実践していきましょう。
この記事を読み終える頃には、あなたも請求書処理の自動化ができるようになっています。月末の憂鬱な作業から解放されて、もっと価値のある仕事に時間を使えるようになりますよ!
「Azure Document Intelligence」って聞くと、なんだか難しそうですよね。でも心配いりません!
簡単に言うと、これはPDF や画像の中の文字を読み取って、データとして取り出してくれる AI サービスなんです。OCR は「Optical Character Recognition(光学文字認識)」の略で、要するに「画像の中の文字を読み取る技術」のことです。
従来の OCR との大きな違いは、AI が賢くなっているところ。例えば:
つまり、ただ文字を読むだけじゃなくて、請求書の内容を理解して整理してくれるんです。これってすごいことですよね!
「わざわざ VBA を使わなくても、他にもっと簡単な方法があるんじゃないの?」
そう思われるかもしれませんね。確かに、AI を使った文書処理サービスはたくさんあります。でも、Excel の VBA と AI を組み合わせることには、こんなメリットがあるんです:
新しいソフトを覚える必要がありません。いつもの Excel で、いつものように作業できます。データも見慣れた表形式で表示されるので、確認や修正も簡単です。
「うちの会社の請求書処理は少し特殊で...」という場合でも大丈夫。VBA なら、あなたの会社独自のルールに合わせて処理をカスタマイズできます。
専用のソフトを導入すると月額料金がかかりますが、この方法ならAzure Document Intelligence の利用料だけ。しかも、月 500 ページまでは無料で使えるんです!
大切な請求書データを外部のサービスに預けることなく、自分のパソコンで処理できます。セキュリティ面でも安心ですね。
要するに、慣れ親しんだ Excel の環境で、低コストで、安全に請求書処理を自動化できるというわけです。
さあ、実際に始めてみましょう!まずは Azure のアカウントを作って、Document Intelligence を使えるようにします。
ステップ 1:Azure アカウントの作成
初回登録なら200 ドル分の無料クレジット(サインアップ後 30 日間有効)がもらえるので、安心して試せますよ!
ステップ 2:Document Intelligence リソースの作成
ステップ 3:API キーとエンドポイントの取得
作成が完了したら:
これらの情報は後で VBA コードに設定するので、大切に保管してくださいね!
「でも、料金が心配...」という方も多いですよね。安心してください、Document Intelligence はかなり優しい料金設定になっています。
Free (F0) プラン:
Standard (S0) プラン(有料):
しかも、処理したページ数に応じた従量課金制なので、使わない月は料金がかかりません。「試しに使ってみたけど、思ったより使わなかった」という場合でも安心ですね。
月 500 枚なら、多くの中小企業では無料プランの範囲内で十分実用的に使えると思います。まずは無料で始めて、必要に応じて有料プランを検討すればいいでしょう。
※価格は米ドル表記です。ご契約時の為替レートにより日本円での請求額が変動します。
※詳細はAzure 公式サイトをご確認ください。
次に、Excel 側の準備をしていきましょう。VBA を使うために、いくつかの設定が必要です。
ステップ 1:開発者タブを表示する
これで画面上部に「開発」タブが表示されるようになります。
ステップ 2:参照設定を追加する
VBA でインターネット通信と JSON 処理をするために、必要なライブラリを追加します:
ステップ 3:JSON ライブラリをダウンロード
Azure Document Intelligence からのレスポンスは JSON 形式なので、VBA で JSON を扱えるようにします:
これで準備完了です!VBA で AI を使う環境が整いました。
まずは完成版のコードをご覧ください。一見複雑に見えるかもしれませんが、後で詳しく説明するので安心してくださいね。
重要:コードを使う前に必ず以下を変更してください
YOUR_RESOURCE_NAME
→ あなたが作成した Document Intelligence リソース名YOUR_API_KEY_HERE
→ 先ほどメモした API キーOption Explicit
' ------------------------------------------------------------
' Azure Form Recognizer (Document Intelligence) を使った請求書解析 VBA モジュール
' 事前準備:
' 1) VBA エディタの [ツール]→[参照設定] で以下を有効に
' - Microsoft XML, v6.0
' - Microsoft Scripting Runtime
' 2) GitHub「VBA-JSON」の JSONConverter.bas をインポートする
'
' 定数設定
Private Const ENDPOINT As String = "https://YOUR_RESOURCE_NAME.cognitiveservices.azure.com/documentintelligence/documentModels/prebuilt-invoice:analyze?api-version=2024-11-30"
Private Const API_KEY As String = "YOUR_API_KEY_HERE"
' メイン実行プロシージャ
Public Sub ParseInvoicePDF()
Dim pdfPath As String
pdfPath = Application.GetOpenFilename("PDF Files (*.pdf), *.pdf", , "請求書PDFを選択")
If pdfPath = "False" Then Exit Sub
Dim opUrl As String
opUrl = StartAnalysis(pdfPath)
If opUrl = "" Then
MsgBox "Operation-Location ヘッダーが取得できませんでした。", vbCritical
Exit Sub
End If
Dim resultJson As String
resultJson = PollAnalysis(opUrl)
If resultJson = "" Then Exit Sub
Dim jsonObj As Object
Set jsonObj = JsonConverter.ParseJson(resultJson)
WriteResultToSheet jsonObj
MsgBox "解析完了!シートを確認してください。", vbInformation
End Sub
' 解析ジョブ開始 → Operation-Location を返却
Private Function StartAnalysis(ByVal pdfPath As String) As String
Dim http As New MSXML2.ServerXMLHTTP60
http.Open "POST", ENDPOINT, False
http.setRequestHeader "Ocp-Apim-Subscription-Key", API_KEY
http.setRequestHeader "Content-Type", "application/pdf"
http.send LoadBinaryFile(pdfPath)
StartAnalysis = http.getResponseHeader("Operation-Location")
End Function
' PDF をバイナリで読み込む
Private Function LoadBinaryFile(ByVal filePath As String) As Variant
Dim stream As Object
Set stream = CreateObject("ADODB.Stream")
stream.Type = 1 ' adTypeBinary
stream.Open
stream.LoadFromFile filePath
LoadBinaryFile = stream.Read
stream.Close
End Function
' ポーリングしてステータス "running" から脱したら JSON 全体を返却
Private Function PollAnalysis(ByVal opUrl As String) As String
Dim http As New MSXML2.ServerXMLHTTP60
Dim status As String
Dim response As String
Dim jsonObj As Object
Do
Application.Wait Now + TimeSerial(0, 0, 1)
http.Open "GET", opUrl, False
http.setRequestHeader "Ocp-Apim-Subscription-Key", API_KEY
http.send
response = http.responseText
Set jsonObj = JsonConverter.ParseJson(response)
status = jsonObj("status")
Loop While status = "running"
PollAnalysis = response
End Function
' JSON オブジェクトから請求書情報を抽出してシートに書き込む例
Private Sub WriteResultToSheet(ByVal jsonObj As Object)
Dim fields As Object
Set fields = jsonObj("analyzeResult")("documents")(1)("fields")
Dim sht As Worksheet
Set sht = ThisWorkbook.Sheets(1)
sht.Cells.ClearContents
Dim row As Long: row = 1
Dim i As Long
' --- 請求書サマリ出力 ---
Dim summaryKeys As Variant
Dim summaryNames As Variant
summaryKeys = Array("CustomerName", "InvoiceDate", "DueDate", "SubTotal", "TotalTax", "InvoiceTotal", "VendorName")
summaryNames = Array("顧客名", "請求日", "支払期日", "小計", "消費税", "合計", "発行者名")
For i = 0 To UBound(summaryKeys)
Dim key As String: key = summaryKeys(i)
Dim fld As Object: Set fld = fields(key)
Dim outVal As Variant
Select Case fld("type")
Case "string"
outVal = fld("valueString")
Case "date"
outVal = fld("valueDate")
Case "number"
outVal = fld("valueNumber")
Case "currency"
outVal = fld("valueCurrency")("amount")
Case Else
outVal = ""
End Select
sht.Cells(row, 1).Value = summaryNames(i)
sht.Cells(row, 2).Value = outVal
row = row + 1
Next i
' 空行
row = row + 1
' --- 明細出力 ---
' 見出し
Dim itemCols As Variant
itemCols = Array("項目", "数量", "単価", "金額")
For i = 0 To UBound(itemCols)
sht.Cells(row, i + 1).Value = itemCols(i)
Next i
row = row + 1
' items 配列
Dim itemsArr As Object
Set itemsArr = fields("Items")("valueArray")
Dim itm As Variant
For Each itm In itemsArr
Dim itmFields As Object
Set itmFields = itm("valueObject")
sht.Cells(row, 1).Value = itmFields("Description")("valueString")
sht.Cells(row, 2).Value = itmFields("Quantity")("valueNumber")
sht.Cells(row, 3).Value = itmFields("UnitPrice")("valueCurrency")("amount")
sht.Cells(row, 4).Value = itmFields("Amount")("valueCurrency")("amount")
row = row + 1
Next itm
' 列幅自動調整
sht.Columns("A:D").AutoFit
End Sub
「うわー、コードが長くて難しそう...」と思いましたか?大丈夫です!実は、このコードは 4 つの簡単な処理に分かれているだけなんです。
Public Sub ParseInvoicePDF()
' PDFファイルを選択
Dim pdfPath As String
pdfPath = Application.GetOpenFilename("PDF Files (*.pdf), *.pdf", , "請求書PDFを選択")
' 以下、処理の流れ...
End Sub
これがメインの処理です。やっていることは:
まさに人間がやる作業と同じ流れですね!
Private Function StartAnalysis(ByVal pdfPath As String) As String
Dim http As New MSXML2.ServerXMLHTTP60
http.Open "POST", ENDPOINT, False
http.setRequestHeader "Ocp-Apim-Subscription-Key", API_KEY
http.setRequestHeader "Content-Type", "application/pdf"
http.send LoadBinaryFile(pdfPath)
StartAnalysis = http.getResponseHeader("Operation-Location")
End Function
ここではPDF ファイルを Azure に送信しています。
http.Open "POST"
→ 「データを送信します」という意味http.setRequestHeader
→ 「これは認証キーです」「これは PDF ファイルです」という説明を付けるhttp.send
→ 実際にファイルを送信送信すると、Azure 側から「処理中です。結果はこの URL で確認してください」という返事(Operation-Location)がもらえます。
Private Function PollAnalysis(ByVal opUrl As String) As String
Do
Application.Wait Now + TimeSerial(0, 0, 1) ' 1秒待つ
http.Open "GET", opUrl, False
http.setRequestHeader "Ocp-Apim-Subscription-Key", API_KEY
http.send
response = http.responseText
Set jsonObj = JsonConverter.ParseJson(response)
status = jsonObj("status")
Loop While status = "running" ' 処理中の間は繰り返す
End Function
AI の処理は時間がかかるので、1 秒おきに「まだ?」と確認しています。
Application.Wait
→ 1 秒待つstatus = "running"
→ まだ処理中status = "succeeded"
→ 処理完了!人間が「まだかな?まだかな?」と確認するのと同じですね。
Private Sub WriteResultToSheet(ByVal jsonObj As Object)
' 請求書の基本情報を取得
sht.Cells(row, 1).Value = "顧客名"
sht.Cells(row, 2).Value = fields("CustomerName")("valueString")
' 明細情報を取得
For Each itm In itemsArr
sht.Cells(row, 1).Value = itmFields("Description")("valueString") ' 項目名
sht.Cells(row, 2).Value = itmFields("Quantity")("valueNumber") ' 数量
' ...
Next itm
End Sub
AI から返ってきた結果をExcel シートに整理して書き込みしています。
まるで人間が請求書を見ながら手入力するのと同じ作業を、コンピューターが自動でやってくれるんです!
準備が整ったので、実際に請求書 PDF を変換してみましょう!
今回は、こちらのサンプル請求書を使って実際の変換過程をご紹介します。一般的な日本の請求書フォーマットで、会社名、請求日、明細項目、金額などが含まれています。
このような請求書でも、AI が自動的に各項目を認識して、きれいにExcelに整理してくれるんです。それでは実際にやってみましょう!
ステップ 1:コードを設定する
Private Const ENDPOINT As String = "https://あなたのリソース名.cognitiveservices.azure.com/documentintelligence/documentModels/prebuilt-invoice:analyze?api-version=2024-11-30"
Private Const API_KEY As String = "あなたのAPIキー"
ステップ 2:マクロを実行する
ステップ 3:結果を確認する
処理が完了すると、以下のような形でデータが表示されます:
ご覧ください!先ほどのPDFから、以下の項目が自動的にExcelに転記されました:
項目 | 値 |
---|---|
顧客名 | 株式会社サンプル |
請求日 | 2024/1/1 |
支払期日 | 2024/2/1 |
小計 | 220,100 |
消費税 | 17,600 |
合計 | 237,700 |
発行者名 | 株式会社ビットライト |
その下に明細表も表示されます:
項目 | 数量 | 単価 | 金額 |
---|---|---|---|
小型ロボット | 10 | 10,000 | 100,000 |
小型バッテリー | 100 | 1,200 | 120,000 |
説明書 | 1 | 100 | 100 |
所要時間:約 5〜10 秒
請求書の内容にもよりますが、通常は 5〜10 秒程度で処理が完了します。手作業なら数分かかる作業が、あっという間に終わってしまいます!
実際に使っていると、いくつかのエラーに遭遇することがあります。でも大丈夫!よくあるパターンと解決方法をまとめておきますね。
症状:コンパイルエラーが発生する
原因:Microsoft XML, v6.0 や Microsoft Scripting Runtime が有効になっていない
解決方法:
症状:実行時エラーで JsonConverter が認識されない
原因:VBA-JSON ライブラリがインポートされていない
解決方法:
症状:認証エラーが発生する
原因:API キーが間違っているか、古い
解決方法:
症状:ずっと「処理中」のまま終わらない
原因:PDF ファイルが大きすぎるか、形式が対応していない
解決方法:
症状:空白や文字化けが発生する
原因:請求書の形式が AI で認識しにくい
解決方法:
何かトラブルがあっても、落ち着いて一つずつ確認していけば、必ず解決できますよ!
基本的な請求書処理ができるようになったら、こんな応用もできますよ!
月末に溜まった請求書を一気に処理したいなら、指定したフォルダ内のすべてのPDFファイルを順番に処理する機能を追加できます。数十枚の請求書でも、ボタン一つで全部処理完了!
処理結果をCSVファイルで出力すれば、弥生会計やfreeeなどの会計ソフトに直接取り込めます。「仕訳データ」として使えるフォーマットで出力すれば、経理作業が劇的に楽になりますね。
処理結果に「確認者」「承認日」などの欄を追加して、ダブルチェック体制を組み込むことも可能です。AIが読み取った内容を人間が確認してから確定する、という安全なプロセスが作れます。
Document Intelligenceは請求書以外にも対応しています:
同じ仕組みで様々な書類処理を自動化できるんです。
処理結果をAccessやSQL Serverのデータベースに直接保存すれば、過去の請求書データを検索・集計・分析できるようになります。売上分析や取引先別の集計も簡単です。
Windowsのタスクスケジューラと組み合わせれば、毎日決まった時間に自動実行も可能。メールで受信した請求書PDFを自動処理するような、完全無人システムも作れます。
自社独自の請求書フォーマットが多い場合は、Azure Document Intelligenceでカスタムモデルを作成できます。学習データを与えることで、より高い精度での自動処理が実現できます。
処理完了時にメール通知やSlack通知を送る機能を追加すれば、チーム全体で処理状況を共有できます。
可能性は無限大ですね!まずは基本機能をマスターして、徐々に機能を拡張していきましょう。
お疲れさまでした!ここまで読んでいただき、ありがとうございます。
今回は、Excel の VBA と Azure Document Intelligence(AI OCR)を使って、請求書 PDF を自動で Excel に変換する方法をご紹介しました。
最初は「難しそう...」と思われたかもしれませんが、実際にやってみると案外シンプルですよね。人間の作業をそのままコンピューターにやらせているだけなんです。
この自動化を導入することで:
**「月末の憂鬱な作業」から「ボタン一つで完了する楽々作業」**に変わります!
技術の進歩によって、私たちの仕事はどんどん楽になっています。AI を「難しいもの」と敬遠するのではなく、「便利な道具」として活用していきましょう。
あなたの業務効率化の一助になれば幸いです。何かご質問があれば、お気軽にお声がけくださいね。
さあ、今日から請求書処理の自動化を始めて、もっと価値の高い仕事に時間を使いましょう!
代表取締役 CEO
大阪大学基礎工学部情報科学科卒業。大学時代はAIについて研究。10年以上のWebアプリ開発・データ分析経験を持つ。株式会社ビットライト代表として、生成AI・RPA・Excelなどを活用した業務効率化の専門コンサルティングを提供。
代表取締役 CEO
大阪大学基礎工学部情報科学科卒業。大学時代はAIについて研究。10年以上のWebアプリ開発・データ分析経験を持つ。株式会社ビットライト代表として、生成AI・RPA・Excelなどを活用した業務効率化の専門コンサルティングを提供。