VBScript 基本 の まとめ

0 件のコメント

今回は「VBScriptの基本」についてまとめます。 VBScript は OLEオブジェクト を読み込むことで拡張できますが、ここでは基本的な機能に絞ってまとめました。

ちょっと多いですが…一通り読めば基礎力がつくはず!

概要

スクリプト言語。スクリプトなのでコンパイル不要ですぐ実行できる。 特徴は以下の3点。

  • 動的型付け
  • OLEクライアント
  • オブジェクト指向

決まったエントリーポイントはないので、スクリプトを実行すると上から順に実行される。

字句構造

文字

変数や関数で利用可能な文字や命名制限は以下の通り。

  • 利用可能な文字はアルファベット、数字、アンダースコア。
    (ドル記号、ピリオドなどアンダースコア以外の記号は利用不可)
  • 先頭文字は、アルファベットであること。
  • 半角 256 文字以内 であること。(←MSのサイトには255以内と書いてあるが、実際は256以内までOKだった。)
  • 大文字小文字は区別しない。
  • 変数宣言を行った適用範囲内で同じ変数名を複数使用しないこと。
    (関数はエラーにならないが後勝ちになる。紛らわしいので避けるのが望ましい。)

" _"(半角スペース + アンダースコア)

VBScriptでは式の終わりを改行で表す。

Wscript.echo "Hello"
Wscript.echo "World"

式を複数行に渡って記述したい場合、行末に 「" "(半角スペース) + "_"(アンダースコア)」 を記述する。

Wscript.echo "Hello " + _
             "World"

コメント

コメントは Rem または "'"(シングルクォート) で記述する。 行コメントのみでブロックコメントは存在しない。

Rem コメント
' コメント

式の末尾にコメントしたい場合、:Rem を使うか "'"(シングルクォート) を使う。

Dim str1, str2
str1 = "Hello" :Rem 1つ目のコメント
str2 = "World" ' 2つ目のコメント

予約語

以下にあげる単語は予約語なので変数名や関数名に指定できない。 大文字小文字区別しない点も注意。

And As Boolean ByRef Byte ByVal Call Case
Class Const Currency Debug Dim Do Double Each
Else ElseIf Empty End EndIf Enum Eqv Event
Exit False For Function Get Goto If Imp
Implements In Integer Is Let Like Long Loop
LSet Me Mod New Next Not Nothing Null
On Option Optional Or ParamArray Preserve Private Public
RaiseEvent ReDim Rem Resume RSet Select Set Shared
Single Static Stop Sub Then To True Type
TypeOf Until Variant WEnd While With Xor

データ型

バリアント型(Variant)と呼ばれるデータ型のみを利用。 バリアント型は利用されたときの状況に応じて内部処理用のサブタイプを変更する特殊なデータ型。

内部処理で利用されるサブタイプは以下の通り。

データ型 接頭辞 説明
Empty - 未初期化のバリアント型。
Null - 無効な値であることを示す型。
Boolean bln 真(True)または偽(False)の値を持つデータ型。
Byte byt 符号なし 8ビット (0 ~ 255 の範囲) の整数値を持つデータ型。
Integer int 符号付 16ビット (-32,768 ~ 32,768 の範囲) の整数値を持つデータ型。
Long lng 符号付 32ビット (-2,147,483,648 ~ 2,147,483,647 の範囲) の整数値を持つデータ型。
Single sng 符号付 32ビット精度 (-3.402823E38 ~ 3.402823E38 の範囲) の浮動小数点を持つデータ型。 C言語、C#、Javaで言うところの float 型。
Double dbl 符号付 64ビット精度 (-1.79769313486232E308 ~ 1.79769313486232E308 の範囲) の浮動小数点を持つデータ型。 C言語、C#、Javaで言うところの double 型。
Currency cur -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 の範囲の値を持つデータ型。
Date dtm 日付を表す数値を持つデータ型。
String str 可変長文字列を格納できるデータ型。
Object obj オブジェクトを参照するデータ型。
Error err エラー番号を持つデータ型。

変数 と 定数

スカラ変数

Dim ステートメント を利用して宣言する。 複数同時に宣言する場合は ","(カンマ) で区切って宣言する。 変数名はハンガリアン記法(接頭辞に型名をつける記法)が一般的。

Dim intA
Dim blnB, bytC, strD

配列変数

