VBA(VB6)のプログラミング言語特性

JavaエンジニアがVBAを始めるにあたって、覚えておきたい内容を書き連ねたいと思います。

ローカル変数の宣言はDimを使う

ローカル変数の宣言と初期化は別に行います。

Dim strVal as String
strVal = "初期値"

動的配列の要素数を変更はReDimを使う

VBA の配列には「静的配列」と「動的配列」の2種類の配列が存在します。動的配列は要素数が決まっていない場合に使う配列です。

格納したデータを残したまま配列の要素数を変更する場合には、ReDim Preserve を指定します。

Dim A() As String
ReDim A(2)
A(0) = "山田"
A(1) = "鈴木"
A(2) = "佐藤"
 
ReDim Preserve A(3)
A(3) = "木村"
MsgBox Join(A) 'Joinは配列を結合して文字列を返す関数です

変数の特殊な型:Variant

Variant 型は VB あるいは VBA 独自のどんな値でも入れることができる型です。また、変数の宣言時に型を指定しない場合、変数は自動的にVariant型になります。

Dim val 'Variant型として処理される
val = 123; '数値も入る
val = "文字列" '文字も入る
val = Date '日付も入る

変数のスコープ(適用範囲)

ブロック単位のスコープがないことにご注意ください。

  • Public:すべてのファイルから参照できます。
  • Private:宣言したファイル内から参照できます。
  • Dim:宣言した関数の中だけで参照できます。
If bol = True Then
  Dim strVal as String
  strVal = "メッセージ"
End If
Msgbox strVal '正常に「メッセージ」が表示される

行を途中で折り返す場合

VBAコードは1行ごとに命令文を記述して実行されます。 行の途中で改行したい場合は、「 _」半角スペース+アンダースコアで改行することができます。

If A(0) = 100 And _
    A(1) = 100 And _
    A(2) = 100 And _
    A(3) = 100 And _
    A(4) = 100 Then
    MsgBox "○"
End If

SubとFunctionのちがい

Sub(メインプログラム)とFunction(プロシージャ:関数)のちがいは外部からの実行の有無と戻り値の有無です。

  • Sub(メインプログラム)…外部からの実行→○、戻り値→×
  • Function(プロシージャ:関数)…外部からの実行→×、戻り値→○

Function関数の戻り値の設定

Function関数の戻り値は、「関数名 = 戻り値」で設定します。

Function FuncSample() As String
    FuncSample = "Hello World!" '戻り値の設定
End Function

Exitでいろいろな処理から抜ける

途中で処理を終了するには、Exitステートメントを使います。

  • Exit Sub:Sub関数を抜けます
  • Exit Function:Function関数を抜けます
  • Exit Do:Do文を抜けます
  • Exit For:For文を抜けます
  • Exit Property:プロパティを抜けるます
Dim i As Integer
For i = 1 To 5
    If i = 3 Then
        Exit For  'Forを抜ける
    End If
Next

GoToで任意のラベルにジャンプする

GoToステートメントは指定したラベルまで処理をジャンプさせることができます。ラベルは同じプロシージャ内だけで、他のプロシージャへジャンプさせることはできません。

GoToステートメントを多用するとプログラムが分かりにくくなるので、なるべく使わないようにしましょう。

Sub ExecGoTo()
    MsgBox "メッセージ1"
    GoTo Label1
    MsgBox "メッセージ2"  '実行されない
Label1:
    MsgBox "メッセージ3"
End Sub

基本制御構文を覚えよう

条件分岐

'
' VBA
'
If 条件式1 Then
    処理1
ElseIf 条件式2 Then
    処理2
Else
    処理3
End If
//
// Java
//
if (条件1) {
    処理1;
} else if (条件2) {
    処理2;
} else {
    処理3;
}

繰り返し

'
' VBA
'
For 変数 = 初期値 To 到達値
    処理
Next
'
' VBA
'
Do While 条件式
    処理
Loop

//
// Java
//
for ( 変数 = 初期値; 条件式; 増分 ) {
    処理;
}
//
// Java
//
while (条件式) {
    処理;
}

以上、VBA特有の特性でした…!