読者です 読者をやめる 読者になる 読者になる

アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

ExcelVBA入門 #2:Hello VBA World!!

練習問題:これが分かる・できる人は以降読まなくても大丈夫

  • 特定のブックの特定のシートの特定のセルにメッセージを出力するプログラムが書ける

はじめに

というわけでHelloWorld後編。

前回はメッセージボックスを出しただけでExcelと何も関係ないプログラムでしたが、
今回からはちゃんとExcelも使っていきます。

  • 新規Excelファイル
  • 前回のExcelファイルに別のモジュールを作る
  • 前回のモジュールに加筆

いずれでもOKです。

念のため、関係ないブックは閉じておくとよいかも。

シートにメッセージを出力するプログラム

今回は、HelloWorldメッセージをExcelのシートに出力します。
以下のコードを書いてみてください。

Public Sub main()
    Range("A1") = "Hello VBA World!!!!"
End Sub

ちなみに、この「Public Sub ~ End Sub」の単位を「プロシージャ」と呼びます。

プロシージャの名前はひとつのモジュール内で重複させてはいけません。
前回使ったモジュールに加筆する場合、モジュールの名前には「main」ではなく別の名前をつけてください。
「main2」でも「test」でも「writeHelloWorld」でもOKです。
実行するときも、もちろん自分でつけた名前のものを選んでください。

さて、Excel画面に戻り、A1セルに何もないことを確認してから実行すると…
どうですか? A1セルにメッセージは出ましたか?

確かに出るけど…

正常に出たことを確認したら、ちょっと一旦出てきた文字を削除してください。
それから、別のシートを選択してもう一度実行すると…
そっちに出ましたよね?

それも削除して、次は新しいブックを開いてください。
そっちで実行しようとすると…
f:id:honey8823:20150827134436p:plain
マクロ名の前にブック名が付いていますが気にしなくてOKです。
そのまま実行してみると、新しいブックに文字が出ましたよね?

わざとそういう挙動をさせたい場合は別として、これではあまりに不安定!
確実に「マクロがあるブックの、特定のシートに出す」ために、以下のように書き変えてみましょう。

Public Sub main()
    ThisWorkbook.Sheets("Sheet1").Range("A1").Value = "Hello VBA World!!!!"
End Sub

これでOKです。どうですか?
他のシートを選んでいても、他のブックを見ていても、必ずマクロのあるブックのSheet1に表示されるはずです。

コードは難しくなったように見えますが、大したことはありません。
プログラミングに慣れない人は「.」で混乱するかもしれませんが、これは日本語の「の」みたいなものだと思ってください。

つまり、

ThisWorkbook.     このワークブックの
Sheets("Sheet1"). 「Sheet1」って名前のシートの
Range("A1").      セル「A1」の
Value = "..."     値は「...」である

ってことです。
最後の「.Value」はなくてもとりあえずは同じ動きをしますが、書いておいた方が、
可読性(他の人や自分が後から見たときのわかりやすさ)が上がります。

ブックやシートの出し分けについて、詳しくはこちらに書いておりますので興味のある方はどうぞ。honey8823.hateblo.jp

次回予告

ExcelVBA入門 #3:プログラミングには必須!変数ってなんぞ? - アナログCPU:5108843109
いや、決まったところに決まった文字出すだけならプログラムいらないし。
次回はプログラミングに必須の概念「変数」について。