プログラムの基本構文が分かる人へのVBScriptのまとめ


Windowsでバッチ処理を行うためにVBScriptを学び始めました。下記の記事はプログラミングが初めての人でもVBScriptが学べる内容です。

### [基礎解説 演習方式で身につけるチェック式WSH超入門：第1回　WSHを始めよう (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0606/02/news116.html)

しかし、私はJavaを勉強しているのでJavaとの違いに必要な部分を抜粋しました。自分用の復習用ノートです。

<!--more-->

### WSHとは？

スクリプトの実行環境。VBScriptとJScriptを実行できる。WSHがあるだけでは何もできない。新機能が追加される予定はなく、PowerShellが代わりとなる。PowerShellからWSHスクリプトを実行することはできる。

### VBScriptはオブジェクトが豊富

[基礎解説 演習方式で身につけるチェック式WSH超入門：第1回　WSHを始めよう (2/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0606/02/news116_2.html)

オブジェクトは主に次の三種類。上記の記事に詳細が載っています。

* WSHの基本オブジェクト
* Windows OSに標準添付されているオブジェクト
* 別途インストールが必要なオブジェクト

アプリケーションをショートカットキーで操作して、他のアプリと連携するにはWSHの基本オブジェクトとWindows OSに搭載されているShell.Applicationオブジェクト。これでエクスプローラーを操作する。

> アプリケーションをWSHなどの外部から操作することを「オートメーション」という。  
> <cite>via: <a href="”http://www.atmarkit.co.jp/ait/articles/0606/02/news116_2.html”" target="”_blank”">基礎解説 演習方式で身につけるチェック式WSH超入門：第1回　WSHを始めよう (2/3) - ＠IT</a></cite>

アプリケーション自体にWSHで使えるオブジェクトが用意されていれば柔軟に操作できるようです。

### VBScriptの実行方法

1.  ソースを~.vbsとして保存してダブルクリック
2.  コマンドプロンプトでcscript ~.vbs

2は作成したプログラムをコマンドプロンプトから実行するコマンドです。1の方法だとデフォルトではGUI版のwscript.exeが、2だとCUI版のcsript.exeが使われます。

### Option Explicitとは

ソースコードの1行目ににOption Explicitを記述しておけば型のエラーを検出してくれる。

### 変数の宣言

```vbnet
Dim x
Dim x : Dim y
```

### 定数の宣言

```vbnet
Const KEY_JUMP = 1
```

### 改行を表す

vbCrlfを文字列に&で結合すると、改行してくれる。

```vbnet
msg = "1行目" & vbCrlf "2行目"
```

### 文字列結合演算子は2種類ある

* +
* &

### セミコロンの代わりに改行

VBScriptでは式の終わりを改行で表す。複数行に式がまたがる場合は、行末に半角スペースと_（アンダースコア）を記述する。

### 関数の戻り値を変数に代入する場合

関数名 引数でも実行できるが、その戻り値を変数に代入する場合は引数を()で挟まなければならない。複数の引数の区切りは,（カンマ）を使う。

```vbnet
x = InputBox("説明文")
```

### ifの条件式には括弧()を使わずthenを使う

関数の引数にも()を使わなくても実行できる。また、ブロックを表す波括弧も使わない。

```vbnet
if Msg = "1" Then
    MsgBox "正解です"
Elseif Msg = "2" Then
    MsgBox "惜しい！"
Else
    MsgBox "正しい選択肢を選んで下さい"
End If
```

### コメント

```vbnet
'1行コメント
```

複数行にまたぐ//のようなコメントはVBScriptには用意されていません。

### コメントアウト

処理を常にflaseになるif文で囲みます。

```vbnet
If False Then
    ' 擬似コメントアウトする処理
End If
```

### どんな値も入るバリアント型

> VBScriptで扱われる変数はすべて、どんな値でも格納できるバリアント（Variant）型であり、文字列を扱う文字列型や日付・時刻を扱う日付型といった特定のものは厳密にいうと存在しない。が、バリアント型の変数に値を格納すると、その値の種類に応じて（例えば文字列なら文字列型として）機能するので、実質的にはVBScriptにはさまざまな型が存在するものとして考えるべきである。VBScriptのヘルプには、例えば文字列を扱う型のことを「バリアント型 (内部処理形式が文字列型 (String) の Variant)」などと表現しているが、本稿ではこれを単に「文字列型」あるいは「String」と呼ぶことにする。  
> <cite>via: <a href="”http://www.atmarkit.co.jp/ait/articles/0609/22/news104.html”" target="”_blank”">基礎解説 演習方式で身につけるチェック式WSH超入門：第5回 データ型について理解を深めよう (1/5) - ＠IT</a></cite>

### 珍しい型

 データ型名（英語名）   |                                    説明                                     | 接頭辞（プリフィックス）
:-------------:|:-------------------------------------------------------------------------:|:------------:
通貨型（Currency） | -922,337,203,685,477.5808～922,337,203,685,477.5807の範囲の値を持つデータ型（小数点以下は4けた） |     cur     
 エラー型（Error）  |                               エラー番号を持つデータ型                                |     err     

<cite>via: <a href="”http://www.atmarkit.co.jp/ait/articles/0609/22/news104.html”" target="”_blank”">基礎解説 演習方式で身につけるチェック式WSH超入門：第5回 データ型について理解を深めよう (1/5) - ＠IT</a></cite>

### 型の種類は変数名で表す

型宣言ができないため、変数名の先頭に方の省略名を記述すると良い。

```vbnet
Dim strMsg
Dim intNum
```

### 論理積は&&じゃなく、Andでつなぐ

```vbnet
if intNum >= 0 And intNum < 10 Then
```

### 暗黙の型変換

文字列から数値型へ。数値型から文字列へ自動変換される。整数型から浮動小数型へも自動変換される。

### 明示的な型変換

数値ではなく、文字列の数字同士に+演算子を使うと、計算ではなく文字列結合として機能する。その場合は、型変換用の関数を使う。関数名は型の省略名の前にCをつけたもの。

```vbnet
Dim str = CStr(intNum)
```

### Empty値

初期化されていない値のこと。

```vbnet
Dim valEmpty
MsgBox TypeName(valEmpty)
'Emptyと表示される
```

他の型としての扱われ方

 型   |   値  
:----:|:-----:
文字列  |  ""  
 数値  |   0  
ブール値 | False

> VBScriptにはEmpty値が存在するために、変数に値を代入しなくてもすぐに初期値として用いることができるので便利だが、意図した型とは違う型として扱われることを防ぐためには、変数を宣言した後、初期値を代入した方がよい（valEmpty = "" 、valEmpty = 0 、valEmpty = Falseなどとする）。
>
> <cite>via: <a href="”http://www.atmarkit.co.jp/ait/articles/0609/22/news104_5.html”" target="”_blank”">基礎解説 演習方式で身につけるチェック式WSH超入門：第5回 データ型について理解を深めよう (5/5) - ＠IT</a></cite>

### Null値

> Null値は、Empty値とは違い、「無効な値」を意味する。WSHでは主にデータベースを扱う際、Nullの項目を変数に代入するとNull値が格納される。x = NullのようにしてNullを変数に代入することもできる。 　Null値は無効な値なので、数値演算などを行うとNull値のままになる。また、関数などの引数に渡すとエラーが発生することもある。論理演算を行う際もNull値が含まれると特有の扱いをされるので注意が必要だ。
>
> <cite>via: <a href="”http://www.atmarkit.co.jp/ait/articles/0609/22/news104_5.html”" target="”_blank”">基礎解説 演習方式で身につけるチェック式WSH超入門：第5回 データ型について理解を深めよう (5/5) - ＠IT</a></cite>

### スカラ変数とは？

配列変数ではない単なる変数のこと。1個の値を格納する変数。

### 変数名の制約

* 先頭文字はアルファベット
* ピリオド"."は使用できない
* 255文字以内

### 配列とfor文

```vbnet
Option Explicit
Dim intNumbers(4) 'サイズ5の配列を宣言

配列の各要素に値を代入
Dim intCounter 'ループカウンタ用変数
For intCounter = 0 To 4 '0から4まで、1ずつ変化させる
    '配列に、インデックスの倍の値を代入
    intNumbers(intCounter) = intCounter * 2
    'ループを抜ける
    If intCounter > 2 Then Exit For
Next

Dim intTemp, strMessage
strMessage = ""
For Each intTemp In intNumbers '全要素に対して繰り返す
    ',で文字列をつなげる
    strMessage = strMessage & intTemp & ","
Next
MsgBox strMessage
```

### 動的配列

```vbnet
Dim intNumbers() '動的配列を宣言
ReDim intNumbers(3) '動的配列のサイズを4に

'配列に値を代入する処理

'動的配列のサイズを1増やす（値は保持）
ReDim Preserve intNumbers(4)
```

ReDimeにPreserveをつけないと、要素が保持されない。また、Dim宣言せずにいきなりReDimeで宣言することもできる。

> DimとReDimの違いは、固定サイズか動的かと、Dimでは数値リテラルしか指定できないのに対し、ReDimは変数や式も指定可能という点である。
>
> <cite>via: <a href="”http://www.atmarkit.co.jp/ait/articles/0611/03/news015_3.html”" target="”_blank”">基礎解説 演習方式で身につけるチェック式WSH超入門：第6回　VBScriptの配列を極める (3/5) - ＠IT</a></cite>

### 多次元の動的配列

```vbnet
Option Explicit
Dim intNumbers()
ReDim intNumbers(9,9)
ReDim Preserve intNumbers(9,15) '(15,9)だとエラー
```

既存の配列を保持する場合は、最後の次元のサイズしか変更できない。

### Subプロシージャ

引数がない場合は()は省略してよい

```vbnet
Sub ＜Subプロシージャ名＞ ()
      '処理
End Sub
```

引数はデフォルトで参照渡しと扱われる。値渡しの場合はByValキーワードを使う。何もキーワードを記述しない場合は、ByRefが省略されていると見なされる。

```vbnet
Sub ShowSquare(ByVal lngNumber)
    '処理
End Sub
```

### Functionプロシージャ

戻り値はreturnではなく、Functionプロシージャ名と同じ名前の変数に代入することに注意。

```vbnet
Function ＜Functionプロシージャ名＞ ()
       '処理
      <Functionプロシージャ名＞ = 戻り値
End Function
```

### Do~Loop

#### 条件が真になるまで

```vbnet
Do Until ＜条件＞
　　ステートメント…
Loop

Do
　　ステートメント…
Loop Until ＜条件＞
```

#### 条件が真の間

```vbnet
Do While ＜条件＞
　　ステートメント…
Loop

Do
　　ステートメント…
Loop While ＜条件＞
```

### ErrオブジェクトをSelect Case文で判定

On Error Resume NextとOn Error Goto 0で囲まれた部分でエラーが発生した場合は、処理を停止せずに次の行を実行します。

```vbnet
Option Explicit
Dim dblCalculatedNumber, strDivisorNumber
Do
    strDivisorNumber = InputBox("割る数を入力してください")
    On Error Resume Next
    dblCalculatedNumber = 1 / strDivisorNumber
    Select Case Err.Number
        Case 11
            '0除算エラー。
            MsgBox "0で割ることはできません。"
        Case 13
            '型不一致エラー。
            MsgBox "数値を入力してください。"
        Case 0
            'エラーが発生していない場合はループを抜ける。
            Exit Do
        Case Else
            'そのほかのエラーの場合。
            MsgBox "想定外のエラーです。"
        End Select
    'エラー情報をクリアする。
    Err.Clear
    On Error Goto 0
Loop
MsgBox dblCalculatedNumber
```

### 既定プロパティ

Errオブジェクトの既定プロパティはNumberであるので、Numberプロパティを参照する場合は省略できる。

```vbnet
If Err = 11 Then
```

### Withでオブジェクト名を省略

```vbnet
Option Explicit
On Error Resume Next
With Err
    'エラーの生成。
    .Raise 10
    MsgBox "エラー番号:" & .Number & vbCrLf & _
           "説明:" & .Description & vbCrLf & _
           "ソース:" & .Source & vbCrLf
End With
```

### クラス

WSHではスクリプト終了時にすべてのオブジェクト変数に格納されたオブジェクトは解放されるため、Nothingは必須ではない。ただ、VBScriptではオブジェクト変数にオブジェクトや値を代入するのにSetキーワードは必要である。

```vbnet
Option Explicit

'クラス Sampleの定義。
Class Sample
    'Captionプロパティ。
    Public Caption
End Class

'オブジェクト変数の宣言。
Dim objSample1
'オブジェクトの作成。
Set objSample1 = New Sample
'オブジェクトのプロパティに値を代入。
objSample1.Caption = "秋葉原に着いたにょー"
'オブジェクトのプロパティの値を読み込む。
MsgBox objSample1.Caption
'オブジェクト変数の破棄。
Set objSample1 = Nothing
```

### アクセサの生成

```vbnet
Class Sample
    'プライベート変数の設定。
    Private m_strCaption

    'Captionプロパティの値を設定。
    Public Property Let Caption(Value)
        m_strCaption = Value
    End Property

    'Captionプロパティの値を取得。
    Public Property Get Caption
        Caption = m_strCaption
    End Property
End Class
```

* 既定パロパティの指定はPublic Default Property Get Captionとする。
* プライベートプロパティに接頭辞にm_を付けるのが慣例
* Property Let・Property GetステートメントはPublicキーワードを省略することができる。

### イニシャライザ（コンストラクタ）

* JavaのようにアクセサをGet,Setという接頭辞を付けなくても自動判別してくれるのは便利。

    ```vbnet
    Option Explicit
    Class Sample 
      'プライベート変数の設定。
      Private m_strCaption
      'コンストラクタ
      Private Sub Class_Initialize()
          m_strCaption = "うさだって言うな！"
      End Sub

      'Captionプロパティの値を取得。
      Public Property Get Caption
          Caption = m_strCaption
      End Property

      'Showメソッド。
      Public Sub Show()
          MsgBox Me.Caption
      End Sub
    End Class

      'オブジェクト変数の宣言。
      Dim objSample1
      'オブジェクトの作成。
      Set objSample1 = New Sample
      'オブジェクトのプロパティの値を読み込む。
      MsgBox objSample1.Caption
      'オブジェクト変数の破棄。
      Set objSample1 = Nothing
    ```

### WScriptオブジェクト

WSHが起動する際に自動的にインスタンス化されるオブジェクト。宣言や初期化をしなくても使える。

> ErrオブジェクトはVBScriptのオブジェクトなので、Internet Explorer上で表示されるHTML文書内のスクリプトなどでも用いることができるが、WScriptオブジェクトはWSH固有の機能なので、HTML中では使用できない。
>
> <cite>via: <a href="”http://www.atmarkit.co.jp/ait/articles/0705/17/news121.html”" target="”_blank”">基礎解説 演習方式で身につけるチェック式WSH超入門：第10回　WScriptオブジェクトを利用する（1） (1/3) - ＠IT</a></cite>

### バッチモード

スクリプト実行中にエラーやEchoメソッドの表示がされない。