請求書来るやん?
あなたは、いつもどうやって科目を決めて会計処理していますか。
マクロ(VBA)を使えばある程度の科目を自動で入力することができるのです。
ある程度あたりをつけて、ソートして科目をポチポチ入力するなんて、老害がやることです!
今回はそのマクロの内容と作り方を初心者でも理解できるようにお伝えします。
目次
効果を発揮する請求書は物品購入!?

この科目を自動で入力するマクロが一番力を発揮するのは、アマゾンビジネスやモノタロウ、たのめーるといった、細々した物品を購入した際の請求書処理をする時です。
だから、総務系の人には是非使ってほしいマクロです。
私の部署では、アマゾンビジネス、アスクル、たのメール、モノタロウといった事務用品等を購入するサイトを使用しており、毎月数百明細に科目を割り振って支払い処理をしております。
このマクロを作るまでは、VlookUpや様々な関数を駆使して処理をしていたのですが、膨大な時間がかかるし、どんどん俗人的な作業になっていき、しかも明細が増えるごとに処理が重くなっていきました。
そんなとき、ふと勉強中のマクロ(VBA)である程度自動化できるんじゃね?と思い。2-3時間考えて作ってみたら想像以上にあっさり自動化できたのでその内容をお伝えします。
このコードは素人が作ったものなので、使用は自己責任でお願いします。
科目自動仕分けに必要な物
科目を自動で決めるために必要な物は3つです。
- 請求データ
- 明細と科目が紐づいたリスト
- マクロ
まず、請求データが必要となります。大手の通販サイトは基本的に請求データがダウンロードできるので問題ありません。
↓こんな請求明細

また、紙の請求書しか発行してくれていない取引先でも、「請求書のデータをくれ」と言えば意外とあっさりくれたりします。お願いするのはただなので言ってみるのもありです。
次に、明細と科目が紐づいたリストですが、これは後で詳しく説明しますが、例えば
・ティッシュ ⇒ 消耗品費
・イス ⇒ 消耗備品費
・キズテープ ⇒ 福利厚生
ぐらいの、「明細にそのテキストが入っていたら絶対この科目!」みたいなリストです。
これが、今回紹介するマクロの肝になります。
最後に当たり前ですがこのリストを元に科目を自動で入力するマクロが必要となります。
科目を自動で仕分けするマクロの全文!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Sub Kamoku() Dim ix1 As Long '明細の行番号 Dim ix2 As Long '科目リストの行番号 ix1 = 3 ix2 = 5 Do Until ThisWorkbook.Sheets("明細").Cells(ix1, 5) = "" ThisWorkbook.Sheets("明細").Cells(ix1, 10) = "" ' Do Until ThisWorkbook.Sheets("Main").Cells(ix2, 2) = "" If InStr(ThisWorkbook.Sheets("明細").Cells(ix1, 5), ThisWorkbook.Sheets("Main").Cells(ix2, 2)) > 0 Then ThisWorkbook.Sheets("明細").Cells(ix1, 10) = ThisWorkbook.Sheets("Main").Cells(ix2, 3) ix2 = 5 Exit Do End If ix2 = ix2 + 1 Loop ix1 = ix1 + 1 ix2 = 5 Loop End Sub |
たったこれだけです。
要するにやっていることは、明細のテキストを科目リストのテキストで1つづつ検索しているイメージです。
まずは行番号の指定と貼り付け先のクリア
1 2 3 4 5 6 7 8 9 10 11 |
Dim ix1 As Long '明細の行番号 Dim ix2 As Long '科目リストの行番号 ix1 = 3 ix2 = 5 Do Until ThisWorkbook.Sheets("明細").Cells(ix1, 5) = "" ThisWorkbook.Sheets("明細").Cells(ix1, 10) = "" Do Until ThisWorkbook.Sheets("Main").Cells(ix2, 2) = "" |
今回、請求明細は3行目から始まっていて、科目リストは5行目から始まってるので、それぞれ、3と5を指定しています。
また、今回は請求明細が空白になるまで処理を進めるので、Do until ~で明細が空っぽになるまで処理をしろ!という命令と、
貼り付け先をいったんクリアする.Cells(ix1, 10) = “” の式を書いています。(仮にこの式が無かった場合、検索の結果対応する科目がなかったら、前入力した内容が残ってしまうため)
最後に、請求明細ごとに科目リストをすべて検索しろという
Do Until ThisWorkbook.Sheets(“Main”).Cells(ix2, 2) = “”
式を書いています。
今回のコードの肝はInStr関数である!
1 2 |
If InStr(ThisWorkbook.Sheets("明細").Cells(ix1, 5), ThisWorkbook.Sheets("Main").Cells(ix2, 2)) > 0 Then ThisWorkbook.Sheets("明細").Cells(ix1, 10) = ThisWorkbook.Sheets("Main").Cells(ix2, 3) |
何をしているかと言うと、科目リストのテキストが請求明細に含まれているか確認しています。
InStr(〇検索先〇,●検索元●)という式で、検索元のワードが検索先に含まれるか(厳密に言えば何文字目か)どうか確認する式です。
含まれている場合は左から数えて何文字目かの数字を返してくれます。
要するに、含まれていれば1以上が帰ってきて、含まれていなければ0となるのです。
なので、今回の式
If InStr(ThisWorkbook.Sheets(“明細”).Cells(ix1, 5), ThisWorkbook.Sheets(“Main”).Cells(ix2, 2)) > 0 Then
If~~>0 thenとすることで、含まれていれば、それに対応する科目.Cells(ix2, 3)を貼り付け先.Cells(ix1, 10) に貼っています。
科目リストを作る際の注意点
①科目リストの検索文字列はできるだけ具体的に
どういうことかと言うと、どのような明細にも当てはまるテキストを書いてしまうと誤爆をしてしまうということです。
例えば、カッター刃と書けばほとんど消耗品費で間違いありませんが、カッターとしか書かなかった場合、据え置きカッター台(消耗備品費)という商品があった場合も、消耗品費として処理してしまいます。
なのでできるだけ具体的にかつ、広範囲をカバーできるような検索文字列を記入してください。(ここら辺の感覚はやっていけば大体わかるようになります。)
②検索はリストの上から行われる
①の注意と少しカブるのですが、具体的な名称は出来るだけリストの上の方に置き、抽象的なワードはリストの下の方に置くようにしましょう。
そうすれば、具体的名称でこぼれ落ちた明細が抽象的なワードでカバーできるようになります。
この逆をやってしまうと、①で注意した意図していない科目が明細に入力されてしまいます。
小型のマクロでも業務は短縮できる
今回ご紹介したマクロはかなり小型の物でした。
しかし、見ていただいた通り、威力は抜群だったと思います。
Vlookや目視でポチポチやっていた処理を一瞬でざくっとできてしまうんですから。
私は機械8割、人間2割ぐらいの処理負担が一番バランスいいと思います。
機械10割にすると絶対どこかで無理がでてきますし、機械の割合が低すぎても効率が悪いですし。
この他にも現場ですぐに役立つマクロをご紹介していますので、是非他の記事も読んでください!