配列を宣言する場合は "()"(丸括弧) で表現する。 数値指定した場合は固定長の配列が準備され、数値指定しない場合は動的配列が準備される。 多次元配列は ","(カンマ) で区切って宣言する。 60次元まで宣言可能。

Dim aintScores(10)       ' 配列の場合 「a + 型を示す接頭辞 + 変数名」 で宣言する
Dim aintArea(4, 4)

宣言と同時に初期化

宣言と同時に初期化したい場合、 ":"(コロン) でつなげて記述する。 ":"(コロン) を使うと 1行 に複数式が記述できるようになる。

Dim strMessage : strMessage = "Hello World"
Dim astrMsg(2) : astrMsg(0) = "hoge" : astrMsg(1) = "foo"
Dim objShell : objShell = WScript.CreateObject("WScript.Shell")

変数宣言の強制

既存変数名の入力ミスや変数のスコープが分かりづらいコードにおける競合を避けるため、変数宣言の強制を行うことが望ましい。 変数宣言の強制を行うにはコードの最初に Option Explicit を宣言する。

Option Explicit
strMessage = "hoge"   ' エラーになる

定数

Const ステートメント を利用して定数宣言する。 ユーザー定義の定数名は接頭辞に "vb" または "con" をつける( "vb" は組み込み定数で利用されているので "con" を使うのがよさそう)。

Const conMaxAge = 49

式と演算子

代入、割当

"="(イコール) 演算子

スカラ値の単純代入には "="(イコール) を利用する。

Dim intScore
intScore = 100

ReDim ステートメント

動的配列の宣言、メモリ領域の再割り当てには ReDim ステートメント を利用する。 Preserve キーワード を利用すると格納済みの既存データを維持したまま再割り当てすることができる。 多次元配列の場合、最後の次元だけが変更可能となっておりそれ以外の次元は変更できない点に注意。

Dim aintA()
ReDim aintA(1, 2, 3)
...
ReDim Preserve aintA(1, 2, 5)

Set ステートメント

オブジェクトへの参照を変数またはプロパティへ代入する場合、 Set ステートメント を利用する。

Dim objFso
Set objFso = WScript.CreateObject("Scripting.FileSystemObject")

算術演算子

種類 記号 サンプル 備考
加算 +
2 + 3
+演算子は文字列結合もできる。 文字列と数値を加算する場合、数値として演算される。 文字列結合を +演算子 を使って行うとまぎらわしいので &演算子 で文字列結合が推奨。
減算 -
2 -3
-
乗算 *
2 * 3
-
除算 /
2 / 3
演算結果が浮動小数点になる場合、Dobule(倍精度浮動小数)で結果が取得される。
剰余 Mod
19 Mod 6.7
剰余が浮動小数点の場合、整数に切り捨てで丸められる。 左記のサンプルの場合、5.6 が 5 に丸められる。

論理演算子

種類 記号 サンプル 備考
論理積 And
blnCond1 And blnCond2
2式の両方が真( True )のとき、結果が真( True )となる。
論理和 Or
blnCond1 Or blnCond

2式のどちらかが真( True )または両方が真( True )のとき、結果が真( True )となる。

論理否定 Not
Not blnCond1
式の結果を反転する。
排他論理和 Xor
blnCond1 Xor blnCond2
2式のどちらかが真( True )のとき、結果が真( True )となる。

比較演算子

種類 記号 サンプル 備考
等しい =
strMsg1 = strMsg2
-
等しくない <>
strMsg1 <> strMsg2
-
大きい >
intCost > intPayment
-
以上 >=
intCost >= intPayment
-
小さい <
intCost < intPayment
-
以下 <=
intCost <= intPayment
-
オブジェクト等価 Is
objFso1 Is objFso2
参照アドレス比較なので、中身が同じでも参照が違うと偽( False )となる。

文字列演算子

種類 記号 サンプル 備考
文字列連結 &
strMsg1 & strMsg2
算術演算子の +演算子でも結合できるが、まぎらわしいので &演算子 で結合するのが推奨。

If ... Then ... Else 文

構文1 (単一条件・単一処理)

If <条件> Then <処理>

1行で記述する場合。 条件が真( True )となる場合に単一処理を実行する構文。

構文2 (複数条件・複数処理)

If <条件式1> Then
  <処理1>
ElseIf <条件式2> Then
  <処理2>
ElseIf 条件式3> Then
  <処理3>
Else
  <処理4>
End If

