Excelマクロを使うと、処理量が多いデータなども一瞬で処理できるので便利です。
ただ、うまく動かすためには、Excelがどんな動きをするかも知っておくことが欠かせません。
Excelはアウトプットしやすいスキル
Excelはアウトプットがしやすいスキルの1つです。
せっかく本を読んでも、やってみないと自分のものにならないというのはよく言われることです。
ただ、PCスキルについては、仕事をしながら使えますし、磨けば仕事の効率も上がります。
Excel関数や特にマクロを書くと、まさにそう感じます。
会計処理にも使えるマクロ。
クラウド会計が多く利用されるようになり、データ連携もできるようになってきたものの、データ連携できない取引もまだまだ多いです。
そんなときにExcel関数やマクロを使うと、仕事の効率は上がります。
Excelマクロ超入門 マクロを書いてみたい人のための基本の「き」 | GO for IT
節税か?お金か? Excelマクロを使った法人税のシミュレーション | GO for IT
0円仕訳を削除するには?
今回のデータは、とあるサービスからダウンロードできるCSVファイルを、会計インポート用に加工したものです。(加工あり)
このデータ形式をマクロで処理して会計にインポートする流れです。
こんな感じで会計インポートの形式にマクロを使ってデータを変換しています。
販売金額と受取金額との差額は支払手数料という扱いで7行目以降で仕訳にしています。(販売金額と受取金額の差額から計算)
結果、販売金額と受取金額が同額の場合、つまり手数料が引かれなかったケースは、0円の仕訳パターンができあがります。
まぁ、0円仕訳が入っても特に数字上の問題はないのですが、
できれば、0円の仕訳を削除して、インポートファイルをつくりたいわけです。
経理データのExcelインポート入門(マネーフォワードクラウド編) | GO for IT
「Excelで行削除するとどうなる?」を考えてみると
ということで、この0円仕訳は、行削除することにします。
0円仕訳の削除が上手くいかないワケ
ここで使うのはマクロの繰り返し処理。
繰り返し処理は、「For〜Next」を使います。「i」は変数。「もし金額がC列の金額が0なら、行削除してね」という意味になります。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub sample '変数の宣言 Dim i Dim Max_Row Max_Row= Range("a" & Rows.Count).End(xlUp).Row ’金額が0なら行削除 For i = 1 to Max_Row If Range("c" & i).Value = 0 Then Range(i & ":" & i).Delete End If Next End Sub |
「For i =1 to Max_Row」で1行目、2行目…一番下の行まで、「0円なら行削除する」を順番に繰り返します。
「Range(“a” & Rows.Count).End(xlUp).Row」→A列の1番下の行番号を意味します。
上から順番に0円仕訳かどうかをチェックしていきます。
でも、実はこれだと上手くいきません。
上手くいかないそのワケはExcelの動きにあった
上から順番に動かしていくと、最初に0円仕訳に出会うのが、7行目。

7行目、セルC7は0円だ
7行目は0円仕訳なので、行削除される。
と、ここまでは問題ないのですが、問題はこの次。もともと8行目にあったデータが上につまり7行目に移動するわけです。

8行目にあったデータが行削除したことで7行目に移動…
でも、繰り返し処理は、そのまま進みます。「i」が8になり8行目をチェックしているとき、もともとの8行目は7行目に移動してしまったので、チェックをすり抜けてしまいました。
行削除があるたびに、データが上に移動していくので、

「i=11」のとき、データは11行目にはない…
結果として、0円仕訳は2つ残ってしまうことになります。
下から順番に行削除する
行削除したら、データが上に移動するというExcel特有の動きを踏まえて、記述する必要があります。
「For〜Next」の繰り返し処理を「1行目から最終行」ではなく「最終行から1行目」というように
書き方を「For i = 1 to Max_Row」を「For i = Max_Row To 1 Step -1」に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub sample '変数の宣言 Dim i Dim Max_Row Max_Row= Range("a" & Rows.Count).End(xlUp).Row ’金額が0なら行削除 For i = Max_Row To 1 Step -1 If Range("c" & i).Value = 0 Then Range(i & ":" & i).Delete End If Next End Sub |
下から順番にチェックすれば、0円仕訳があって行削除をしても、上には移動しないので、これなら問題ありません。

この書き方なら最下行から順番に7→6→5→4…とチェックしていく
普段は当たり前のように見ているExcelの動きなんですけど、マクロを書いて動かしてみて、「あ、そうか」となることも多いです。
でも、プログラミングは、普段やっている1つ1つの動きを再現する、という感じです。
マクロ、この記事のようなシンプルな内容から、実際に手を動かしてやってみるのがおすすめです。
【編集後記】
昨日は相続税の仕事を中心に。2022年秋、長久手市にジブリパークができるとのこと。これは楽しみです。
【昨日の1日1新】
※「1日1新」→詳細はコチラ
犬山市に資産証明請求