■ データの出し入れが基本
前回のtest.xlsを開いてみましょう。"HelloWorld!"が表示されました?
うっとうしい場合はブックモジュールにあるWorkbook_Openプロシージャを削除してください。ちなみにここの表示を"ExcelVBAがんばるぞ!"とかしておけば、開くたびに気合が入ってよろしいんではないかと思います。
ところでこのプロシージャという言葉、プログラムとどう違うのでしょう?
今まで曖昧に使っていましたが、これからはきちんと意味を分けて使っていきます。
プロシージャは前回記述した Sub〜End Sub の部分ですSubプロシージャといいます。ExcelVBAにはもうひとつFunctionプロシージャがあって、この2種類をプロシージャと呼んでいます。
プログラムはもっと広範な意味の言葉でコンピュータに演算処理を行わせる手続き全般を指します。
つまりプロシージャはプログラムの一部ということになります。
さて、前回のtestプロシージャではただメッセージを表示させるだけでした。今回は表示させるメッセージをユーザーが任意に操作できるようにしましょう。
Public Sub test()
MsgBox "HelloWorld!"
End Sub
がそのまま残ってますね。次のように書き換えてください。
Public Sub test()
Dim MyStr As String
MyStr = InputBox("あなたの名前は?")
MsgBox "Hello" & MyStr & "!"
End Sub
そんなに変わっていませんね。2行目と3行目が加わり、4行目がちょっと変りました。
さて実行させてください。実行はVBEからF5でもいいですし、ワークシートから前回の四角形をクリックしてもOKです。
名前を聞いてきますので名前を入力してやってください。日本語でも英語でも結構です。
"Helloあなたの名前!"と表示されましたか?
入力する名前を変更すれば当然表示される名前も異なってきます。
ちょっとプログラムっぽくなってきましたね。
ところでこのコードの2行目に注目してください。MyStr ってなんでしょう?
これは「変数」と呼びます。なぜこんなものが必要になるかというと…、
3行目でユーザーに入力させたデータ(この場合は名前)を4行目で表示させるまでの間、どこかにそのデータを保存しておく必要があります。
あなたが2行目でMyStrを宣言したとき、コンピュータはメモリ上に文字データを保存する場所を確保しました。
3行目であなたが名前を入力しOKクリックしたときに、そのデータをメモリ上に書き込みます。
4行目でメッセージを表示させる時に、MyStrの内容を書き出す必要が発生したためコンピュータはメモリ上の先ほどのデータを読み出しに行ってます。
5行目でプロシージャが終了しました。プロシージャ内で宣言された変数はローカル変数と言い、プロシージャの終了と同時に破棄されます。
つまりメモリ上に確保していたMyStrの領域が破棄され解放されます。
この変数は実にたくさん種類があるのですが、最初のうちは次の4つを覚えておけばいいでしょう。
Boolean
ブール型といいます。TrueとFalseの2種類の値しか持てません。フラグなどに使用します。
Long
長整数型です。-2147483648〜2147483647の範囲の整数値を格納できます。小数を除く数値ならとりあえずLongにしておけばいいでしょう。
Double
倍精度浮動小数点型。小数値を扱うならとりあえずこれにしておけばオッケーです。
String
文字列型。可変長と固定長とありますが、最初は気にしなくて大丈夫。文字を使うならこれにしてください。
※ 可変長文字列型、固定長文字列型、データ型の定義の詳細はこちらを参照ください。
データ定義型をもっと知ろう
さて、上記プロシージャの3行目、InputBox というのがありますね。これはそのまま画面上に入力用のインプットボックスを表示させる関数です。
ボタンが2つありキャンセルというのがありますね。
押してみてください。
"Hello!"とだけ表示されたと思います。これはキャンセルをクリックしたときMyStrに長さ0の空文字列がはいっているからです。
ですのでMsgBox関数によるメッセージ表示は当然"Hello!"になります。
キャンセルを押したのにメッセージが表示されてしまう、これは変ですよね。プログラムを少しいじってみましょう。
Public Sub test()
Dim MyStr As String
MyStr = InputBox("あなたの名前は?")
If MyStr <> "" Then
MsgBox "Hello" & MyStr & "!"
End If
End Sub
これでMyStrが空文字のときはメッセージが表示されなくなりました。If はワークシート関数でもおなじみですがVBAの文法は少し違います。
If 条件 Then
条件が真のケース
Else
条件が偽のケース
End If
このような文法になります。MyStr <> "" はMyStrが空文字でないという意味になります。
ですのでMyStrになにか文字列が入ったときだけMsgBoxが実行され、それ以外の場合は何も実行されません。
※ 条件分岐についての詳細な解説はこちらを参照ください
いろいろな条件分岐
ところで<>の記号はいったい何でしょう?これは比較演算子と言います。
= |
左辺と右辺が等しいときに真 |
<> |
左辺と右辺が等しくないときに真 |
< |
左辺が右辺より小さいときに真(<= 左辺が右辺以下のときに真) |
> |
左辺が右辺より大きいときに真(>= 左辺が右辺以上のときに真) |
こんな感じです。
ちなみに「&」は連結演算子といって文字列の連結に使用します。
3行目の「=」は代入演算子で右辺を左辺に代入します。
(比較演算子と同じ記号ですが意味が異なるので注意)
※ 演算子についての詳細な解説はこちらを参照ください
演算子について詳しく知ろう
せっかくExcelVBAを学んでいるのに、ワークシートを使用しないのはつまらないですよね。
さきほどのInputBoxとMsgBoxの部分をシートから読み取るように変更してみましょう。
Public Sub test()
Dim MyStr As String
MyStr = Range("A1")
If MyStr <> "" Then
Range("B1") = "Hello" & MyStr & "!"
End If
End Sub
セルA1にあなたの名前を入れて実行してみてください。セルB1に"Helloあなたの名前!"が表示されましたか?
ワークシート上のデータはRangeオブジェクトで取得できます。
ずいぶん簡単でしょう?それもそのはず、実はこの書き方はずいぶん省略した書き方なんです。
正確には
Application.Workbooks("test.xls").Worksheets("sheet1").Range("A1").Value
と書きます。
Application.Workbooks("test.xls").Worksheets("sheet1"). この部分を省略した場合は現在開いているブックのActiveなシートを対象にします。今回の場合はつまりtest.xlsブックのSheet1ワークシートですね。
.value これはRangeオブジェクトのデフォルトプロパティです。ここを省略するとvalueプロパティをさしているとみなされます。
ですのでただ Range("A1") と書いても問題なく動作するのです。
しばらくはこのやり方でシート上のデータにアクセスしていきます。
ここでひとつぜひ覚えておいてほしいことがあります。それは、
「プログラムの基本はデータの入出力」
ということです。どんな複雑なプログラムも基本はデータの出し入れです。麻雀ゲームだってそうです。
データをプログラムに引っ張り込んで(入力)加工して元の場所もしくは別の場所に書き込む(出力)。
これがプログラムの全てです。
入出力する先がデータベースサーバならいわゆるクライアントサーバシステムと呼ばれるものになりますし、スタンドアロンのシステムでは自前でデータ管理をしているだけのことです。
規模の大小は別にしても、やっている内容はそんなに変わりません。
あなたがプログラミングの達人になりたいならば、このデータの入出力について様々な手法をマスターすればいいのです。
何も難しいことはありませんよ、安心してください。
|