未経験プログラマーの雑記

元個別指導塾運営者、現プログラマーによるブログです。教育や自身の学びについて発信していきます。

VBAコーディングの効率化~関数化と個人用マクロブック活用~

他の言語と比べてVBAが敬遠される理由の一つに、

「コードの使い回しにくさ」

があるんじゃないかなと思っています。

 

また、VBAを書きはじめてしばらくすると、

「なんか同じ処理を何度も書いててめんどくさいな」

と思うことも出てくると思います。

 

 

それを解消し、少しでもVBAのコーディングを楽にする方法を紹介したいと思います。

基本的には初心者向けの記事ですので、上級者の方の参考にはならないと思います。すみません。

 

※動画でも同じ内容を紹介していますので、文章だけよりも実際に映像で見たいという方はこちらへ↓

www.youtube.com

 

1.よく使用する処理の関数化

VBAを書く際、よく使う処理ってありますよね。

「この列の一番下の行を取得したい」とか、「この表の内容をCSVとして出力したい」とか。

 

最初の2、3回は、そういった処理をなんとか実装するのに調べながらコツコツ作るのも勉強になって良いと思いますが、それも5回、6回と繰り返すと

「理解しているのにいちいち書かなければいけないめんどくささ」が勝ってきます。

 

例えば「A列の一番下の行を取得する」は、

last_row = Cells(Rows.Count, 1).End(xlUp).Row

と書けば良いのですが、地味にめんどくさくないですか?

なので、この処理を

 

Function get_last_row(ByVal rng As Range) As Long
    get_last_row = Cells(Rows.Count, rng.Column).End(xlUp).Row

End Function

 

として関数化しておくと、

last_row = get_last_row(Range("A1"))

と書くだけで、指定した最終行を取得することが出来ます。

 

この処理であれば引数で渡す情報も、「どの列か」がわかれば良いので、数値でも良いですね。(というかその方が楽です)

Function get_last_row(ByVal col As Long) As Long
    get_last_row = Cells(Rows.Count, col).End(xlUp).Row

End Function

こう定義しておくと、

last_row = get_last_row(1)

と書くだけで、A列の最終行を取得することが出来ます。

 

頻繁にVBAを書けば書くほど、よく使う処理は0から書き始めるのではなく、関数化しておいたものを新しくマクロを作るブックにコピペして、その関数を使用するようにすると、コーディングは非常に早くなると思います。

 

2.個人用マクロブックの活用

ただ、関数をせっかく作っておいても、

「どのファイルに作った関数のコードが入っているか分からない」

「いちいちコードを保存しておくためのブックを作るのもめんどくさい」

「コードを保存してあるブックをいちいち開くのもめんどくさい」

という別の面でのめんどくささがあります。

 

その面倒を解消するために、「個人用マクロブック」の活用をオススメします。

・個人用マクロブックとは

一度個人用マクロブックを使用したことがあれば、その後どんなEXCELファイルを開いたとしても、VBE上に「PERSONAL.XLSB」というファイルが表示されるようになります。

 

このファイルにもVBAのコードを書くことが出来るので、

1.個人用マクロブックにVBAを記述する

2.完成したコードを本来マクロを必要としていたブックにコピペする

 

というふうにしておけば、自然と作った関数などもまとめて保存しておくことが出来、どのブックからでもそのコードをすぐコピペ出来るようになる、ということです。

 

・個人用マクロブックを使い始めるには

1.EXCELファイル上で「マクロの記録」を実行し、適当なセルを選択する

2.マクロの記録を終了し、マクロの保存先を「個人用マクロブック」にする

3.VBEを立ち上げ、ファイルに「PERSONAL.XLSB」が表示されていたらOK

 

・個人用マクロブックの本来の活用法

僕は最近個人用マクロブックを「使いまわしたいVBAの貯蔵庫」のようにも使っていますが、本来の使い方は別にあります。

 

それは、「色んなブックで使いたい処理を作っておくこと」です。

例えばVBAを書いている際、例えばM列1行目のセルを指定する場合、

Cells(13,1)

となりますが、Mって何番目だっけ?となり、コードを書きながら手を使ってアルファベットを数えるみたいな、すごく間抜けなことをしてしまったりします。(少なくとも僕はやらないとわかりません)

EXCELの列はもともとアルファベットで表示されていますが、EXCELの設定を変更すれば、数字に変えることも出来ます。

ただ、常に数字で表示されている方が良いかというとそういうわけではありませんので、「数字表記にしたり、もとに戻したりしたい」と考えますが、それを手作業でやるのはかなり面倒です。

 

その操作を一般的なEXCELファイルにマクロとして作っておいても、「そのファイルでしか」実行出来ないので、個人用マクロブックに作成しておき、ショートカットキーを登録しておくと、「どのファイルからでもショートカットキー一つで瞬時に実行出来る」ようになります。

 

他にも僕は

・今開いているブックをマクロ有効なブックにするマクロ

・今開いているブックのファイルパスとフォルダパスへのリンクを指定したファイルに作成するマクロ

なども作っています。この辺は次の記事にでもまとめようと思います。

 

まとめ

VBAのコーディングを少しでも効率化するために

1.頻繁に使う処理は自分の使いやすいように関数化しておく

2.関数化したものは個人用マクロブックに保存しておき、必要な時にそこからコピペし、自作関数を使い回す

 

この2つを意識的に実践することをオススメします。

ただ、自作の関数をあまり数多く使いすぎると可読性が下がるなどデメリットもあるので、関数を呼び出したところや関数を定義する部分に、コメントでどんな処理をしておくのか書いておくこともオススメします。

(自分だけが使うマクロなのであればそういう必要も無いかもしれませんが、他の人も使うようなツールになるのであれば、そういう配慮も大事です)

 

最後まで読んでいただきありがとうございました。

次の記事では具体的に、個人用マクロブックに作ってあるマクロをコードも含めて紹介したいと思います。

Twitterもやってます。良ければ気軽にリプライなどいただけると喜びます。

くぼ@テスター (@natsumemix2525) on Twitter