現在のところ、以下の7つのEXCEL VBA講座がある。
それと、読者の皆さんの疑問に答えるシリーズも開始した。
タイトル |
質問者さん(敬称略) |
|
第一回目 | 【ワレコEXCEL講座】エクセルファイル①をエクセルファイル②に読み込む | しがない事務員 |
当記事はそのEXCEL VBA講座の第二回目。
さて、皆さん
第一回目のVBA講座をお読みいただきましたでしょうか?
もし読んで頂いた方々は、多数のデータが有っても一瞬でハイパーリンクを張る処理が出来たので感動された人も多いだろう。
しかし、初心者の人が挫折するのはここからだ。
つまり、ワテが書いた簡単なVBAのサンプルプログラムを実行したら確かに動いた。
でも、自分でVBAプログラムを作る手順がサッパリ分からないという点だ。
何から手を付けたら良いのかが分からない。
まさにワテが初めてVBAプログラミングに挑戦した時に直面した問題だ。
当記事では、VBA初心者の人がプログラムをどのようにして作成すると効率良く書けるのか、その実践的な手法を紹介したい。
市販のVBA教科書の問題点
VBAの本を読むと、確かにVBAの文法などが詳しく記述されている。
多くの関数が紹介されていて、引数の与え方なども詳しく書かれている。
でも、そういう本はある程度はVBAを分かっている人が見て役に立つのだが、初心者の人が見てもはっきり言って何の役にも立たない。
初めて英会話を勉強する人が、いきなり5cmくらいの厚みの英語の辞書を使って英会話を勉強するみたいなもんだ。
それじゃあ、英会話の上達は難しいだろう。
初心者向けと書かれているVBAの本にありがちな事
一方、初心者向けと書かれているVBAの本もある。
昔のワテも買ってみた事がある。
その手の本では、確かに簡単なサンプルプログラムが書かれていて、初歩的な事は理解できる。
でも、その手のサンプルプログラムは初心者の人にとって応用が効かないのだ。
つまりサンプルプログラムがまさに自分がやりたい処理ならそれで良いのだが、一般には自分がやりたい処理とサンプルプログラムの処理が完全一致している場合は少ない。
従って、サンプルプログラムを自己流に編集して手直しすれば、原理的には自分のやりたい事は出来る。
そこが初心者の人が挫折する最大の壁なのだ。
第一回目のワテのVBA講座ではおかきの会社名にそのホームページのハイパーリンクを張ったが、そういう処理を探していた人にとってはそれでやりたい事が出来る。
でも、実際の状況ではいろいろなケースが考えられる。
例えば、
- 特定の会社名を見つけたらそのセルの色を黄色にしたい。
- 会社名を五十音順で並べ替えたい。
- 重複している会社名がある場合には削除したい。
- ㈱、(株)、(株)など各種の株式会社の省略形が使われているのを統一したい。
- 会社の住所のデータが不完全で、例えば郵便番号が無いデータも混じっている場合があるので、そういう不完全データを見つけたら郵便番号を補って完全な住所データにしたい。
などなど、考えればまだまだいくらでも出て来る。
初心者の人がこういうプログラムを書きたいと思っても、何から手を付けたら良いのかサッパリ分からないだろう。
こんな処理をしたいのだが、そういう場合はどうすれば良いの?
初心者向けと銘打っている本は、往々にして応用が効かない。
まあ、それは本が悪いと言うよりもプログラミングの初心者が誰でも直面する問題ではある。
そこから必死でネットを検索しまくって知識を身に付ければプログラミングは上達はする。
でも、なかなか一人でそんなレベルに達するのは難しい。
そう言う疑問に答えられる本が良いVBA入門書だろう。
おかきの会社にハイパーリンクが張るサンプルプログラムをどう改良すれば上記例の郵便番号を補うなどの処理が出来るん?
誰もが疑問に思うだろう。
本記事では、ワテの経験に基づいて応用の効く実践的VBA入門記事を目指している。
VBAプログラミングで自分がやりたい処理を実現する為の具体的な手順
さて、前置きが大変長くなったが、VBAプログラミングで自分がやりたい処理を実現する為の具体的な手順を紹介したい。
ハイパーリンクの例でやってみよう。
つまり、多数のセルにハイパーリンクを張らなくてはならない。
それをVBAで自動化したい。
さあどうするか?
まず、マクロを覚える。
マクロとは何か?
“マクロ” と言う単語だけだとプログラミングの世界では複数の意味に解釈されるので分かり辛い。
今の場合はエクセルマクロという意味のマクロに限定する。
百聞は一見に如かずなのでエクセルのマクロを試してみる。
開発タブのマクロの記録をクリックし実行する
図1. マクロの記録を実行する
マクロの記録をクリックするとこんな画面が出る(下図)
図2. マクロの記録ダイアログが出たらそのまま OK ボタンをクリック
このダイヤログウインドウの意味が良く分からなくても良いので、兎に角 OK ボタンをクリックする。
クリックすると、勝手にウインドウが消えるが何も起こらない。
でも、実はマクロの記録と言う機能がエクセルの裏で動いている。
さて、(株)三幸さんにハイパーリンクを張るために、三幸さんのアドレスをマウスで選択する(下図)。
図3. マクロ記録中(会社のアドレスを選択)
あとは、普通にハイパーリンクを張る作業を続ければ良いので、どんどん進んで行く。
図4. マクロ記録中(コピー実行。CTRL+Cでも良い)
会社のホームページのアドレスをコピーして(上図)、ハイパーリンクを張るメニューを出して、
図5. マクロ記録中(会社名を選択してハイパーリンクメニューを出す)
三幸さんの会社名を選択して、そのアドレスを貼ってOKをクリック。
図6. マクロ記録中(アドレス欄に三幸さんのアドレスを入れてOKクリック)
図7. マクロ記録中(無事にハイパーリンクが貼れた)
無事にハイパーリンクが張れた(上図)。
そしたらここでマクロの記録終了をクリックする(下図)。
図8. マクロの記録(記録終了ボタンをクリック)
さて、マクロはどこに記録されたのか?そのマクロとは一体何者なのか?
標準モジュールの中にModuleが二個になっているだろう(下図赤枠)。
今まではModule1のみだったが、今記録したマクロがModule2に自動保管されている。
図9. マクロを探す(標準モジュールの中に保存された)
上図に示すようにEXCELのマクロとは、Sub関数の事である。
その中味は、マクロの記録開始ボタンをクリックしてからマクロの記録終了ボタンをクリックするまでの一連のキーボード操作、マウス操作が全て記録されているのだ。
マクロは人が行った一連の作業を全部記録している
下のコードがマクロの記録機能で自動記録されたものだ。
三幸さんの名前に三幸さんのホームページのアドレスのハイパーリンクを貼った一連の手順が全部記録されている!
Sub Macro1() ' ' Macro1 Macro ' ' Range("C7").Select ActiveCell.FormulaR1C1 = "http://www.sanko-seika.co.jp" Range("B7").Select ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _ "http://www.sanko-seika.co.jp", TextToDisplay:="(株)三幸" End Sub
コード4. マクロの記録で自動生成されたVBAコード
ほんまかいな?
疑う人もいるだろう。
では、
マクロを実行してみる
実行する前に、まず三幸さんの名前に張ったハイパーリンクを削除しておく。
その為には取り消し(UNDO)を実行しても良いし、あるいは、右メニューからハイパーリンクの削除を実行しても良い。
青い下線も消えてハイパーリンクの削除が出来たら、マクロを実行してみる。
その為には、上に示したModule2のSub Macro1()を表示しておいて、関数内を適当にマウスクリックしてカーソルを置いておく。
あるいは下図のようにブレークポイントを置いても良い。
このあたりのやり方は第一回目講座で説明した関数の実行方法と同じだ。
図10. マクロを実行する
無事にマクロが実行出来たらEXCELのシートを見てみよう。
再び三幸さんの名前に青い下線が出ていてハイーパーリンクが張れているだろう。
つまり、マクロの記録を使うと自動的にプログラムが書けるのだ。
マクロの記録を利用すると自動的にプログラムが作成出来る
EXCELにおけるこのマクロの記録機能は、他のプログラミング言語ではあまり見かけない便利な機能である。
ここまでの手順を無事に実行出来た人は、もうお分かりだろう。
つまり、VBAを使って自分がやりたい処理をプログラミング化する場合には、マクロの記録機能がとっても役に立つ。
ワテの経験では、VBA開発のまあ半分くらいはマクロの記録かな。
特に初心者の人の場合には、VBAの文法を知らなくてもマクロの記録が勝手に正しいVBAコードを自動生成してくれるので、それをコピペして自分のコードの中に貼り付けて利用すれば良いのだ。
ワテも今でもマクロの記録を使いまくっている。
上級者になったら頭の中にVBAの文法が記憶出来ているのでマクロに頼る機会は減る。
でも、上級者の人でもたぶんマクロの記録機能はよく使っていると思う。
マクロの記録で記録されたコードは必ずしも最適化されていない
なお、マクロの記録で記録されたコードは必ずしも最適化されてはいない。
なので、例えば余分なコマンドがコードに含まれていたり、冗長な記述になっている場合もある。
でもまあ、そのまま貼り付けて使えば自分がやったのと同じ結果が得られるので、便利ではある。
もし、速度が要求される処理を書いていて、少しでも効率よくコードを書きたい場合には、マクロの記録で記録したコードを自分で手直しして最適化出来るようにする技術を身に付けると良いだろう。
その為には、マクロの記録で記録されたコードの意味を一つずつ解読して行って、不要そうなコードを除去して結果がどうなるかなど試行錯誤して勉強すると良い。
モジュールやマクロは削除しても良い
なお、マクロの記録実験を繰り返していると標準モジュール(Module)の中にSub Macro()と言う関数ががどんどん増えて行く(下図)。
Sub Macro1() ・・・ End Sub Sub Macro2() ・・・ End Sub
マクロの記録で自動生成された Sub MacroN()と言う関数は不要なら削除する
これらは、その中味をコピペして利用したらもう不要なので関数ごと削除してしまってもよい。
あるいはModuleファイルそのものを削除しても良い。
そうすると、次回再びマクロの記録を実行した場合には、自動的にModuleファイルも追加されるので。
なお、マクロの記録に用いたModuleファイルを削除する場合には、うっかり間違えて自分で作成したModuleファイルを削除しないように注意する必要がある。
Moduleの削除方法
Moduleの削除方法は、そのModuleの上で右クリックすると、
Moduleの解放
と言うメニュー項目があるのでそれを実行する(下図)。
Moduleの解放を実行すると以下の確認画面が出る。
削除する前にModule1をエクスポートしますか?
と確認されるので(下図)、
もし念のためにその内容をファイルに保存しておきたい場合には、[はい]をクリックしてエクスポートしておく。そうすると、いつでもインポートして読み込む事が可能だ。
もし[いいえ]を選択すると、永久に削除されるので注意する事。
繰り返しになるがウッカリ他のModuleを消してしまうなどと言うミスもあるので要注意だ。
なので、Moduleを削除する場合には、ワテの場合には取り敢えず今作業中のブックを一旦ファイルに保存しておいて(拡張子はマクロ有りの .xlsm)、そのブック自体を
Book1.xlsm (今作業中のブック)
Book1-001-おかき会社にハイパーリンクを張るマクロの練習.xlsm(バックアプ)
のようにバックアップを取っておくようにしている。
そうすると、今作業中のブック(Book1.xlsm)でどんな失敗をしても、バックアップがあるので安心だ。
まとめ
VBAで自分のやりたいプログラムを書きたい場合には、まずマクロの記録機能を使って作業手順を記録する。
例えば、「あれ、セルの色を変更するコマンドはどんなんだっけ?忘れた。」
そういう場合には、マクロの記録を実行して、セルの色を変えてみる。
それでModule3などにマクロが記録されたら、セルの色を変えるVBAコードをコピペして利用する。
そしたらもうModule3は無くても良いので削除する。必要ならまたマクロの記録をすれば良いし。
そんな感じでどんどん試すのが良い。
それで自動生成されたVBAコードを自分のプログラムに組み込んで利用する。
あとは、For Next文を組み合わせてループ処理をして多数の列、多数の行に対して一気に処理を行えばよい。
必要に応じてIF文、Select文を組み合わせると、特定のセル、特定の行、特定の列、あるいは特定の状況の場合のみに処理を行うなどが可能だ。
例えば上で述べた郵便番号を補う処理に関して言えば、
- 住所情報を持っているセルの値を読み取る
- 郵便番号があるかどうか判定する
- 無い場合には住所情報を元に郵便番号を生成して補う
と言う処理をForループの中に入れれば実現可能だろう。
住所情報から郵便番号を取得するサービスは世の中に多数あるので、EXCEL VBAの中からそういうWEBサービスを呼び出して住所から郵便番号変換を実行する事も可能だ。
これで貴方もVBAを使って自作のプログラムをいくらでも書けるようになるだろう。
その為にはこのマクロ記録機能テクニックを使ってVBAプログラムを書く訓練のみだ‼
本を読む
次の講座はこちら
第三回目
コメント