VBS 配列 Array,Join,Redim,Preserve

配列の作成方法を紹介します。


<TOPIC>


 ・固定値で使用、引数のオプションなどはARRAYで定義

 ・配列の数が決まっているなら、REDIMで定義

 ・動的な数の配列を定義するなら、REDIM PRESERVEで定義

 ・多次元配列の場合、REDIMで定義。ただし次元数の変更はできません。

     REDIM A(1,2)

     2→3への要素の変更は出来ません。

     REDIM A(1,3)

 ・配列を文字列に戻す場合は、JOIN(変数,"")を使用する




■Arrayを使用した配列の制御方法

Array(n,n1,n2,n3.....)



Dim AryD



次に、Arrayに設定したい値、たぶん初期値として使用したい値を設定します。

※配列へはインデックス0から設定されます。


AryD = Array("配列0にセット","配列1にセット","配列2にセット")



では、配列の中身を表示してみましょう。

For i = 0 to ubound(AryD)

  ec AryD(i)

  '[2008/10/07 22:16:54]配列0にセット

  '[2008/10/07 22:16:54]配列1にセット

  '[2008/10/07 22:16:54]配列2にセット

Next



配列か判定する方法はISARRAYで判定できます




■他の配列の方法

配列をはじめに設定する

Dim aryList(10)



配列を動的に設定する

変数宣言では配列数は設定しません



 Dim aryList2()



Redimを使用して配列の数を指定します



Redim aryList2(10)



配列数がわからない場合の動的な設定

Preserveキーワードを使用して配列を設定します



Dim aryList3()

Dim x



x=30

For i = 0 to x

Redim Preserve aryList3(i)

aryList3(i)=i

Next



配列を文字列に戻す

配列を元に戻す場合に良く使用するのが、JOIN関数です。







メッセージ表示用
Sub ec(strmsg)

    Wscript.Echo "[" & Date & " " & time & "]" & strmsg

End Sub

VBS 構造体(CLASS)

VBSではVB、VBAのように構造体を使用できないのです。これがないとかなりキツイ。。 その代わり?クラスを以下のように使用して構造体以上の動作が可能です。


<補足>
コンストラクタとは、オブジェクトが生成された時(Set Sg = New clsSys)に自動で呼び出されます。
デストラクタとは、オブジェクトを破棄する時(Set Sg = Nothing)に自動で呼び出されます。

では、実装の仕方について
'*** 最初にクラス定義 ***
CLASS clsSys

  Private Fso   'オブジェクト:ファイルシステム
  Private Shell 'オブジェクト:SHELL

  'コンストラクタ
  Private Sub Class_Initialize()

    Set Fso    = CreateObject("Scripting.FileSystemObject")
    Set Shell  = CreateObject("Wscript.Shell")

    Wscript.Echo "コンストラクタ起動"

  End Sub

  'デストラクタ
  Private Sub Class_Terminate()

    Set Fso = Nothing
    Set Shell = Nothing

    Wscript.Echo "デストラクタ起動"

  End Sub


  'コマンド実行処理
  Public Function Exec(strcmdline)

    On Error Resume Next

    Wscript.Echo "[cmdline] " & strcmdline

    Set oExec = Shell.Exec ( strcmdline )

    IF Err.Number <> 0 Then
      Exec = Err.Number
      Exit Function
    End If

    Do While (oExec.Status=0)
      WScript.Sleep 100
    Loop

    'リターンコード
    Exec = oExec.ExitCode

    On Error Goto 0

  End Function

END CLASS


'*** ここからが処理 ***
Dim clsSeigyo

'クラス生成(コンストラクタが実行されます)
Set clsSeigyo = New clsSys

Call main()

'クラス初期化(デストラクタが実行されます)
Set clsSeigyo = Nothing

Wscript.Quit(intRet)


'** メイン処理 **
Sub main()

  Dim arrycmd
  Dim i

  arrycmd = array( "Cmd.exe /C Echo OK?","Cmd.exe /C Echo NG?")

  For i = 0 To Ubound(arrycmd)
    ec clsSeigyo.Exec(arrycmd(i))
  Next

End Sub

'** 実行結果 **


コンストラクタ起動
[cmdline] Cmd.exe /C Echo OK?
'[2008/12/06 13:49:07]0
[cmdline] Cmd.exe /C Echo NG?
'[2008/12/06 13:49:07]0
デストラクタ起動

'** 参考に **


クラス内の呼び出し方について

VBS ファイル書き込み( FileSystemObject )

REM 書き込みモード
Const ForWriting = 2

Set Fso = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\SAMPLE\書き込みするファイル.txt", ForWriting)

REM ファイル書き込み(行)
objFile.WriteLine "書き込むデータバッファを設定します"
REM ファイルクローズ
objFile.Close

REM 初期化(どちらでも可)
Set objFile = Nothing
Set Fso   = Nothing

VBS ファイル操作( FileSystemObject )

□ファイルの読み込み、書き込み、ファイルプロパティなどファイル操作を行う場合に使用します。

・定義方法
Dim Fso
Set Fso = CreateObject("Scripting.FileSystemObject")

・ファイル名
Dim File
Set File = Fso.GetFile("C:\SAMPLE\読み込ませるファイル.txt")
File.Name 'ファイル名