基本的なこと

このエントリーをはてなブックマークに追加  


新しい演算子


変数の値を一つずつ増加(インクリメント)させたり、逆に減少(デクリメント)させるとき、今までは次のようにしていました。

Sub Sample()
    Dim cnt As Long, i As Long
    For i = 1 To 5
        cnt = cnt + 1
    Next i
    MsgBox cnt      ''結果は「5」
End Sub

VB 2005では、C言語などでお馴染みの「+=」という演算子が使えるようになりました。

Sub Sample()
    Dim i, cnt As Integer
    For i = 1 To 5
        cnt += 1
    Next
    MsgBox(cnt.ToString)      ''結果は「5」
End Sub

もちろん、増加させるだけでなく「*=」や「-=」「/=」なども使えます。このような演算子を複合演算子と呼びます。

もうひとつ、新しい演算子が追加されています。たとえば、VBAで次のようなコードを記述したとします。

Sub Sample()
    Dim n As Long
    n = 12
    If Proc1(n) And Proc2(n) Then
        MsgBox "Yes"
    Else
        MsgBox "No"
    End If
End Sub

Function Proc1(n As Long)
    Debug.Print "Proc1"
    If n < 10 Then
        Proc1 = True
    Else
        Proc1 = False
    End If
End Function

Function Proc2(n As Long)
    Debug.Print "Proc2"
    If n Mod 2 = 0 Then
        Proc2 = True
    Else
        Proc2 = False
    End If
End Function

Proc1がTrue、かつ、Proc2がTrue、かどうかを判定しています。引数に渡したnは10より大きいので、Proc1の「If n < 10」判定で偽となり、Proc1はFalseを返します。すると「If Proc1(n) And Proc2(n) Then」は、Proc2を評価するまでもなく条件全体が偽と確定します。しかしVB6/VBAでは、このようなケースでも毎回評価する必要のないProc2が評価されていました。イミディエイトウィンドウでご確認ください。これは、Or演算子でも同じことです。

VB 2005では、こうした無駄を省くために新しい演算子が追加されました。それが「AndAlso」と「OrElse」です。And演算子の代わりにAndAlso演算子を使うことで、評価する必要のない条件は評価されなくなりました。これはグッドですね。

Sub Sample()
    Dim n As Long
    n = 12
    If Proc1(n) AndAlso Proc2(n) Then
        MsgBox("Yes")
    Else
        MsgBox("No")
    End If
End Sub

Function Proc1(ByVal n As Long)
    Debug.Print("Proc1")
    If n < 10 Then
        Proc1 = True
    Else
        Proc1 = False
    End If
End Function

Function Proc2(ByVal n As Long)
    Debug.Print("Proc2")
    If n Mod 2 = 0 Then
        Proc2 = True
    Else
        Proc2 = False
    End If
End Function


括弧


VBAでは、返り値を使う場合に括弧を付け、返り値を使わないときは括弧を付けませんでした。
VB 2005では、すべて括弧を付けます。括弧を付け忘れると自動的に付くので、あまり意識する必要はないでしょう。

Sub Sample()
    If MsgBox("確認", vbYesNo) = vbYes Then
        MsgBox "メッセージ"
    End If
End Sub

Sub Sample()
    If MsgBox("確認", vbYesNo) = vbYes Then
        MsgBox("メッセージ")
    End If
End Sub


MsgBox


画面に文字列を表示するMsgBoxはそのまま使えますが、MessageBox.Showも使えます。
両者では、定数や機能が異なります。

Sub Sample()
    If MessageBox.Show("メッセージ", _
                       "タイトル", _
                       MessageBoxButtons.YesNo, _
                       MessageBoxIcon.Question, _
                       MessageBoxDefaultButton.Button2, _
                       MessageBoxOptions.RightAlign, _
                       True) = Windows.Forms.DialogResult.Yes Then
        MsgBox("Yes")
    End If
End Sub


コントロール配列


使えなくなりました。
まぁ、Excel VBAではもともとコントロール配列を使えませんでしたから、VBAユーザーにとっては何も変わりないですね。

ただ、複数のコントロールで同じ処理をするのが、超簡単になっています。詳しくは、下記コンテンツをご覧ください。



デフォルトプロパティ


VBAでは、プロパティを省略したときに、デフォルトプロパティが指定されたものとみなされましたが、VB 2005ではプロパティを指定しないとエラーになります。
たとえば、VBAではUserFormで次のようなコードが正常に動作しました。

Private Sub CommandButton1_Click()
    TextBox1 = "tanaka"
End Sub

TextBoxのデフォルトプロパティはTextプロパティなので「TextBox1 = "tanaka"」は「TextBox1.Text = "tanaka"」とみなされました。
VB 2005では、プロパティを省略できません。


(何か思いついたら追記します)

このエントリーをはてなブックマークに追加