初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel(エクセル)マクロVBA入門-プログラミングの基礎3

何が何でもHello World!!

Hello World!こんにちはしゅっほです。さっそくですがVBAプログラミングの基礎の続きです。前回やった、プログラムを早速ですが再登場してもらいます。

Public Sub Sample()
    
    '名前格納用変数を用意してね
    Dim name As String
    
    '名前を入力してもらうウインドウを表示して、入力された名前をname変数に入れてね
    name = InputBox("名前を入力してください。", "名前の入力", "")
    
    '名前をセルに出力してね
    Sheet1.Range("A1").Value = "私は" + name + "です。"
    
    '出力が終わったというメッセージウィンドウを表示してね
    MsgBox "名前を出力しました。", vbOKOnly, "プログラム終了"
    
End Sub

前回説明した通り、このプログラムは最終的にセルA1に出力するプログラムです。だいたい、どんなプログラミング言語でもそうなんですが一番最初にやるのが「出力」です。以外とね「入力」って難しいんですよ。なのでまず出力です。そしてその出力を学ぶために一番最初に出るのが・・・

Hello World

です(笑)

英語の「This is a pen」みたいなもんです。プログラミング言語も言葉なので、当然「文法」があります。こうしてみると本当にプログラミングというのは「言葉」であるということですね。

さて、ここでいう出力とは上のプログラムではどこに当たるでしょうか?
プログラム内のコメントに書かれている通り、セルへの出力である。

    '名前をセルに出力してね
    Sheet1.Range("A1").Value = "私は" + name + "です。"

この部分ですね。この1行で、セルA1に出力しています。
試しにここだけにしてみましょう。せっかくだから「Hello World!!」を出力してみます。

Public Sub Sample()
    
    'Hello World!!を出力するよ
    Sheet1.Range("A1").Value = "Hello World!!"
    
End Sub

 はいこれでOKです。試に前回やったとおりF5キーで実行してみてください。A1のセルに「Hello World!!」と出力されているはずです。簡単ですね。これがプログラミングです。
今、あなたはExcelに「Sheet1のセルA1にHello World!!と出力してね」ということをExcelが分かる「言葉」で書いたことになります。本当にこれだけです。簡単ですね!

命令文を直訳してみる。

もう少し詳しく書き直したSampleプロシージャを見てみましょう。(プロシージャが分からない人は前回の記事を読んでくださいね)
この出力するための命令はこんな風に書かれています。

Sheet1.Range("A1").Value = "Hello World!!"

 さて、勘の良い人ならわかると思いますが、この命令文を翻訳すると、正確には
「Sheet1のセルA1の値にHello World!!を代入せよ」
となります。さっきの「Sheet1のセルA1にHello World!!と出力してね」を意訳とするならこの「Sheet1のセルA1の値にHello World!!を代入せよ」は直訳という感じになります。
直訳はExcelがやっていることにより近い形式で日本語に訳されています。ですので直訳すると実際にExcelが何をしているのか?がはっきりとわかるようになります。ここでの直訳もそうですね。はっきりとExcelがしていることがわかります。「Sheet1のセルA1の値にHello World!!という値を代入」しています。
 出力する命令文は当然「どこに?」「何を?」出力するのか?ということをExcelに指定しているわけです。「どこに?」が[=]を挟んで左側で、「何を?」が右側に記述されています。=(イコール)は当然代入という意味があるので、直訳通りになります。

出力場所の指定方法は複数ある!?

 さて、出力場所の指定には実はいくつかの言い方があります。住所を地名でいったり、緯度経度でいったりするみたいなものです(笑)Excelは表計算ソフトですから、当然表の「座標」があります。コン前にも書きましたがコンピュータは「あいまいさ」を理解してくれません。ですので、Excelであれば、何行目の何列目と正確に指定することでExcelははっきり理解してくれます。ではA1という指定方法は果たして具体的ではないのか?ということなのですが、もちろんこれもExcelにとってははっきりとした場所の指定になりますが人間にとっては実はあまりうれしくないです。

例えば「BK30」の場所って何列目の30行目だがすぐにわかりますか?

 私には全然さっぱりわかりません。ちょっと計算しないと、、、しかし、56列目の30行目と言われたらすぐにわかります。このようにいわゆる場所の指定にはいくつか方法があることで、プログラミングしやすくなっているんです。VBAはとても親切ですね。要するに、ケースバイケースで使い分けができるということが最大のメリットなわけです。では、座標指定の場合はどうしたらいいか?先ほどの命令文を同じ意味で書き換えると・・・

Public Sub Sample()
    
    'Hello World!!を出力するよ(座標指定)
    Sheet1.Cells(1, 1).Value = "Hello World!!"
    
End Sub

となります。変わったところは「Range("A1")」が「Cells(1, 1)」になっただけです。他にも書き方があるのですが、それはおいおいとして、いろんな書き方ができるんだな。それはプログラミングをする上でとても便利なのだ。ということを理解できればOKです。

指定するときは正確に!!

あらためて、この命令文を見てみましょう。

Sheet1.Cells(1, 1).Value = "Hello World!!"

命令文中の「.」は日本語で「の」に置き換えると読みやすいと思います。
Sheet1「の」セル1行1列目「の」値という感じです。
VBAはこのように何かを出力するときには、
「どのシートのどの場所に」
というのをきちんと書く必要があります。例えばSheet1省略するとどうなるでしょう?Sheet1を省略すると、どのシートにということが省略されるので、プログラムの記入場所によってはExcelは判断ができなくなります。
(記入場所についてはまた今度説明します)
実はこの命令文でもいくつかの文章が「省略」されています。もうマックスでちゃんと正確に書くとこうなります。

Application.ThisWorkbook.Sheet1.Cells(1, 1).Value = "Hello World!!"

これを直訳すると・・・
「このExcelというアプリケーションの今開いているこのブックのSheet1の1行1列目のセルの値に"Hello World!!"を代入する」
となります。長いですよね?あまりに長いと読みにくいので省略をするのですが、省略すると困るところは省略してはいけません。それがSheet1です。ApplicationやThisWorkbookは既に開いているこのエクセルファイルについて操作を行いますという意味では分かり切っているし、他のエクセルファイルの影響を受けないため省略できますがシートは違います。シートはすでに3つ存在していますよね?ですので省略すると「どのシートか?」が分からなくなるわけです。

マクロの記録は省略だらけ!

マクロの記録をしてはいけないと私が言ってるのはこれが大きな原因です。
マクロの記録をすると、記録される命令文(コード)は省略だらけです。
何が何のことなのか省略されまくっているので人の目で見てもなかなかに分かりずらいコードになっています。
ですので、結果として難しい、分からない。という結果で投げ出すことになるわけです。
マクロの記録はやってはダメ!絶対!(意味がわかるまでは)

ここまで結構長いですが、もう少しです。頑張ってくださいね。

文字列はダブルクオートで括る

さて、Hello World!ですが、何やら変なもので囲われています。「"」ですね。
これをダブルクオーテーションと言い、よくダブルクオートと呼びます。
Hello World!は文字列です。VBAでは文法として「文字列は"でくくる」というルールがあります。
数値は"でくくらなくてもよいです。ただしプログラム上で数値を文字列として扱いたい場合は"で
くくる必要があります。この辺はデータ型にかかわるのでまた今度説明します。


これですべてのHello World!を出力するプログラムの全貌です。

まとめ

  • 出力するには場所をわかるように指定する必要がある
  • 場所は「.」(ドット)でつないで表記する
  • 省略は悪!
  • 文字列はダブルクオートで括る

次回は「変数」について・・・大変だ・・・