Excelマクロを書くときには、どう動かしたいかを1つずつ正確に伝えることが必要です。
マクロを書き始めたときに、見落としやすいと感じている点についてまとめてみました。
伝えたことしかやってくれない
Excelでマクロを書くとき、動かしたい順番で上から書いていきます。
書くときには、Excelでどういう動きをさせたいかを正確に伝える必要があります。
処理としては一瞬ですが、その間にやることはいくつもあります。伝えたことしかやってくれません。
もしやってくれないことがあるとしたらこちらの伝え方に問題があります。ただ伝えたことは確実にやってくれます。
このマクロは、ネットからダウンロードしたCSVファイルのデータを貼り付けて、仕訳のCSVファイルをつくるマクロです。

| 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 paypay() '1 シート[paypay」のデータをカウントし、コピー     Dim Max_row As Long     Max_row = Worksheets("paypay").Range("a" & Rows.Count).End(xlUp).Row     '前回の履歴を削除して新規コピー     Worksheets("paypay").Range("h3", "n" & Rows.Count).ClearContents     Worksheets("paypay").Range("h2", "n2").Copy Worksheets("paypay").Range("h3", "n" & Max_row) '2 シート「data」のデータをクリア     Worksheets("data").Cells.ClearContents '3 売上データをコピーして、シート「data」の1行目に貼り付け     Worksheets("paypay").Range("h1").CurrentRegion.Copy     Worksheets("data").Range("a1").PasteSpecial Paste:=xlPasteValues     ActiveWorkbook.Save '4 CSVデータを保存     Worksheets("data").Activate     Application.DisplayAlerts = False     ActiveWorkbook.SaveAs Filename:="import.csv", FileFormat:=xlCSV, Local:=True     ActiveWorkbook.Close     Application.DisplayAlerts = True End Sub | 
処理の流れとしてはこういうものです。
- 貼り付けたデータの数を数える
- 右の仕訳データをコピー
- 別シートに仕訳データを値複写する
- CSVファイルで保存する
- ファイルを閉じる
この流れを1つずつ順番に書く必要があります。
ひとがやっていれば、多少ゆうずうが効くことでも、プログラミングではやってほしいことだけを正確に伝える必要があります。
そして、マクロを書くときに注意したいのが、2回目以降の処理を想定しているかどうかです。
何度も使うことが前提
マクロを動かして処理することは、これから何度も繰り返してやることです。
ただ、マクロを書いたときは、エラーが出ずに想定しているとおりに動いたかどうかだけを考えがちです。
実際、わたしがそうでしたから。
ただ、同じことを2回目以降、処理するときはデータの数は違うのが普通です。
前回とデータ数が違うと、データを貼り付けたときに右側の仕訳のデータ数が足りないことがありますし、

前回、貼り付けたデータより今回貼り付けたデータが少ないと、前のデータが残ったままコピーして仕訳データをつくってしまうことがあるのです。
1回しかテストしていないと、それを見落とす可能性があります。
対策としては、一度右の数式の2行目以降を削除して、1行目の数式をコピーし直すというように書く必要があります。
ということで、先程の流れに2番と3番を追加しておくわけです。
- 貼り付けたデータの数を数える
- 右の数式の一番上を残して行削除(←ココ)
- 右の一番上の数式を左のデータ数だけコピー(←ココ)
- その結果できた右の仕訳データをコピー
- 別シートに仕訳データを値複写する
- CSVファイルで保存する
- ファイルを閉じる
それをこのように書いています。
| 1 2 3 4 5 6 7 | '1 シート[paypay」のデータをカウントし、コピー     Dim Max_row As Long     Max_row = Worksheets("paypay").Range("a" & Rows.Count).End(xlUp).Row     '前回の履歴を削除して新規コピー     Worksheets("paypay").Range("h3", "n" & Rows.Count).ClearContents     Worksheets("paypay").Range("h2", "n2").Copy Worksheets("paypay").Range("h3", "n" & Max_row) | 
そうすることで、前に処理したときのデータをいったん消すことが可能です。
そのうえで今回のデータ数にあった仕訳データを作成することができます。

同様に、別シートに値複写するときも、一度前の仕訳データを削除してまっさらにしてから、貼り付けをする必要があります。

それをこのように書いています。ClearContentsとすることで、前回に利用済みのデータをいったんけしてまっさらにしています。それから今回のデータを貼り付けます。
| 1 2 3 4 5 6 7 | '2 シート「data」のデータをクリア     Worksheets("data").Cells.ClearContents '3 売上データをコピーして、シート「data」の1行目に貼り付け     Worksheets("paypay").Range("h1").CurrentRegion.Copy     Worksheets("data").Range("a1").PasteSpecial Paste:=xlPasteValues | 
というように、マクロを書くときには、2回目以降に処理した場合でも同じような結果になるように書いておく必要があります。
こういうのはプログラミングをやってみて、気付ける視点でもあります。
Excelの確認画面の表示も動きの1つになる
Excelを動かしていると、Excelの確認画面が表示されることがあります。
たとえば、CSVファイルに保存するときには、このようなメッセージが表示されたり、

すでに保存場所に同じ名前のファイルがあれば、置き換えますかというメッセージが表示されます。

ただ、マクロを実行してから、ファイルを作成する流れにこのメッセージが表示されることで、動きが停まってしまいます。
そもそも、確認してもらう必要もないわけです。このメッセージを表示させないこともできます。
メッセージが表示される前のところで、
| 1 |     Application.DisplayAlerts = False | 
と書いておけば、前述のようなメッセージが表示されなくなります。
また、処理が終わったところで、
| 1 |     Application.DisplayAlerts = True | 
として、もとにもどしておけば大丈夫です。
結果として、このような書き方になります。
| 1 2 3 4 5 6 7 8 9 10 | '4CSVデータを保存     Worksheets("data").Activate     Application.DisplayAlerts = False     ActiveWorkbook.SaveAs Filename:="import.csv", FileFormat:=xlCSV, Local:=True     ActiveWorkbook.Close     Application.DisplayAlerts = True | 
マクロを書くときには、このような細部までどう動いてほしいかを伝えることが必要で、これがいい勉強になります。
これからマクロを書いてみようという方、あるいはマクロをやり始めたという方向けに、マクロをかいたときに見落としやすい視点について挙げてみました。
参考になればうれしいです。
【編集後記】
昨日はオフ。長女(13)の誕生日プレゼントを買いにららぽーとへ。バックがほしかったみたいで、かなりうれしそうでした。長男(6)もじぶんの誕生日プレゼントをもう考えていました。2月でまだ少し先のはなしですが。
【昨日の1日1新】
※「1日1新」→詳細はコチラ
伊予製麺


