今回は「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 の 基本」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
参考記事
- MSDN - VBScript概要
- Qiita - プログラムの基本構文が分かる人へのVBScriptのまとめ
- VBScript入門講座
- VBSの家 - Lesson.14 大文字と小文字
- インストラクターのネタ帳 - 変数のプレフィックス一覧
- Black Everyday Company - 【VB系】変数の宣言と初期化を1行で書く(VB.NET,VBA,VBScript)
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!