Visual Basic Tips(一般)
- 既定プロパティの使用
- 配列の添え字のMAX:Uboundの使用
- コレクション:キーのチェック
- コレクション:解放方法
- CPU使用率を低くする:APIのSleep関数を使用
- 省略可能な引数を使用する場合:Optionalキーワード
- 戻り値の利用:関数内部では戻り値(関数名)は変数として利用可能
既定プロパティの使用
'以下は同じ結果になる。 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:関数内で変更した値がそのまま呼び出し側に反映される。
(と言うよりも呼び出し元の変数を参照するから当然そうなる)