Visual Basic 6.0 入門講座 |
第6回 文字と数字
今回はVBでの、「文字」と「数字」の扱(あつか)い方の基本について説明します。
1.メッセージを表示
もう何度も出てきているので、ご存知かと思いますがVBでメッセージを表示させるいちばん簡単な方法はMsgBox関数をつかうことです。たとえば、次のようにするのでしたね。
Private Sub Command1_Click()
MsgBox "こんにちは!"
End Sub
コマンドボタンフォームに配置して、このコードを記述するとコマンドボタンを押すたびに「こんにちは!」と表示されるわけです。
これを少し変えて次のようにして見ましょう。
Private Sub Command1_Click()
K = "こんにちは!"
MsgBox K
End Sub
さて、これでコマンドボタンをクリックすると何が表示されるでしょうか。まぁ誰でも予想すると思いますがちゃんと「こんにちは!」と表示されます。たしかに、MsgBox K は 「K を表示しろ」という命令ですが、その前の行で K = "こんにちは!" としているので、結局「こんにちは!」と表示されるわけですね。
では、この下に 「K」 と表示させるプログラムを書くとしたらどうしたらいいでしょうか? MsgBox K と書くと「K」ではなく「こんにちは!」と表示されてしまうのですから・・・。
答えは次にあります。
Private Sub Command1_Click()
K = "こんにちは!"
MsgBox K
MsgBox "K"
End Sub
これで、「こんにちは!」の次に「K」と表示されるプログラムの完成です。この例で分かったように、VBはダブルクォーテーション( " )でくくったものを「文字」として扱います。だから、MsgBox "K" では K が文字として扱われて「K」そのものが表示されたわけです。一方でMsgBox Kでは、Kは文字じゃないのでVBは「Kは何かな?」と考えて(正確に言うと、Kが指すメモリを参照して)、Kは「こんにちは!」ということが分かるので、「こんにちは!」と表示されるわけです。
以上が文字の扱いの基本です。簡単(かんたん)でしょう?
まとめ
・VBはダブルクォーテーション( " )でくくられたものを文字と認識する。
・ダブルクォーテーションでくくられていないものは文字として扱われない。
2.数字と計算
ここからが楽しくなってきます。次は数字を考えましょう。たとえば、次のプログラムをしてコマンドボタンをクリックすると何が表示されるでしょうか。
Private Sub Command1_Click()
MsgBox 4
MsgBox "4"
End Sub
ぱっと見てわかるように、コマンドボタンをクリックするとメッセージボックスが2回表示されます。始めのメッセージボックスには 4 と表示され、次のメッセージボックスにも 4 と表示されます。
このことから、数字はダブルクォーテーションでくくる必要はないということがわかりますが、もっと大切なことがあります。次の例を見てください。
Private Sub Command1_Click()
MsgBox 4 + 6
MsgBox "4 + 6"
End Sub
この例では始め「10」と表示され次に「4 + 6」 と表示されます。ダブルクォーテーションでくくられていない場合は文字ではないので計算してくれるのですが、ダブルクォーテーションでくくった場合は文字なので計算してくれないのです。
このことは、次のようにしても同じです。
Private Sub Command1_Click()
K = 4 + 6
M = "4 + 6"
MsgBox K
MsgBox M
End Sub
結果は、先の例と同様。はじめ「10」が表示され、次に「4 + 6」と表示されます。
3.VBはかしこすぎてついていけない時もある
以上の例はVB以外のプログラム言語でも同じです。けれど、VBは他のプログラム言語と比べても圧倒的に親切なので次のような例では独特の現象が発生します。
Private Sub Command1_Click()
K = "6" - "4"
M = "6" + "4"
MsgBox K
MsgBox M
End Sub
この結果がどうなるかすぐにわかった人は入門者ではありませんね。このプログラムを実行するとまず、「2」が表示されて次に「64」が表示されます。
ダブルクォーテーションでくくっているから計算しないはずでは?と思うでしょう。こう思った人はある意味正しくてVB以外の言語でこういうプログラムをしたらエラーが出るはずです。しかし、VBは頭がいいので、K = "6" - "4" のような命令を見ると「文字から文字を引いている」→「文字は引き算できない」→「数字にしてしまえ」→「6-4は2だ」というような流れで結局 K = 2 と解釈してしまうのです。すごい。
一方足し算のほうは、文字の足し算は「文字の結合」と解釈されて"6"と"4"をくっつけて"64"にしてしまうのです。もし、+という記号が「文字の結合」という意味でなかったらVBはここでも引き算のときと同じように考えてM = 10と解釈したのでしょうが、+という記号は文字の結合を表すものとしてあらかじめ用意されているのでそうはならないのです。
ちなみに MsgBox "A" + "B" では AB と表示されます。MsgBox "A" - "B"はエラーです。この命令を実行すると「型が一致しません」と表示されます。ここでいう「型」とは「文字」とか「数字」とかのことです。つまり、ダブルクォーテーションでくくっているから「文字」のはずなのに、「数字」のように引き算していておかしい。というエラーなのですね。しかも、"6"-"4"とちがって勝手に数字に直してしまうこともできないですしね。
なお、念のために言っておくと次のプログラムは有効(エラーが発生しないこと)です。
Private Sub Command1_Click()
K = 4
M = 6
MsgBox K + M
End Sub
4.日付
ついでに日付についても少し書いておきます。「日付」は「文字」や「数字」とはまた違った「型」です。しかし、単純に日付を表示させるだけなら文字としてもいいでしょう。たとえば次の例は文字として日付を扱っています。
Private Sub Command1_Click()
MsgBox "2000/7/9"
End Sub
ちゃんと 2000/7/9 と表示されますね。
次のようにするとどうでしょうか?
Private Sub Command1_Click()
MsgBox 2000/7/9
End Sub
実行すると31.746・・・と小数が表示されますね。これは / という記号がVBでは割り算を表しているので 2000÷7÷9 が計算された答えなのです。
ところで、2000/7/9から23日後の日付は何月何日でしょうか?まぁこのくらいならカレンダーを見たり自分で計算してもいいでしょう。7月が30日までなのか31日までなのかちょっとわからなくなっていしまうこともあるかもしれませんが。しかし、2000/7/9から2345日後の日付を聞かれたらどうしますか?
これは次のように計算できます。
Private Sub Command1_Click()
MsgBox #2000/7/9# + 2345
End Sub
結果は 06/12/10 と表示されますから 2006年12月10日だなとわかります。このように日付を扱う場合は#でくくるとVBはそれが「日付」なんだなと認識してくれます。これを、"2000/7/9" +2345 とすると「型が一致しません」というエラーになるし、2000/7/9 +2345 とすると割り算の後に2345をたして2376.746・・・と表示されることでしょう。こういうところに日付を文字でも数字でもないもの「日付」として扱う意味があるのです。
なお、#でくくると、自動的に 月/日/年 の順番で記述されます。これはプログラム中だけで表示されるときは自分の好きな順番で表示できるので安心してください。
最後にこの日付の例を実際に試した人は不安を感じたと思うので、日付のほかの表示方法を例をして載せておきます。
@ MsgBox Format(#8/25/2012#, "YYYY年MM月DD日")
この例では 「2012年08月25日」と表示されます。
A MsgBox Format(#8/25/2012#, "YYYY年M月D日")
この例では 「2012年8月25日」と表示されます。
B MsgBox Format(#10/5/1902#, "GGGEE年M月D日")
この例では 「明治35年10月5日」と表示されます。
C MsgBox Format(#10/5/1902#, "M月D日(GGEE)")
この例では 「10月5日(明35)」と表示されます。このように順番は自由に変えられます。
D MsgBox Format(#10/5/1902#,"GE・M・D")
この例では 「M35・10・5」と表示されます。
E MsgBox Format(#10/5/1902#,"GGGEE年M月D日はAAAAでした。")
この例では 「明治35年10月5日は日曜日でした。」と表示されます。
F MsgBox Format(Now, "今日はYYYY年M月D日です。")
この例では「今日は」に続いて今日の日付が表示されます。Nowはいつでも「今」を表します。
G MsgBox Format(Now,"今日は(AAA)です。")
この例では「今日は」に続いて今日の曜日が省略形で表示されます。