複数条件を処理する場合や複数処理を実行する場合。 条件を重ねる場合、ElseIf を連ねることで複数の条件と処理を記述できる。 どこにも当てはまらないケースは Else で記述する。

Select Case 文

構文

Select Case <式>
  Case <値1>, <値2>  ' 複数ケースはカンマ区切り
    <処理1>          ' 次の処理へ流れない
  Case <値3>
    <処理2>
  Case Else
    <処理3>          ' Case Else はデフォルトケース
End Select

いわゆる switch文。breakを記載しないが、各ケースで処理は完結する。 勝手に次のケースへ流れて処理されることはない。 関連して複数条件を指定する場合、値を ","(カンマ) 区切りで指定する。

For ... Next 文

構文

For <カウンタ> = <初期値> To <条件値> [Step <増分値>]
  <処理>
  If <条件式> Then Exit For   ' Exit For でループを途中で抜ける
Next

カウンタが条件値を超えるまでループを繰り返し実行する(for ( カウンタ = 初期値; カウンタ <= 条件値; カウンタ += 増分値) {})。 条件値に負の値を指定した場合はその値より小さくなるまで繰り返し実行する。 Step を指定しない場合はデフォルトで 1 が指定される(1ずつ増加)。 ループを途中で抜ける場合、Exit For ステートメント を利用する。

For Each ... Next 文

構文

For Each <変数> In <コレクション>
  <処理>
  If <条件式> Then Exit For
Next

コレクションに含まれる要素数分ループする。

Do ... Loop 文

構文1 (Whileキーワード)

Do While <条件式1>
  <処理>
  If <条件式2> Then Exit Do    ' ループを抜ける
Loop
Do
  <処理>
  If <条件式2> Then Exit Do    ' ループを抜ける
Loop While <条件式1>

条件式が真( True )である間、処理が実行される。 途中で処理を抜ける場合、 Exit Do ステートメント を利用する。

構文2 (Untilキーワード)

Do Until <条件式1>
  <処理>
  If <条件式2> Then Exit Do    ' ループを抜ける
Loop
Do
  <処理>
  If <条件式2> Then Exit Do    ' ループを抜ける
Loop Until <条件式1>

条件式が真( True )になるまで、処理が実行される。 途中で処理を抜ける場合、 Exit Do ステートメント を利用する。

配列と連想配列

VBScript のデフォルトで利用できる配列と連想配列は以下の2種類。

  • Array
  • Scripting.Dictionary

Array

VBScriptネイティブサポートされている配列。 ほとんど何もできない…。。

プロパティ

(index) 指定されたインデックスの値を取得または設定します。

メソッド

(なし)

サンプルコード

' 動的配列の宣言
ReDim astrList(3)

' 指定した要素へ書き込み
astrList(0) = "hoge"

' 指定した要素の読み込み
WScript.echo astrList(0)

' 現在の長さを取得
WScript.echo UBound(astrList)

' 要素の巡回
For i = LBound(astrList) To UBound(astrList)
  WScript.echo astrList(i)
Next

' 配列の長さ変更
ReDim Preserve arr(5)
WScript.echo UBound(arr)

Scripting.Dictionary

WSHの「Scriptランタイム」でサポートされる VBScript ネイティブ 連想配列。

プロパティ

Count コレクションに保存されている要素数を取得します。
Item(key) 指定されたキーに一致する値を取得または設定します。
Key(key) 指定されたキーを新しいキー名にリネームします。

メソッド

Add (key, value) キーと値を指定して要素を追加する。
Exists (key) 指定されたキーがコレクションに含まれているかどうかを返す。 指定されたキーが含まれていた場合は真( True )、存在しない場合は偽( False )を返す。
Items () コレクションに含まれるすべての値を格納した配列を取得する。
Keys () コレクションで利用されるすべてのキーを格納した配列を取得する。
Remove (key) 指定されたキーに一致するキーと値の組み合わせを削除する。
RemoveAll () すべてのキーと値の組み合わせを削除する。

サンプルコード

' 宣言
Dim dic : Set dic = CreateObject("Scripting.Dictionary")

' 要素の追加
dic.Add "key1", "val1"
dic.Add "key2", "val2"
dic.Add "key3", "val3"

' 要素の削除
dic.Remove "key2"

' 要素の読み書き
dic.Item("key1") = "hoge"
wscript.echo dic.Item("key1")

