VBScriptを使ってみよう
リフェレンスマニュアルのメソッド゙に記載されている物についてはいくつか試してみましたか?
いくつか試してみて「何か物足りない」と感じたのではないでしょうか。
これまでの(メソッドの)羅列で出来ることは
「設定値(座標値など)をその都度、個々に指定してやらなくてはいけない」
という内容のものだけです。
そこで、ここでは簡単なスクリプト作成に必要なVBScriptのTips
変数、演算子、for next、if then else等について紹介します。
次のような場合を考えてみてください。
原点からX軸に沿って半径100の球を200間隔で3ヶ作成する。
簡単ですね
xshade.CreateSphere 0,0,0,100
xshade.CreateSphere 200,0,0,100
xshade.CreateSphere 400,0,0,100
それではこれを20個作るとしたらどうでしょう
このやり方で出来ますが大変ですね
もしこれが100個だったら・・・
vbScriptのステートメント(制御文)はこんなときに使うのです
上記の操作の流れは次のように言い換えることが出来ます
「前回のx座標に200加算した位置に球を作成する」という作業を
100回繰り返しなさい。(下の-例1-の解釈)
または
「ある整数に200を掛けたものをx座標として球を作成する」という作業を
ある整数を0〜99まで変化させながら繰り返す。(下の-例2-の解釈)
for 〜 next ステートメント
これを実現するのが for nextステートメントです。
答えから先に言うと次のようになります。
-例1−
x=0
for i=0 to 99
xshade.CreateSphere x,0,0,100
x=x+200
next
または
-例2-
for i=0 to 99
xshade.CreateSphere i*200,0,0,100
next
本来だったら100行羅列しないといけないところを(下の例なら)3行で書き表すことが出来るのです。
前回まではshadeのメソッドについての知識があればできましたがここからがvbScriptの出番です。
ここには新しく知らなければいけないvbScriptの知識が3つほどあります。
1) x,i といった変数についての知識
2) 四則演算(+、−、×、÷)についての知識
3) for next制御文についての知識
まずは少し回り道をしてこのあたりから見ていきましょう
1)変数とは
例1から見ていきます
x=0とは「xと言う変数に0という値を代入する」(またはxを0で初期化する)という意味です。
数学の「xと0は等しい」とはまったく違う事に注意してください。
数学(代数)では x=x+200 なんて許されませんよね
それでは変数とは何でしょう
変数とは色々な数字(または文字)をいれることができる箱のような物です。
例えば 上記のようにxに0を代入すればそれ以降はxをあたかも0のように扱うことができ、
2を代入したならばxを2のように扱うことが出来るのです。(これは数学の代数そのものですね)
vbScriptでは文字もこの変数と言う箱に入れることができます。
x="test"
にすると
「xに"test"と言う文字を代入しなさい」
と言う意味になります。
文字を扱うときは変数の名前と区別する為 ""で囲むのを忘れないで下さい。
xshade.message "test"
と言うのを覚えていますか(1番最初の例題)
これを変数を使って次のように書くこともできるのです。
a="test"
xshade.message a
ちなみに私が例題でfor nextでaとかではなく i や j を使っているのは(今は知りませんが)昔のFORTRANでは こういうところに使う変数は整数型というものを使うのですが整数型にはi〜nで始まる文字でしか使えなかったときの癖です。 vbScriptでは a でも b でも count でもかまいません。
そもそもvbsでは大きなプログラムを作るわけではないので精度にこだわらない限り変数の型を意識する必要は殆どありません。
2)四則演算について
算数とは違いスクリプトでは四則演算は次のようになります。
加算・・・・+
減算・・・・−
乗算・・・・*
除算・・・・/
乗算と除算は違う記号(算術演算子)を使いますので注意が必要です。
優先順位は算数と同じです。優先順位を変更する場合は()を使います。
例
10*20+30/15
は10と20を掛けた物に30を15で割った物をたすことになります。
もし10と20を掛けた物に30をたし、それを15で割る場合は
(10*20+30)/15
と書かなくてはなりません(算数と同じです)
例題のx=x+200は
「xに200をたした物を再度xに代入し直す」
を意味します
また例2の
xshade.CreateSphere i*200,0,0,100 にある i*200 が i×200を意味することはもう分かりますね
これに関連して次の記号(算術演算子)も覚えておくと便利です。
指数演算・・・・^
整数除算・・・・¥
剰余演算・・・・mod
文字列結合・・・&
-使用例-
Aの2乗 -----A^2
10を3で割る整数除算-----10¥3 答えは3になる(商が戻ってきます)
10を3で割る剰余演算-----10 Mod 3 答えは1になる(余りが戻ってきます)
"Hello"と"World"の文字連結-----"Hello"&"World" ("HelloWorld"が戻ってきます)
代入式で使うと次のような意味になる
b=c^3 ------cを3乗したものをbに代入する。
b=a\3 ------aを3で割った商をbに代入する。
b=a Mod 3 ------aを3で割った余りをbに代入する。
c="AAA"&"BBB" ------"AAA"と"BBB"を連結したものをcに代入する。(c="AAABBB"となる)
3)for nextステートメント(制御文)
上の説明で「〜という作業を100回繰り返しなさい」ということが書かれてますが、それを実現させているのがこの for next です。
基本的には次のような形(構文といいます)をしています。
for a=n1 to n2
・・・・したいこと
next
言葉でいうと
aという変数をn1からn2まで(1つずつ)変化させながら「・・・・したいこと」を繰り返す。
例えば
for a=0 to 3
c=a
next
ならば 「cにaを代入する」という操作をaを0から3まで変化させながら繰り返す(0,1,2,3で4回繰り返す)
次の表のように値が変化します。
a c
0 0
1 1
2 2
3 3
例えば
for a=3 to 5
c=a*2
next
ならば「cにaに2を掛けた物を代入する」と言う操作をaの値を3から5になるまで繰り返すことになります。
(3,4,5で3階繰り返す)
次の表のように値が変化します。
a c
3 6
4 8
5 10
この例では値の変化を見ることができないので shadeのスクリプトウィンドウに変数の変化を見ることが出来るようにするため次のように記入して実行してみてください。
for a=3 to 5
c=a*2
xshade.message "a="&a&" :c="&c
next
どうですか下図のようにメッセージウィンドウに結果が出力されましたね

