Visual Basic Tips(一般)


既定プロパティの使用

'以下は同じ結果になる。
TextBox1.Text = "TEST"    'テキストボックスの場合
TextBox1 = "TEST"
Label1.Caption = "LABEL1" 'ラベルの場合
Label1 = "LABEL1"

配列の添え字のMAX

'配列の最大の添え字を使う場合はなるべくUBound()を用いる。
Dim arrData(10) as Integer
...
For i=1 To Ubound(arrData)
...

コレクション:キーチェック

    Dim col As Collection
    ...
    On Error Resume Next
    nCnt = col.Item("TestKey")
    'エラーが有ればキーは存在しない
    If Err Then
       'コレクションへの追加
      col.ADD [コレクションデータ], "TestKey"
    End If

コレクション:解放方法

コレクションの内容を全て削除し解放するために、コレクションの全てのデータをRemoveで 削除し、コレクションオブジェクトにNothingを設定してやる。

Dim colTest As Collection
    ...
    'コントロールの解放
    Do While colTest.Count
        colTest.Remove 1
    Loop
    Set colTest = Nothing

CPU使用率を低くする

Do ... Loop等のループ処理でDoEventsをコールすることで、自分のプログラムの中でのコントロール等の 制御ができる様になりますが、他のプログラムへCPU資源を割り当てられなくなります。 このため、ループ処理内で他のプログラムに制御が移る様に、APIのSleep関数をコールしてやります。

'Sleep(API)の宣言
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
...
Do
    ...   処理
    DoEvents
    Call Sleep(10)
Loop

省略可能な引数を使用する場合

省略可能な引数をプロシージャ内で定義するには、Optional キーワードを使用します。

'引数が文字列型の場合の例(引数が省略された場合は長さが0の文字列に初期化される)
Private Sub testsub1(ByRef a1 As String, _
                    Optional ByRef a2 As String)  ' Optional ByRef a2 As String=""と同様
    Dim strWork As String
    strWork = a1 & a2
    End If
    MsgBox "testsub1..." & strWork
End Sub
'引数が数値型の場合の例(引数が省略された場合は0の値に初期化される)
Private Sub testsub2(ByVal a1 As Long, _
                     Optional ByVal a2 As Long)  ' Optional ByVal a2 As Long=0と同様
    Dim intWork As Long
    intWork = a1 + a2
    MsgBox "testsub2..." & intWork
End Sub
'引数がVariant型の場合の例
Private Sub testsub3(ByVal a1 As Variant, _
                     Optional ByVal a2 As Variant)
    Dim strWork As String
    strWork = a1
    If Not IsMissing(a2) Then    '引数の省略の確認にIsMissingを使用する
        strWork = strWork & a2
    Else
        strWork = strWork & "...Missing"
    End If
    MsgBox "testsub3..." & strWork
End Sub

戻り値の利用

関数の引数も関数内で通常の変数の様に利用可能である。(Function定義でのAs以降の属性の変数と同等)

'テスト関数(指定値の2倍までの合計を求める関数)

Private Function test(ByVal aData As Integer) As Integer
    Dim i As Integer
    test = 0                 '戻り値をクリア
    aData = aData * 2         '指定値の2倍
    For i = 1 To aData
        test = test + i     '戻り値に加算
    Next i
End Function

Private Sub Command1_Click()
    Dim i As Integer
    i = 50
    MsgBox "test=" & test(i)
    MsgBox "Parameter(i)=" & i
End Sub

※但し、ByvalとByrefで結果に違いがある。
 Byval:関数内で値を変更しても呼び出し側には変化は無し。
 Byref:関数内で変更した値がそのまま呼び出し側に反映される。
     (と言うよりも呼び出し元の変数を参照するから当然そうなる)


ページのトップへ戻る