' 要素の巡回 1 (for)
Dim keys : keys = dic.Keys()
For i = LBound(keys) To UBound(keys)
  wscript.echo keys(i)
Next

' 要素の巡回 2 (for each)
For Each key In dic
  wscript.echo dic.Item(key)
Next

' 要素の全削除
dic.RemoveAll

プロシージャ(関数)

VBScriptには戻り値によって以下に示す2種類の関数(=プロシージャ)がある。

Sub プロシージャ
戻り値なし。
Function プロシージャ
戻り値あり。

引数の渡し方は以下に示す2種類がある。特に指定しなければ参照渡し。

ByRef キーワード
参照渡し。
ByVal キーワード
値渡し。

Sub プロシージャ

Sub <関数名> ( <引数1>, <引数2>, ... )
  <処理>
End Sub

戻り値がない関数を定義する。

Function プロシージャ

Function <関数名> ( <引数1>, <引数2>, ... )
  <処理>
  <関数名> = <戻り値>
End Function

戻り値がある関数を定義する。 戻り値は定義した関数名に対して設定することで返却できる。

クラス

クラスの定義

クラスの宣言には Class ステートメント を利用する。

Class <クラス名>
  <メンバ変数>
  <プロパティ>
  <メンバ関数>
End Class

オブジェクトの生成と破棄

クラスのインスタンス生成には New ステートメント を利用する。 破棄は Nothing を指定する。

' クラス定義
Class Animal
  Public Age
End Class

' 変数宣言
Dim objAnimal

' オブジェクト生成
Set objAnimal = New Animal

' オブジェクト破棄
Set objAnimal = Nothing

アクセス修飾子

利用可能なアクセス修飾子は以下の2つ。

  • Public
  • Private

コンストラクタ/デストラクタ

コンストラクタは Class_Initialize という名前のメソッド、 デストラクタは Class_Terminate という名前のメソッド。 メソッド名は固定。

Class <クラス名>
  Private Sub Class_Initialize
    <初期化処理>
  End Sub
  
  Private Sub Class_Terminate
    <終端処理>
  End Sub
End Class

メンバ変数

アクセス修飾子に加えて変数名を定義することでメンバ変数が定義できる。 ハンガリアン記法では、メンバ変数の接頭辞(プレフィックス)は一般的に m_ が使われる(グローバル変数 g_ や スタティック変数 s_ があるため)。 ちなみに、VBScript のクラスには スタティック変数やスタティック関数は作れない。

アクセス修飾子を特に指定しない場合、 Public で定義される。

Class <クラス名>
  [Public | Private] <変数名>
End Class

プロパティ

いわゆる Getter / Setter が定義できる。 Getter は Property Get ステートメント を利用して定義する。 Setter は Property Let ステートメント または Property Set ステートメント を利用して定義する。 値渡しが Property Let ステートメント で、参照渡しが Property Set ステートメント

アクセス修飾子を特に指定しない場合、 Public で定義される。

Class <クラス名>
  ' Getter
  [Public | Private] Property Get <変数名>
    <処理>
    <変数名> = <戻り値>
  End Property

  ' Setter (値渡し)
  [Public | Private] Property Let <変数名> (<引数>)
    <処理>
  End Property

  ' Setter (参照渡し)
  [Public | Private] Property Set <変数名> (<引数>)
    <処理>
  End Property
End Class

メンバ関数

アクセス修飾子に加えてプロシージャを定義する。 戻り値がない場合 Sub プロシージャ 、戻り値がある場合 Function プロシージャ を利用する。

アクセス修飾子を特に指定しない場合、 Public で定義される。

Class <クラス名>
  [Public | Private] Sub <関数名> ( <引数1>, <引数2>, ... )
    <処理>
  End Sub

  [Public | Private] Function <関数名> ( <引数1>, <引数2>, ... )
    <処理>
    <関数名> = <戻り値>
  End Sub
End Class

継承

VBScript の基本機能として継承は存在していないとのこと。 独自実装が必要そう。

OLEオブジェクト

VBScript では簡単にレジストリ登録済みDLLの呼び出しができる。 呼び出すときは CreateObject(<クラス名>) を利用する。 指定するクラス名はレジストリ上の 「HKEY_LOCAL_MACHINE\Software\Classes」 に定義された名前を指定する。

Dim obj : Set obj = CreateObject("Scripting.FileSystemObject")

今回は「VBScript の 基本」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

参考記事

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!