ちなみに&は文字連結の演算子ですよ 覚えてますね。
変数a 変数bは数字としても文字列としても扱ってくれます(vbsのありがたさ?)
このことを例2にあてはめて
for i=0 to 99
xshade.CreateSphere i*200,0,0,100
next
を説明すると
「iの値を0から99まで変化させながら球を描いていきなさい」
となります
iが0のときforとnextの間にある部分は
xshade.CreateSphere 0*200,0,0,100 つまり
xshade.CreateSphere 0,0,0,100 です
iが1のときこの部分は
xshade.CreateSphere 1*200,0,0,100 つまり
xshade.CreateSphere 200,0,0,100となり
iが2のとき
xshade.CreateSphere 400,0,0,100
i=3のとき
xshade.CreateSphere 600,0,0,100
i=50のとき
xshade.CreateSphere 10000,0,0,100
i=99のとき
xshade.CreateSphere 19800,0,0,100
がそれぞれ実行されるわけです
つまり100行書かなくても同じことがこれで実現できることになるわけです。
さあこれで-例1-と-例2-は理解できるはずですのでまとめてみましょう
-例1−
x=0 'x座標値を表わすxという変数に0を代入してます。
'(球の最初のx座標値は0なので)
for i=0 to 99 'iの値を0から99まで変化させながらnextまでの
'処理を繰り返します。
xshade.CreateSphere x,0,0,100 '座標(x,0,0)を中心に半径100で球を描きます。
x=x+200 '次の繰り返しに入る前にxの値を200増やしてお
'きます。
next 'forに戻って(iを1つ増やして)繰り返します。
i=0のとき xshade.CreateSphere 0,0,0,100
i=1のとき xshade,CreateSphere 200,0,0,100'xはこの処理の前に200増やしているので
i=2のとき xshade,CreateSphere 400,0,0,100 'xはこの処理の前にさらに200増やしているので
といった具合にi=99になるまで続いていくのです。
この例ではiの値はカウントするのに使うだけで計算には使っていません。
-例2-
for i=0 to 99 'iの値を0から99まで変化させながらnextまで
'の処理を繰り返します。
xshade.CreateSphere i*200,0,0,100 'x座標値をiに200を掛けたものに設定して球
'を描きます。
next
感覚的には例1の方が分かりやすく、処理的には例2の方が分かりやすいのではないでしょうか
いずれの方法でも結果は同じです。つまり同じ事をするのでも答えは一つではないということです。
それでは下図のように入力して実行ボタンを押してください。

結果は次のようになるはずです

