VBA編其ノ1 触ってみる 接触編
ハイ、VBA編第1回目です。
今回、初っぱなということで、私のVBA体験からはじめようと思います。
でね、その中で特に聞いてもらいたいことっていうのは、私の失敗談なんです。
というのは、私の失敗を反面教師にしてほしいからなんです。
話はちょっと横道にそれるんですが、「受験体験記」ってあるじゃないですか。
「わたしは○○大学に合格しました!」ってヤツ。
アレね、合格者の話ばかり載ってるんです。
だけど、私いつも思うんですが、アレにね、落ちたヤツの話も載せた方が良いと思うんです。
というのはね、受かったヤツの話って、「1日1時間しか勉強しなかったけどおー、合格しましたあー」みたいなのもあって、すげームカついたり(笑)、まあそれはおいとくにしても、参考にならないことが多いんですよ。
ひとりひとり状況ってちがうじゃないですか。
ふだんの授業のレベルが高いから、1日1時間の自習で合格できた人もいるだろうし、元々能力が高かった人だっているだろうし。
あと、「たまたま合格できちゃった」って人も、中にはいると思うんですよ。
直前の模試と同じ問題が出た、とかね。
だから、合格者の話って、必ずしも参考になるかと言ったら、そうとは言い切れない部分があって。
それに対して、不合格になるのって、だいたい理由がありますよね。
だから、落ちた人の話を聞いて、それの真似をしないようにする、ということの方が、これから試験を受ける人にとってはずっと参考になると思うんですよ。
野球監督の野村克也さんの名言に、「勝ちに不思議の勝ちあり、負けに不思議の負けなし」とあります(元々はノムさんの言葉じゃないみたいですけど)が、失敗の原因を探り、明らかにしていくことが、今後勉強していく上で助けになるのではないか、と思うんです。
…まあ、試験に落ちた人って、たいてい口が重いですけどね…。
ということで、私のVBA体験。
私の場合、一度VBA勉強しようと志して、あっさり挫折しまして(笑)、「俺にはムリだな~」ってあきらめてた期間が2年ぐらいあるんですよ。
私とVBAのファースト・コンタクトは、とある会社で先輩社員のアシスタントとして仕事してる時でして。
で、その先輩がVBA使ってて、それ見てて「すげえな」って憧れた、っていうところまで前回お話しました。
このころは、先輩が組んだマクロを使わせてもらうだけ。
ただ憧れを募らせるだけの鼻タレ小僧でした。
で、今度は自分がメインで仕事する段になって。
効率化したいところがいろいろとでてくる。
以前なら先輩にマクロ組んでもらえばよかったけど、そうもいかない事情もあり、じゃあ一丁、自分でやってみようか、と一念発起したわけです。
で、勉強を始めたわけだけど、…上述のように、この時はあっさり失敗します。 今から考えると、この時期私がやってたことは、「勉強」とも呼べない稚拙なものでした。 ですが、この頃にやってたことを、一応まとめておきましょう。
<ステップ1.本を読んだ>
独習のセオリーです。
薄めの、やさしそうな内容のを1冊選んで買いました。
ですが、白状しますと、「読んだ」と言ってもこの時は、ただ目を通しただけです。
サンプルコードがあっても、手を動かしてみることはなく、眺めるだけ。
解説文を読んで、理解した気になっていました。
言い訳をしますと、このときは抱えてる仕事真っ最中で、じっくり本と向き合う時間がとれなかったんです。
また、仕事真っ最中ということもあって、当時私の頭の中を支配していた考えは、「1分でも早くマクロで仕事を効率化したい!」でした。
要するに、すぐに結果を求めていた、というワケ。
だから、本の理解もおろそかなまま、次のステップ2・3へ進んじゃうわけだけど、結果的にこれが、最後まで足を引っ張ります。
<ステップ2.マクロ記録を模索>
次に私がやったのは、「記録マクロ」の利用です。
だいたいのVBA解説書は、はじめの方でこの「記録マクロ」に紙面を割いてますよね。
しかし…、「僕の仕事にはコレは使えないな」とすぐに捨てました。
というのも、柔軟性がないからです。
例えば、180件の状態で記録しちゃったら、そこから1件でも増えるともうダメ。
これでは仕事になりません。
もちろん、ね、「マクロ記録で出てきたコードを、ちょこちょこと手直しして使う」ということができれば、また違った展開になったんでしょうけど…。
マクロ記録の使い途として推奨されているのは、このやり方ですよね。
けど、上述のとおり、本をまじめに読んでなかったもんで、どこをどう直せば良いかわからないんですよ。
ということで、上手くいかず。
<ステップ3.ネット上のコードを利用>
当時私は仕事で「ココを効率化したい!」というのが具体的にありました。
それは、「同じフォーマットのExcel、20コくらいあるヤツを、1つのシートに合体したい」というもの。
それを手っ取り早く実現したかったので、ネットで検索しました。
するとね、似たようなことをしたい人が質問とかしてたりして、コードが公開されてたりするんですよ。
なので、それをコピって使うことにしました。
で、何回かはうまくいってたんですけど…、あるとき、うまくいかなくなってしまって。
でね、ここで、もしコードをちゃんと読める人だったら、プロシージャを読み返して、「あー、ココが良くなかったんだ」と手直しできるんだけど、本をまじめに読んでいなかった僕は、やっぱり、どこをどう直せば良いかわからないんですよ。
というわけで、放り出してしまいました。
…今から考えると、「ネットで調べる」のは間違ってなかったと思う。
だけど、わからないままコピって使う、という姿勢がダメだったと思うんです。
まず、ネット上に転がっているものと、自分のやりたいことが、本当にぴったり一致しているのかというと、そうとも限らないでしょう、と。
やはり、自分に合ったモノは、自分で組み立てるのが一番だと思うのです。
だから、ネット上の情報は、参考程度にとどめるべきであって。
また、よしんばぴったり一致していたとしても、それをわからないまま使うのは問題です。
「わからないまま使う」っていうのは、「コードの内容を理解しないまま使う」っていう意味ね。
それだと、マクロがブラックボックス化しちゃいますよね。
そうなると、うまくいかない事態に陥ったとき、対処できなくなっちゃいます。
コントロールできない道具ほど、恐ろしいものはありません。
というわけで、わたしのマクロ初挑戦は、見事失敗しました。 今から振り返ると、本をちゃんと読まなかったのがすべての原因なんですが、当時のわたしには残念ながら、そんなことはわかりません。 心のどこかで「マクロ使えたらかっこいいのになー」とは思いながらも、特に何もすること無く、季節は巡り。
それからしばらくして。2年ぐらい経ったかな。
仕事がひと段落した時期があったんですよ。
で、やっぱり自動化したいところが(前述のヤツの他にも)いくつか出てきたので、もう一回チャレンジしてみよう、と思ったんです。
時間もあったし。
でね、今度は、前回の反省を踏まえて、こんなふうに↓してみたのです。
<出直しステップ1.本を読んで、手を動かす>
出直しということで、本も買い直しました。
このとき使ったのは、大村あつしさんの『かんたんプログラミング Excel VBA 基礎編』。
Excelのバージョン(2003とか、2007とか、2010とか)ごとに出ているので、ご購入を検討される方はご自分のExcelに合ったものを。
また、「基礎編」の他に、「応用編」「コントロール・関数編」もありますが、初学者はとりあえず素直に「基礎編」から始めましょう。
で、今回は、読みながら、ちゃんと手を動かすことにしました。
サンプルコードが出てきたら、自分で書いて、動かしてみる。
これをひたすらやりました。
もちろん中には、「コレホントに仕事で使えるのかな~?」っていうのもありました(本の内容に問題があるわけではなくて、単に「私の」仕事とマッチしなさそう、という意味で)が、そういうのもとりあえず一度はやってみることにしました。
一冊終えるのに、1カ月くらいかかったかな。
<出直しステップ2.とにかくやってみる>
本を読んだら、後は実戦です。
前述のとおり、僕は「ココとココを自動化したい!」というイメージが具体的にあったので、実現に向けてコードを書きはじめました。
しかし、…最初は全ッ然書けません。
本なら一度全部読んだし、手も動かしたはずなのに…。
どのくらいダメかというと、「新しい列を1列挿入する」というプログラムもわからない始末。
手作業ならマウス合わせて右クリックで一瞬なのにね…。
びっくりするくらい初歩的なところでもつっかかりまくり、その都度本をめくり直しました。
で、やっと少し書けたと思って、動かしてみて、止まる…。
再度本をめくる…、の繰り返しです。
けど、繰り返しトライしているうちに、稚拙ながらもプロシージャを1コ書きあげることができました。
でね、1コ書けるようになると、芋づる式に書けるようになるんですよ、これホント。
こうして僕は、VBA初級の入口に、なんとか、かろうじてですが、立つことができました。
失敗した時と、今回の出直しプランの最大のちがいは、本を読みながら実際に手を動かしてみたところですね。
先述の大村あつしさんのテキストには、基本的なコードの例がたくさん登場します。
それこそ、「セルに色を塗る」とか「となりのシートを見に行く」みたいな、ひとつひとつはかんたんなものばかりです。
でも、「習うより慣れろ」と言いますが、これらを一度体験したことによって、VBAの基礎体力がついたと思います。
もちろん、実際に仕事で使うコードを書く段になると、足踏みするところがたくさん出てくるんですよ。
ある意味、それは仕方がない。
理解が足りない部分、筋力の劣る部分というのは、どうしても出てきます。
そういうときは、もう一回調べれば良いんです。
「再読からが本当の勉強」という言葉もありますし。
でも、あらかじめ勉強してた、と言うか、基礎体力をつけていたからこそ、再度本をめくって調べられるわけで。
それがないと、「何を調べて良いかわからない」→「あきらめよう」のダメスパイラルに陥ってしまいます(1回目の挑戦の僕のように)。
なので、みなさんも、信頼できる本なり、サイトなり、教科書となるものを見つけて、「とにかくたくさんコードを書いてみる」っていうのが、上達の近道だと思います。
…なんかあまりにありきたりな結論で、読んでるみなさんとしてはおもしろくないでしょうけど…。
さて。勉強法の話はこのぐらいにして。
みなさんにもコードを書いてもらいましょう!
ここからが今日の本題です。
まず、新しいExcelをひとつ、開いてください。
それに、「マクロ練習」とか適当な名前をつけて保存しましょう※1。
今後はこれを、マクロ専用のExcelとして使っていきます。
<拡張子のハナシ>
上の画面では.xlsの拡張子を使用していますが、マクロを含むExcelには.xlsmを使うのが一般的です。
これまでずっと触ってきたマクロなしのExcelでは拡張子は.xlsxでしたね。
ですが、マクロありのときは.xlsmを使います。
「マクロのm」と覚えてください。
(上画面の拡張子.xlsはExcel2003まで使用されていた拡張子で、マクロなしでもマクロありでも使えます。
それだけ聞くと便利な拡張子に思えますが、.xlsだと最大処理件数や使用できる色などに制限が加わってしまいます。
なので、特別な理由がないかぎり拡張子は.xlsxないし.xlsmを使う方が無難です。
…ま、このサイトでは、昔書いた記事そのままなので.xlsのまま進行しちゃうんですけど…。)
次に、Visual Basic Editor(略してVBE)を起動します。
VBEっていうのは文字通り、Visual Basicを編集するもの。
要するに、マクロ書くための専用ノートですな。
とりあえずコイツを開きたいので、「開発」タブ→「Visual Basic」のアイコンをポチってください※2。
Excel2003の方は、「ツール」→「マクロ」から入ってくだされ。
おおっと! 「開発タブって何?」って方もいらっしゃると思います。 というのはこの「開発タブ」、初期設定で表示されてないことがあるんですよ。 そういう方は、officeボタン→Excelのオプションへ進んでもらって、「基本設定」の「[開発]タブをリボンに表示する」にチェックを入れてください※3。
開発タブが表示されたら、※2のように、VBEを起動してくださいね。
起動したら、こんな画面↓※4出てくると思います。
初めての方、びびってます?
今まで見たことない画面ですもんね。
僕はパチンコに1回だけ行ったことがあるんですが、未体験者にとってパチンコ屋って、魔の巣窟というか、ものすごい怖い屋敷に見えるんですよ。
すぐカツアゲされちゃうんじゃないか、みたいな。
ま、結局そんなことにはならなかったんだけど、パチンコに限らず、初めてのことっていうのはやっぱり怖いです。
少しずつ、慣れていきましょうか。
私もご一緒しますので。
何なら、一回閉じます?※5
もう一回開いてみましょう。※6
大丈夫?2回目だから、さっきより怖くなくなりましたよね。
じゃあ、ちょっと画面を眺めてみましょう。
ココ※7に注目。
ここに「Sheet1」「Sheet2」「Sheet3」ってありますね。
これは、今開いてるこのExcel(「マクロ練習.xls」)にはシートが3枚ありますよ、ってことなんです。
つまり、「マクロ練習.xls」の状態を表してる、ってワケ。
なので、もし「マクロ練習.xls」のシートが1枚だけだったら、ココにも「Sheet1」しか表示されなくなります。
このことは、ちょっと心に留めておきましょう。
さて、実はココにね、「標準モジュール」ってヤツを追加したいんです。
なので、下画面↓見ながらついてきてください※8 ※9 ※10。
できました?
さっきの「Sheet1」「Sheet2」「Sheet3」の並びに、「module1」が追加されたと思います。
そして、画面真ん中にメモ帳みたいなのがドン!と出現したはずです。
これから、VBAのコードをココに書いていくことになります。
では、さっそく書いてみましょう。
「sub メッセージ1」って書いて、enter押してください※11。
「sub」と「メッセージ1」のあいだは半角アキでお願いします。
ちなみに「メッセージ1」っていうのは、これから書くマクロの名前ね。
enterで確定すると、「End Sub」って行が自動的に追加されるはずです※12。
この「Sub ○○○」っていうのは、マクロの第1行目に必ず書く文言なんです。
で、さっきも言ったように、「○○○」の部分がマクロの名前。
つまり、「sub メッセージ1」っていうのは、「これから「メッセージ1」って名前のマクロを書きますよ」って意味なんです。
そして、「End Sub」っていうのは、マクロの終わりに書く決まり文句。
終わりに絶対書く文言だから、自動的に追加される、というワケ。
でね、この「Sub ○○○」と「End Sub」のあいだに、VBAの中身を書いていくことになります。
あ、そうそう、「End Sub」が追加された他にも、いろいろ変わったところ、ありますよね。
例えば、最初に入力した「sub メッセージ1」の「sub」、色が青に変化して、先頭文字が大文字になりました。
あと、「メッセージ1」の「1」を、わたしは全角で入力したのですが、半角に直されていたり、タイトルのおしりにカッコ()が追加されたり。
これらは、特に解説はしないのですが、「そういうものだ」と思っておいてください。
ハイ、ではいよいよ。
「Sub メッセージ1()」と「End Sub」のあいだに、「msgbox "はじめまして"」と入力してください※13。
「msgbox」っていうのは、「メッセージボックス」のこと。
メッセージボックスっていうのは、エラーが出たときとかに警告メッセージを出してくる、アイツのことです。
普段Excelを使っているときだと、エラーメッセージってあまり見たくないものだし、表現も硬い、面白くない、お役所仕事みたいな日本語を突き付けてくるんですが、今回はそのメッセージボックスに、こちらの好きなことばを表示させてやろう、というワケです。
そして、「msgbox "はじめまして"」という記述は、「「はじめまして」という文言のメッセージボックスを表示させる」という意味になります。
あ、そうそう、「msgbox」と「チョンチョン""」は半角ね。
VBAは、今回の「はじめまして」みたいに、日本語文字列を入力するとき以外は基本半角なので。
あと、「msgbox」と「チョンチョン""」のあいだも、半角スペース空けてください。
あ、あとね、細かいことなんですが、「msgbox~」の前にTabを入れて一段下げてほしいんですよ。
これは、読みやすくするための気遣いなんです。
なので、お手数ですが。
入力し終えたら、enterで確定。
すると、「msgbox」のところが「MsgBox」と大文字になります※14。
これでマクロ記述はおしまい。 上書き保存しておきましょう。
それでは、今書いたマクロを、さっそく動かしてみたいと思います。 VBEじゃなくて、ふつうのワークシートの方へ戻っていただいて、「開発」タブ→「マクロ」をクリック※15。 2003の方は「ツール」→「マクロ」ね。
そうすると、こんな画面↓※16が出てきます。
われわれがさっき作ったマクロの名前が載ってますね。
コイツを選択して、実行しましょう!※17
Marvelous!
成功です!
どうでしたか?
マクロを動かした感想は。
…うーん、正直地味ですよね(笑)。
でも、メッセージボックスって意外と使う場面多いんですよ、ホントに。
せっかくなので、もう1コ作りましょう。
今度は、みなさんの好きなことばをメッセージボックスに表示させてください。
何でも良いですよ。
「結婚、…しないか?」とかでもOK(笑)。
いやいや、恥ずかしがらずに。
あまり関係ない話ですが、わたしの知り合いに、Excelの読み上げ機能を使ってExcelに愛のことばをささやかせる、ということをやっていた猛者(女性)がいました。
棒読みなのであまりおもしろくなかったそうです。
さて、書き方は、さっきの「End Sub」から1行空けて、さきほどと同じように書いてみてください。
僕もやってみましょう※18。
2コ目のマクロ「メッセージ2」を書き始めると、1コ目のマクロとのあいだに自動的に区分線が引かれます。
さて、ではでは、コイツを動かすと…※19。
もし改行をしたいのであれば、chr(13)というのを使います。 改行したいところに「 & chr(13) & 」と入力してください。 「&」の前後、chr(13)の前後は、半角スペース空けてくださいね。 また、1行目の文章と2行目の文章は、それぞれチョンチョン""で囲ってください。 つまり、1行目の文字列と2行目の文字列を、chr(13)をはさんでつなぐ、というワケ。 こんな感じに↓※20 ※21。
ということで、みなさんも好きなセリフ、Excelに言わせてみてください。