VBA の本1冊理解して、いざ実務作業を自動化するぞ! と思って取り組んだのに、手が止まってしまった……そういう方、いらっしゃるのではないでしょうか?
私も最初の頃は途中で手が止まってしまう経験を何度もしました。
いくつもの業務を自動化する中でスムーズにコードを書くコツがだんだん分かるようになりました。
そこで、当時の私のように基本はできているはずなのにVBAのコードが書けず悩んでいる人へ向けて
- 自動化に取り組もうとすると手が止まってしまう理由
- スムーズにVBAのコードを書けるようになる方法
を解説していきます。
せっかく挑戦したVBA、あなたが諦めることなく自動化を行うことができるようになれば嬉しいです。
コードが書けない(手が止まる)原因とその解決方法
まず、何が原因で手が止まってしまったのか考えてみましょう。
私や後輩の場合、以下の状態の時うまくコードが書けず手が止まってしまっていました。
- そもそも業務の手順や判断方法があいまい
- どこから手を付けたらいいのか分からない
- メソッドやプロパティが分からない
- 自動化の難易度が高い業務にいきなり取り組んだ
- 全ての工程を自動化しようと考えている
- どこで想定外の動きをしているのか分からない
- エラーの対処法が分からない
それぞれ詳しく説明をしていきたいと思います。長いので自分の手が止まってしまう原因が明確な場合はそこまでスクロールしてくださいね。
原因1:そもそも業務の手順や判断方法があいまい
人って優秀で、なんとなくで仕事ができてしまいます。けれども、コンピューターは明確に指示をしなくてはならず、なんとなくこんなことをやる、なんとなくこういう時にはこういう風にする、ではコードは書けません。
コード(機械に指示する言語)を書く前に日本語に言語化しましょう。あなたが普段業務をする際に何を行っているのか? を細かく箇条書きにしていきましょう。
箇条書きの例
- B列の後ろに列を追加する
- A列とB列を結合した結果をC列に入力する
- D列の値が「12未満」の場合は、その行を赤文字に変更する
かなりの項目数になると思いますが、面倒でもこの部分をきちんとしておくと、コードを書くときにとても楽になります。
また判断をしなければいけない箇所があるのなら、その判断方法は数値で判定するなど明確にしましょう。
もしあなたの手元に「新人でも人に尋ねずに業務ができるマニュアル」が存在しているのなら、この工程は不要です。わざわざ行わなくても、マニュアルをもとにコードを書いていけば手が止まらずに書けるはずです。
- 工程を細かく箇条書きにする
- 判断方法を明確にして、誰でも同じ結果になるようにする。
原因2:どこから手を付けたらいいのか分からない
やりたいことを明確にする
何がやりたいのか、はっきりと答えられますか?
意外と言葉で伝えられないことが有りますよね。でも、ゴールが決まっていなければコードが書けないのは当然です。やりたいことをはっきりと定義しましょう。
フローチャートを書く
工程A、工程B、工程C、工程D……とあってそのまま順に行っていくだけなら、VBAの本を1冊やり遂げたあなたなら、どこから手を付けたらいいのか分からないという状況には陥らないはず。
どこかに分岐か繰り返しが存在していませんか?
フローチャートを書いて分岐や繰り返しをはっきりさせてみましょう。
正しくフローチャートを書こうと思うと、処理ごとの図形を覚える必要がありますが、自分が使うだけなのでそこまでしなくて良いです。
Excel等でしっかり図を書く必要はなく、
- 工程を処理する順番に箇条書きにする
- 分岐する箇所は「判断方法」と「分岐後の処理」を書く
- 繰り返し箇所は箇条書きの横を括弧でくくり、「どのような条件の間繰り返すのか」を書く
をメモできれば大丈夫です。
この時、繰り返しの条件がうまく書けないのなら、繰り返し方法の書き方を一部知らない(覚えていない)可能性があります。(初心者向けの本だと、記載が少ないこともあるので……)
For~NextとDo~Loopの使い方を確認してみてください。(≫【VBA】繰り返しはどれを選んだらいいの? For~NextとDo~Loopの違いと使用時のポイントを解説)
- やりたいこと(ゴール)を明確にする
- フローチャートを書く
- 繰り返し方法のコードの書き方を復習する
原因3: メソッドやプロパティが分からない
マクロの記録を活用する
Excelには手動で行っている作業をコードに起こしてくれる機能が存在します。
- 「開発」タブの「マクロの記録」をクリック
- マクロの記録ウィンドウが表示されるので、「OK」をクリック
- 処理を行う
- 「開発」タブの「記録終了」をクリック
上記手順を行うと、③で行った処理のコードがモジュールに記載されます。中身を確認して、自分が知りたかったメソッド・プロパティを確認しましょう。
書式設定など、たいして操作していないはずなのに、とても長いコードが記録されることが有ります。
メソッド・プロパティを選択してキーボードの「F1」を押すと、インターネットで検索が行われます。単語1つずつ、そのコードは何をしているのか? 各プロパティは省略可能か? を確認してきましょう。
メソッド・プロパティが理解できたら、実際にコードを書いていきましょう。
「VBA ○○(やりたいこと)」で検索をする
インターネットの海の中には先人たちが残してくれたコードがいっぱいです。VBAはそんなにニッチな言語でもないので、「VBA オートフィルタ」などでで検索したらほぼ出てきます。
中には自分がやりたいことそのまま! なコードがあるかもしれません。それを参考にコードを書いていきましょう。
- マクロの記録を活用する
- 「VBA ○○(やりたいこと)」で検索する
※自分が理解していないコードは、必ずインターネットで理解できるまで調べましょう!
原因4:自動化の難易度が高い業務にいきなり取り組んだ
あなたが自動化に取り組もうとしている業務は、1枚のエクセルシートで完結する内容ですか? 複数のExcelファイルを使用するものですか? ……それとも、Excel以外のアプリケーション操作が必要でしょうか?
あなたがやりたいことによってかなり自動化の難易度が変わってきます。
いきなり難易度が高い業務から自動化を行おうとすると、絶対に脱落をしてしまいます。
難易度の目安としてはこんな感じです。
- エクセルシートの加工
- 複数のExcelを開いて、データを加工
- フォルダ関連を操作(フォルダの削除、ファイル名の修正など)
- WordやOutlookなどExcel以外のアプリケーションを操作する
初心者向けの書籍だと①、多くても③までしか載っていません。
なので、初めて自動化しようとしたのに「④Excel以外のアプリケーション操作」をしようと思ったら、手が止まってしまって当然です。
だって、やっていないことにいきなり挑戦しようとしているんですもの。
あなたの本当に自動化したいことがアプリケーション操作だとしても、順々に簡単な業務から自動化して、ステップアップしていきましょう。
ちなみに、最初に自動化するのにおすすめな業務は「CSVデータの加工」「印刷設定」です。VBAはExcel操作だけなので比較的簡単です。また、手動で行おうと抜け漏れが出やすい業務なので、自動化する価値がありますよ。
簡単な業務から自動化に取り組む(アプリケーション操作が必要な業務は後回し!)
原因5:全ての工程を自動化しようと考えている
1つのボタンをクリックしたら、バババババって処理が行われて完成! っていうの憧れますよね。
判断方法が難しかったり、今の自分のスキルレベルでは実装が難しい箇所が1ヶ所でもあると、手が止まってしまいます。
永遠と悩むよりは、できない箇所はできないと諦めて、できる箇所のみ自動化しましょう。
判断が難しい箇所、自分の現在のプログラミングスキルでは難しい箇所は無理に自動化しようとしない
原因6: エラーの対処法が分からない
エラーが起こった場合はエラーメッセージウィンドウが表示されますので、「デバッグ」ボタンがある時はそのボタンをクリックしてください。
どこの部分がエラーを起こしているのか確認しましょう。この時点で修正方法が分かった場合は、修正を行いましょう。
再度コードの実行をして、エラーメッセージが表示された場合は、エラー内容をインターネットで検索して、何が原因でエラーを起こしているのか確認しましょう。
例:「インデックスが有効範囲にありません」で検索する
エラー内容をインターネットで検索する
原因7: どこで想定外の動きをしているのか分からない
変数の宣言を強制する
モジュールの一番上にOption Explicitの記載をしていますか? もし、ない場合は必ず記載をするようにしましょう。
Option Explicitがあると、宣言 (Dim 変数 データ型) していない変数が存在した場合に、コードの実行を行うとすると、実行する前にエラーが起こるようになります。
どこで想定外の動きをしているのか分からないことに困っているのに、エラーが起きるように設定するの?
と思われるかもしれません。
想定外の動きをしている原因が変数かもしれないので、変数の宣言を強制することによって、その可能性を少しでも減らします。
例えば、あなたが数字が入っていると思っていた変数に、実は文字列が入っていると、当然想定通りに動かなくなります。この場合、データ型まで指定して変数を宣言していれば、おかしなデータが入った時点でエラーメッセージが表示されます。
そのため、なるべく変数の宣言時はデータ型も指定しましょう。
こまめに実行をして、理想通りの動きをしているか確認する
長いコードを書きあげて実行(▶)をしたら、結果が理想通りにならなかった。数十行あるコードのどこでおかしなことになっているのか探すのはとても大変です。
そうならないために、ある程度コードを書いた時点で実行して、正しい結果になっているか確認しましょう。こまめにチェックするほうが1度にエラーの確認をするよりもはるかに楽になります。
ローカルウィンドウ・イミディエイトウィンドウを利用する
理想通りの動きをしていない場合は、1行ずつずつ実行して、動きや変数の中身を確認しましょう。動きはそのまま確認できますね。
一方、変数の中身は、ローカルウィンドウやイミディエイトウィンドウを利用して確認しましょう。
ローカルウィンドウ
実行しているコード内に登場する変数の名前・値・データの型が一覧で表示されます。
ローカルウィンドウが表示されていない場合は、「表示」→「ローカルウィンドウ」をクリックしてください。
イミディエイトウィンドウ
?変数 で変数の中身を表示します。ローカルウィンドウとは違い、コードに関係なく値を確認することが出来ます。
例えば、イミディエイトウィンドウに「?range(“AQ1”).Column」と入力して「Enter」を押すと、AQ1セルの列番号43が次の行に表示されます。
また、「Debug.Print」の結果もイミディエイトウィンドウに表示されます。
ローカルウィンドウが表示されていない場合は、「表示」→「イミディエイトウィンドウ」をクリックしてください。
- 変数の宣言を強制する
- イミディエイトウィンドウ・ローカルウィンドウを利用して変数の中身を確認する
- こまめにコードを実行して、理想通りの動きをしているか確認する
まとめ
以上、私や後輩が自動化に取り組んだ時に、手が止まってしまった原因とその解決方法でした。
- コードを書く前に、業務で何をしているのかを言語化しておく
- マクロの記録やインターネット検索をして、メソッドやプロパティを調べる
- 問題なく動くかをこまめに実行して確認する
- Excelのみで完結する業務から自動化に取り組む
- すべての処理が1ボタンで終わることを諦める
無事、あなたがコードを書きあげて少しでも時短に成功しますように!
コメント