if then else ステートメント
実はここでもう一つどうしても覚えておいて欲しいステートメント(制御文 if then else )が有ります
先ほどの例では100個の同じ球をx軸に沿って作っていきましたが
0番目、10番目、20番目、30番目・・・要するに区切りのいい位置にある球だけは半径を150にしたい
と思ったらどうしますか?
こんな場合にif文が使えるのです。
-例3-
for i=0 to 99
if (i mod 10)=0 then r=150 else r=100
xshade.CreateSphere i*200,0,0,r
next
と言うのが簡単な方法の一つです。
またはブロック形式で次のようにも書くことができます。
複雑な場合はこの形式をお勧めします。
-例3(2)-
for i=0 to 99
if (i mod 10)=0 then
r=150
else
r=100
end if
xshade.CreateSphere i*200,0,0,r
next
前述の例2と違うのは
if (i mod 10)=0 then r=150 else r=100
が追加されていることです。これがif else then ステートメント(制御文)です。
言葉で表わすと
「もし iを10で割った時の余りが0ならばr(半径)に150を、そうでなければr(半径)に100を代入しなさい」
と言う意味になります。( mod は覚えてますか? そうです剰余演算子ですね)
構文的には
if [条件式] then [条件式がtrue(真)の場合の処理] else [条件式がfalse(偽)の場合の処理]
ブロック形式の場合
if [条件式] then
[条件式がtrue(真)の場合の処理]
else
[条件式がfalse(偽)の場合の処理]
end if
です。
条件式とか真(true)とか偽(false)とかまたわかりにくい言葉が出てきました。
説明するよりも例をあげていきます。
条件式には次のようなものがあります。(いずれの式もtrueかfalseを返します。)
A > B もしAがBよりも大きかったらtrue、そうでなければfalse
A < B もしAがBよりも小さかったらtrue、そうでなければfalse
A >= B もしAがB以上ならばtrue、そうでなければfalse
A <= B もしAがB以下ならばtrue、そうでなければfalse
A = B もしAとBが等しかったらtrue、そうでなければfalse
(代入の=とは違いますよ)
A <> B もしAとBが等しくなければtrue、等しければfalse
参考:このような記号を比較演算子と呼びます
(A = B) and (B = C) もし AとBが等しく かつ BとCが等しいならばtrue、
そうでなければfalse
(A > B) or (A > C) もし AがBより大きい または AがCよりも大きい
のいずれかならばtrue、そうでなければfalse
not (A > B) もし AがBよりも大きく なければ true、
そうでなければfalse
参考:and or not を論理演算子といいます
このように比較演算子と論理演算子を使ってtrueまたはfalseを返してそれをif文が解釈して処理を振り分けます。
実際にはvbScriptではtrueを返すという場合(-1)をflaseを返すという場合(0)を返しているだけなのですが・・。
(テスト)確認する為に次のようなスクリプトをスクリプトウィンドウに書いて実行してみてください。(説明文は入力しないで下さい)
xshade.message 10>5
-1(true)が表示されるはずです
xshade.message 10=5
0(false)が表示されるはずです
xshade.message 6>5 and 8>4
-1(true)が表示されるはずです
xshade.message 6>5 or 4>8
-1(true)が表示されるはずです
条件式がどのような値を返すか確認できましたか?
さて元の例3に戻って 条件式の部分に記入されている
(i mod 10)=0
がどんな意味を持っていたかもう分かりましたね。これは
「iを10で割った余りが0に等しいときにtrue(-1)を返す」
条件式だったのです。
if文ではこの式の結果を見てtrueならばthenの後ろの処理を実行し、falseならばelseの後ろの処理を実行するように決めているのです。
ここまでの説明で
for i=0 to 99
if (i mod 10)=0 then r=150 else r=100
xshade.CreateSphere i*200,0,0,r
next
というスクリプトが
「もし iを10で割った時の余りが0ならばr(半径)に150を、そうでなければr(半径)に100を代入しなさい」
を意味することがわかったはずです。
それでは下図のようにスクリプトウィンドウに記入して実行ボタンを押してください。

実行すると下図のような結果になるはずです。

最後に確認までにもう一つひねった例を載せておきます。
for i=0 to 99
if (i mod 10)=0 then
xshade.CreateSphere i*200,0,0,100
xshade.CreateSphere i*200,0,0,150
else
xshade.CreateSphere i*200,0,0,100
end if
next
順番に読み解いていけば分かります。これは 「iの値を0〜99まで変更しながら (もし iを10で割ったときの余りが0ならば半径100の球と150の球を、そうでなければ半径100の球を描きなさい) という処理を繰り返しなさい」と言っているのです。
thenの後に2行有ることに注目してください。
このように複数行記入することも出来るのです。これはelseの後も同様です。
これがブロック形式を使う理由です。:で区切って一行にも続けて書けますがその読みにくさは想像できるでしょう。 見にくいという事は間違いやすいという事です。
それではスクリプトウィンドウに下図のように記述して実行してください。

このスクリプトを実行すると下図のように10回間隔ごとに2重の球が描かれるはずです。

VBScriptのステートメントfor next と if then elseを見てきましたがこの二つを覚えるだけでぐっとスクリプトの巾が広がります。
スクリプトを書く場合に全てを覚えなくてはいけないとは思わないで下さい。
「全てを覚えてからやってみよう」なんて思っていたら、きっといやになってしまうでしょう。
形は悪くてもとにかく作ってみる。
作ったものがうまく機能することを実感する。
少し便利な機能を勉強する。
勉強したものを使ってまた作ってみる。
新しい機能が実際に動くことを確認する。
と言うことを繰り返していけばいつのまにか自然にスクリプトに引き込まれていきます。(はじめはとっつきにくいマニュアルにもなれます)
便利な機能を勉強したいときはvbScriptのリファレンスへのリンクがマニュアルのindex.htmlに有リますのでそちらを見てください。
|