ひとりで仕事をするようになって、それまで以上にExcelを使っています。
Excelマクロを使うと、仕事の効率化にもつながると実感していますが、注意点もあり、気をつけていることをまとめてみました。
Excelマクロの使いどころ
Excelマクロを使うと、効率化につながります。
Excelの関数でできるところは、Excelで対応すれば問題ないのですが、繰り返し処理する場合や手でやっている処理を自動で動かす場合には、マクロが必要になります。
今回のデータはこういったものです。売上のデータが28行目まで入っています。
やりたいことは次のようなことです。
- シート「data」のA列のデータがいくつあるかを数える
- データの数だけF2からK2にある数式(仕訳データ)をデータの数だけ下にコピーする
- 仕訳データをコピーして、シート「CSV」にコピーする
このくらいのデータであれば、Ctrl+Cでコピーして、Ctrl+Vで新しいシートに貼り付けて、F12をクリックしてCSVファイルで保存すればいいのかもしれません。
ただ、データやシートがたくさんあり、月ごとにやらないといけないとなるとそれなりに積み重なって負担になります。
何度もやらないといけない、コピペを繰り返すということであれば、Excelマクロを使ってみるのも手です。
何よりもわたしが手でやるよりは、はるかに速いです。
マクロを書くときに注意しているポイント
マクロを書くにあたって、次のようなことを気をつけています。
手でやっていることを順番に書き出してみる
マクロは上から順番に処理されていきます。
ということで。手でやるならどう動かしたいか?を箇条書きにしておきます。
- シート「data」のA列のデータがいくつあるかを数える
- データの数だけF2からK2にある数式(仕訳データ)をデータの数だけ下にコピーする
- 仕訳データをコピーして、シート「CSV」にコピーする
というように。
これを順番にマクロで書いていきます。
1つ書いたら動かしてみる
最初の「A列のデータがいくつあるかを数える」を書いてみます。
1 2 3 4 5 6 7 |
Sub uriage() '1 A列の最終行を取得 Dim max_row As Long max_row = Worksheets("data").Range("A" & Rows.Count).End(xlUp).Row End Sub |
1つ書いたら、F8をクリックして、ひとまず動かしてみます。と、これから動くところが黄色に反転します。
この時点で、max_rowという変数にカーソルをあてると、「max_row=0」となっていますが、さらにF8キーを押してみると、黄色い部分の記述が実行され、「max_row=28」に変わっています。
これで、28行のデータがあることを確認できました。
そして、次の記述をしていくという感じです。
もし、記述がまちがっていたら、赤く反転したり、黄色く反転して動きが止まります。
Endの前の「.」がないだけですが、間違いです。正しく書かないと反応してくれません。
これ以外にもマクロは動くけど、列がずれているなど思わぬ結果になるエラーもあります。
まとめて書くとどこがエラーなのか?原因がわからなくなることもあり、結局迷宮入りすることがあります。
わたしはありました。
1つずつの方がミスを見つけやすく、かえって早いです。手間ですが少し書いては、動かしてみるようにしています。とくに最初のうちは。
行間をあける
行間をあけておきます。
つまっているよりは、行間があいていたほうが読みやすくなります。
コメントしておく
書いた記述には、コメントをつけておきます。(緑色の説明部分)
コメントをしていないと、他人が見たときに何をやっているのかが伝わりません。
というか、じぶんがしばらく経って見直ししたときにもわからなかったりします。
コメントは文頭にShift+7で「’」をつけて書きます。「’」をつけておくとコードとして扱われません。
特定の記述の動きだけを確認したい場合には、他の記述をコメント扱いにすると、緑色に反転して、反応しなくなります。
つまり、上の図で1→2→3のところ、1→3の順番で動いていきます。
インデントする
インデント(字下げ)、あったほうが、記述のかたまりがわかりやすくなるので、やっておきます。
ひとまず動かしてミスを見つける
今回の内容をこういった感じにまとめてみました。
これで手順通りにはなったと思うのですが、実際に動かしてみると、足りないことに気づきます。
このマクロを繰り返し使う場合、データ数がいつも同じとは限りません。
前に処理したときは、データが30行あったけど、今回は28行だったという場合もあり、その場合には28行目までは、今回のデータが反映されますが、一番下の2つのデータはゴミとして残ったままとなります。
つまり、求めた結果と違う結果になります。
そうならないように、前回のデータを削除してキレイにしておく必要があります。
これでいいかと。
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 |
Sub uriage() '1 A列の最終行を取得 Dim max_row As Long max_row = Worksheets("data").Range("A" & Rows.Count).End(xlUp).Row '2 シート「CSV」のデータをクリア Worksheets("CSV").Cells.ClearContents '3 シート「data」のデータをクリア Worksheets("data").Range("F3", "K" & Rows.Count).ClearContents '4 F2からK2の数式をコピーしてデータ貼り付け Worksheets("data").Range("f2", "k2").Copy Worksheets("data").Range("f3", "k" & max_row) '5 仕訳データをコピーして、シート「CSV」の1行目に貼り付け Worksheets("data").Range("F2").CurrentRegion.Copy Worksheets("CSV").Range("a1").PasteSpecial Paste:=xlPasteValues '6 A列の書式を「yyyy/mm/dd」に Worksheets("CSV").Columns("A").NumberFormatLocal = "yyyy/mm/dd" ActiveWorkbook.Save End Sub |
動かしてみるとこんなイメージ
シート「data」のA列のデータ数を数えた後、
シート「CSV」を前回のデータを一度削除して、
まっさらな状態に。
シート「data」では、F列からK列のの3行目以下はデータをいったんクリア、
今回のデータの数だけ2行目の式をコピー。
できた仕訳データをコピーして、
シート「CSV」に貼り付けるというのが、今回マクロで自動でやる流れです。
手でやっていると、なんとなくやっていることなのですが、プログラミングの場合は、そこもしっかり書かないといけません。
ただ、こういう視点には、実際にマクロを書いて試してみないとなかなか気づけません。
正確に伝えないと、間違った答えになるので、効率化としても、伝え方を学べるという意味でもExcelマクロを買いてみるのは、おすすめです。
Excelマクロに興味がある方の参考になれば、うれしいです。
【編集後記】
昨日はお客様と打合せ。決算見込みや今後の対策などについて話をしました。18時頃に工作教室にいった子どもたちを徒歩で迎えに行きましたが、通る道が違っていたようですれ違いに。その後に見つけて追いつこうとしたら、「きたー」とにげられましたけど…。
【昨日の1日1新】
※「1日1新」→詳細はコチラ
nichibo