ブログを始めてみたけれど・・・

ただのオッサンのひとり言が多いです

VBA基本

書くことがないので。

以前「VBA始めました」 という記事を書いたが続くネタが思い浮かばないのでこんなことを書いてみる。

Sub test()
MsgBox "VBA始めました"
End Sub

たとえばその記事でのコードはこれだけだが、何のためのコードか、どんな動作かメモしておきたい時がある。

そんな時は行頭にアポストロフィー(' 数字キー7のところにある)を打つ。

Sub test()
'コメントです この行に書かれたことは無視されます
MsgBox "VBA始めました"
End Sub

のように。昨日書いたコードは覚えていても、2ヶ月、半年経つと自分が書いたことも覚えていないことがあるのでコメントは大事(もちろん誰が書いたコードかでなく、何をするコードか、書き換えた時の影響が推測できるようなコメント)。

あと、一時的にその行の処理を退避したいとき(他のコードを試したい、うまく動かないコードを特定するため、など)にコメントは有用。 

Sub test()
'MsgBox "VBA始めました"
Range("A1").Value = "VBA始めました"
End Sub

とすると、メッセージボックスは表示されずセルA1にメッセージが入力される。他の方法を試すときにいちいちコードを書き換えていたら元に戻すのが大変なのでね、こんな使い方も覚えておいたらよいです。

なので複数行を一気にコメントにしたい場合があるが、そんな時はコメントにしたい行を選択してVBEのメニューから操作したら楽です。元に戻す(コメントを取り消す)こともできます。

また、

Sub test()
MsgBox "VBA始めました" 'コメントです
End Sub

のようにコードの後にメモのように残すこともできますのでコメントを活用してください(コードが見づらくならない程度にね)。 

最近ネット上で、若い女性の写真とともに「プログラミング教えて」というような広告?を見るので、VBA(というMicrosoftのOffice上で使えるプログラミング言語)の始め方をちょっとやってみた。

ま、プログラミングそのものを教えるのは大変だが、プログラミングを勉強するのにVBAは始めやすいのではないかと思って。エクセルやワードを使っている人、とりあえずパソコンに入っている人は多いでしょ?

上に書いたとおりVBAはワードやパワーポイントでも使えるのですが、エクセルでマクロ(VBAで書くプログラム処理)を作成するかたちで説明を進めます。エクセルの操作までいかないので画面の表示が違う程度です。

※最後まで書いてから追記
思いつきではじめて長々と書いてしまい言葉の使い方が混在(VBAとコード、マクロ、プログラム、その他)しているような。
わかりづらい部分、間違いに気づけばその都度修正するかもしれないし、放っておくかも。

その程度の記事です。



で、エクセルでVBAを書くために新規にワークブックを用意してほしいのですが、ここで注意。バージョン2007(Excel2007)以降マクロを作成する場合ファイルの拡張子が限定されます。新規ファイルのままだとマクロを使えないファイルの種類になってしまうのでマクロを使えるファイル種類で保存しなおしてください。
VBA-1
新規作成で「Book1.xlsx」となっているファイルを「名前をつけて保存」メニューからファイルの種類を「Excel マクロ有効ブック(*.xlsm)」を選択して保存します(保存場所が分からなくならないように、よく使うフォルダ、デスクトップなどを指定)。

次にマクロのコードを書く環境を用意します。エクセルの画面が表示されている状態で「AltキーとF11キー」を一緒に押してください。下のような画面が表示されましたか?
VBA-2
ここでエクセルの上に表示されたのはVBE(Visual Basic Editor)といって、マクロを作成(コードを書いたり実行したり)できるエクセルに付属するソフトです。コードそのものはメモ帳やテキストエディターで書いたり保存できますが、エクセル上でマクロを実行する場合はすべてVBEに記入してから実行します(外部のファイル、コードを取り込むこともできるようですが私はやったことありません)。


VBEが表示されたら「挿入」メニューから「標準モジュール」をクリック。
VBA-3

VBE右側のグレーだった部分が白くなる(または白いウィンドウが表示される)ので、そこに書くのがVBAのコードになります。

sub  test

とまず半角で入力してください。単語を区切るスペースも半角です。尚、コードとして全角で英数字、スペースを入力してもVBEが半角に置き換えます(セルに入力する文字列などデータとして扱うものは全角でも大丈夫)。
VBA-4
(迂闊でしたが、一番上の「Option Explicit」という行はVBEの設定によって自動的に書き込みされたもので、初期状態では表示されないはず。ここでは同じように表示されてなくても大丈夫です)


「sub test」と書いてからEnterキーを押すと・・・
VBA-5
のようになったでしょうか?

subのsが大文字のSになり、testの後にカッコ()が追加されさらにその下にEnd Subが追加されたはずです。このように勝手に書き換えたり追加してくれるのはVBEの機能で、基本的にVBEが間違った書き込みを勝手にすることはないのでそれに従ってください。

意味としては

「Sub」でマクロの始まりを宣言
マクロの名前は「test」で引数は無い「()」
「End Sub」でマクロの終了を宣言

って感じです。「Sub」と「End Sub」の間にマクロをまとめる決まりなので、VBEが気を利かせて「End Sub」を追加してくれます。

マクロの名前は「test」としましたが、当然他の名前でも大丈夫です。ただし、使えない単語(VBAで意味・役割の決まっている単語。それこそ「Sub」とか?でも「MySub」は大丈夫)や形式(数字から始まる、特定の記号を含むとか)があります。その場合はVBEが「その名前ダメ」と教えてくれるので、使っているうちにダメなパターンを覚えます。

基本は何をするか分かるマクロ名にすることと思います。分かりやすいという点で日本語名(「テスト」とか)も大丈夫ですがいちいち入力モードを変えるのが面倒だし、人それぞれかと。

あとマクロに引数を使える場合があり、引数とはワークシートのサム(Sum)関数やイフ(If)関数でカッコの中にセル範囲や条件を書き込みますよね。そのようなものです(すごいアバウトですが)。マクロの引数は必ず必要ということではありまぜんが、それでもカッコ()は必要になります。

で、これでマクロは完成・・・

???完成というのは違うかもしれませんが、このtestというマクロは実行することができます。「なにもしない」マクロですけどVBAのコード様式に従っているのでtestを実行することはできます。ここでそれをやりませんがVBAの基本的な様式、形、書き方はこうなのだと捉えてください。





なにもしないマクロでは意味が無いので簡単な操作を一つやってみます。

エクセル、VBAの「簡単な操作」ってたくさんあるのですが最初に覚えておくと便利なので「メッセージボックス」というのを表示してみます。

以下のようにコードを追加してください。VBA-6

msgbox ”VBA始めました”

をSubとEnd Subの間の行に追加しています。「VBA始めました」はダブルクォーテーション(")で囲む必要があります。

VBAでは行単位で(処理や計算の)コードを書くようになっています。これにとらわれない書き方もできますが、基本は1行に書けるコードは決まりがあることを覚えておいてください。

なので、
Sub test() MsgBox ~~
End Sub
のようには書けません。

また、
Sub
test()
MsgBox ~~
End Sub
という書き方もできません。いずれもVBEがエラーを表示(警告音、文字色の変換)して教えてくれるので自然に覚えていきます。


VBEの画面に戻って、上画像のように書き込みをすると途中で黄色のハイライトで「MsgBox云々」という文字群が表示されます(マウスの位置で消えたり現れたり)。

これはmsgboxと書いた時点で「お、MsgBoxか。VBAで役割、書き方が決まっているのでこう書いてね」とVBEが以降のコードを書くヒントを表示してくれるのです。

このヒントを理解できればとても便利な機能なのですが、いま(VBAを始める人)はヒントの内容が理解できないでしょうし、実はこのヒントに従わなくてもコードとして正しい場合があります。とりあえずここでは画像通りに

msgbox ”VBA始めました”

とだけ書いてください。ヒントの内容を調べたいという人は「msgbox」のどこかにカーソル(文字を入力する際に点滅する縦棒)を移動してF1キーを押すとMsgBoxのヘルプが表示されるはずです。この「F1キーでヘルプ表示」は便利ですので覚えたほうがいいです。

その後カーソルを上か下の行に移動すると以下のようになるはずです。
VBA-7
ここでまた「msgbox」がVBEによって「MsgBox」に書き換えられます。

が、実はこれ、「msgbox」でも「MsgBox」でも同じでVBAのコードとしてはどちらでもいいのです。あくまでも「VBAでは」です。他のプログラミング言語では大文字小文字は区別していて、大文字で書くのを小文字(小文字を大文字でも)で書くとエラーになるという場合がほとんどですがVBAでは大文字小文字を区別せずに理解してくれます。なので、実は最初に登場した「Sub」も「sub」でもよいのですがVBEは書き換えてくれます。

この大文字小文字を厳格に区別しないのは便利な面もありますが、思わぬトラブルの元になるケースがあるのでそうなっていることを覚えておいてください。


これでいよいよ、動作をするマクロが書けました。完成です!

が、なにがどうなるの?いつ動くの?このままではなにも始まりません。

マクロを実行する方法はいくつかありますが、VBEから実行する方法をまず覚えます。
VBA-8

VBEの「実行」メニューから「Sub/ユーザーフォームの実行 F5」をクリックしてください(その際、カーソルはコードを書いたいずれかの行にあること)。

エクセルの画面に切り替わり下のように表示されたでしょうか?
VBA-9
これが現れたら「OK」ボタンを押してこのメッセージを閉じてください。メッセージを閉じないとここで実行したtestのマクロが終了せず、VBEやエクセルの操作を行うことができません。

ここまで長いこと説明に費やして、コードはたった3行で小さな四角い箱に文字が表示されただけでしたが、自分の命令でコードに書いた文字が表示されて感動しませんでした?(それほどでもないか)

因みに、VBEの実行メニューから動かす他、カーソルがコードのいずれかの行にある状態で「F5キー」を押しても同様に動きます。

当然こちらのほうがメニューから選択するより簡単で普通はF5キーで実行しますが、VBEはメニューからいろんな作業をできて頻繁に使うようになる(と思う)ものがあるので、メニューから操作できることを知るのは大切です(キー操作覚えられないし)。

もちろん、いちいちVBEを起動しなくてもエクセルの画面上からも実行できます。

エクセルが表示されている状態でAltキーとF8キーを押してください。または「開発」タブをクリック(開発タブが表示されていない場合は記事最末尾の「[開発] タブを表示する」参照)して、ツールバーの「マクロ」(下の画像では左から2つ目)をクリックする。
VBA-11
マクロ名をtestとして他のコードが存在しなければこのように表示され、testを選択して実行すると同様にメッセージが表示されます。

いくつかの方法でマクロを実行しましたが、どれも同じマクロを実行するので動作は同じです。同じメッセージで飽きてきたら「VBA始めました」を他の言葉に変えてみましょう。

MsgBox ”新しいメッセージ”

のように。VBEでF5キーを押せばすぐに新しいメッセージが表示されます。さらにメッセージの部分を
10 + 10
とか
"10+10"
とか
a + b    (注 以下記事を読んでから実行)
などいろいろ実験してみてください。あとコードのエラーやトラブルを回避するためにもVBEを使いこなすことが大切です。最後の(a+b)はエラーになりますが、慌てずに表示されたメッセージを読んで「OK」ボタンを押してVBEの「実行」メニューから「リセット」を選択してマクロを終了してください(そんな面倒臭いのは御免、の場合は実験回避)。


最後に、エクセルを終了する時に保存しないとコードも保存されないので注意。たった3行のコードですけどね。

また、コードを保存したワークブックを開く際に下のようなメッセージが出る場合がありますが「コンテンツの有効化」しないとマクロのコードは無効(実行できない)になります。
VBA-13
「このファイルなんだっけ?」な場合は当然有効化するのは慎重に。悪意のあるマクロを含んだファイル、という可能性もあるので。



最近VBAのネタが思い浮かばなかったのでこんな記事を書いてみた。

「プログラミング教えて」という人がどれほどいるのか?
ここまで読んでくれた人がどれほどいるのか?第二弾は期待薄。

Excel使う人多いと思うけど、マクロを覚えたらExcelの別の世界が見えてくるよ(大げさだけどそれくらい恩恵を受けたと自分は思っている)。




以下は記事中の補足説明

エクセルのタブに「開発」がない場合
Microsoft Officeのホームページより引用 

※[開発] タブを表示する

[ファイル] タブをクリックします。

[オプション] をクリックします。

[リボンのユーザー設定] をクリックします。

[リボンのユーザー設定]および [メイン タブ] で、[ 開発] チェック ボックスをオンにします。

↑このページのトップヘ