目次

制御文

処理の流れを制御する文を制御文といいます。制御文を使うと、ある条件を満たした場合にのみ処理を実行させたり、ある処理を繰り返し実行させることができます。制御文の一覧を次に示します。

分岐 (If)

条件を満たした場合にのみ、ある処理を実行させたいときは、If文を使用します。

If 条件 Then
  条件を満たしたときに実行する処理
End If

条件を満たした場合に実行する処理に加えて、条件を満たさなかったときに実行する処理も指定することができます。

If 条件 Then
  条件を満たしたときに実行する処理
Else
  条件を満たさなかったときに実行する処理
End If

条件を満たさなかった場合にのみ処理を実行させたいときは、条件の前に Not 句を付けます。

If Not 条件1 Then
  条件を満たさなかったときに実行する処理
End If

複数の条件をすべて満たした場合にのみ処理を実行させたいときは、複数の条件を And 句で繋げます。

If 条件1 And 条件2 Then
  条件1と条件2の両方を満たしたときに実行する処理
End If

複数の条件のうち、いずれかひとつでも満たした場合に処理を実行させたいときは、複数の条件を Or 句で繋げます。

If 条件1 Of 条件2 Then
  条件1か条件2のいずれかでも満たしたときに実行する処理
End If

多重分岐 (Select Case)

ある変数の値を調べて、その値によって実行する処理を変えたい場合は、Select Case文を使用します。

Select Case varname

    Case value1
        ' varnameの値がvalue1のときに実行する処理

    Case value2, value3, value4
        ' varnameの値がvalue2value3又はvalue4のいずれかのときに実行する処理

    Case value5 To value7
        ' varnameの値がvalue5からvalue7の間のときに実行する処理

    Case Is > value8
        '  varnameの値がvalue8より大きいときに実行する処理

    Case Is < value9
        '  varnameの値がvalue9より小さいときに実行する処理

    Case Else
        ' varnameの値が上記のいずれでもないときに実行する処理

End Select

複数の値をカンマで区切って並べることができます。

Case 4, 5, 6, 7

最小値から最大値の間の範囲を表すためにToを使用することができます。

Case 4 To 7

反復 (Do, Do While)

条件を満たしている間、ある処理を繰り返し実行させるには、Do文またはDo While文を使用します。

Do
  繰り返し処理
Loop Until 条件
Do While 条件
  繰り返し処理
Loop

Do文とDo While文のどちらも条件を満たしている間は処理を繰り返し実行しますが、Do文とDo While文は条件を判定するタイミングが異なります。

Do文は、まず繰り返し処理を実行してから条件の判定を行います。つまり、最初から条件を満たさなくても、最低1回は繰り返し処理を実行します。

Do While文は、まず条件の判定をして、条件を満たせば繰り返し処理を実行します。つまり、最初から条件を満たさなければ、繰り返し処理を1度も実行しません。

条件を満たさなくなったら繰り返し処理を止めますが、Exit Do文を用いて強制的に繰り返しを止めさせることもできます。

反復 (For)

ある処理を一定の回数繰り返して実行させたい場合、Do文やDo While文を使うことで実現することができます。たとえば、Do While文を使って、処理を10回繰り返す例を次に示します。

i = 1
Do While i <= 10 Then
  sum = sum + i
  i = i + 1
Loop

このように、ある一定の回数繰り返して処理を実行することは多いので、For文という専用の構文が用意されています。

For 変数名 = 初期値 To 最大値
  繰り返し処理
Next 変数名

For文では、繰り返し処理を行う前に、変数に初期値を代入します。処理を繰り返す(Next句に達する)たびに、この変数の値には1が加わります。変数の値が最大値を超えると、処理を繰り返すのを止めます。

For文を使って、処理を10回繰り返す例を次に示します。

For i = 1 To 10
  sum = sum + i
Next i

Exit For - Forループからの脱出

Forループの内部でForから抜け出すには、Exit For文を使用する。

For i = 1 To 10
  sum = sum + i
  If i > 5 Then
    Exit For
  End If
Next i

Continue

Visual Basic 2005からContinue文が追加された。

Visual Basic .NET 2003以前はContinue文が無いため、GoTo文を使用する。

Sub foo(bar)
  For i = 0 To 10
    If bar = "baz" Then
      GoTo continue
    End If

    Debug.Print bar

continue:
  Next
End Sub

On Error GoTo

COMクライアントをVisual Basicで作成した場合、COMサーバでエラーが発生するとVisual Basicの例外メカニズムがエラーメッセージを表示します。これは実行時エラーとして扱われるため、ダイアログボックスを表示した後、プログラムは終了してしまいます。

これを防ぐには、On Errorステートメントでエラー発生時の例外処理を記述して、自前でエラーハンドリングを行わなければなりません。

Private Sub foo()
  On Error GoTo ErrorHandler
  ・・・
  ' COMサーバの機能を利用する
  obj.Advise(pCallBack)
  ・・・
  Exit Sub
ErrorHandler:
  ' エラー時の処理
  MsgBox Err.Description, 0, "ユーザ固有のエラー処理"
  Exit Sub
End Sub

VBのプログラムからDLLの関数を呼ぶ

VBのプログラムからDLLの関数を呼ぶためには、DLL関数の宣言を行う必要がある。

戻り値がある関数の場合:

Declare Function FuncName Lib "DllName" (ArgList) As Type

戻り値がない関数の場合:

Declare Sub FuncName Lib "DllName" (ArgList)
FuncName
DLL関数の名前
DllName
DLLのファイル名
ArgList
引数のリスト
Type
DLL関数の戻り値のデータ型

Visual BasicのプログラムからDLLの関数を呼び出す例を次に示す。

Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)

'(中略)

Sleep(500)

コメント

シングルクォート(')から行末まではコメントとなる。コメントは、ソースプログラムに注釈を付けるために使用される。コメントはプログラムの実行には影響しない。

アンダースコア(_)で行が続く場合は、その続きもコメントとなる。

Dim id As Integer ' 識別子

' 識別子の初期化
id = 1

Errオブジェクト

Errオブジェクトは実行時エラーに関する情報を格納している。ErrオブジェクトのDescriptionプロパティには、エラーに関連する説明の文字列が格納されている。

クラス・モジュール

Visual Basicはオブジェクト指向プログラミングをサポートしている。クラスを定義してインスタンスを作成し、メソッドを呼び出したり、プロパティを参照することができる。

Visual Basicプロジェクトにクラスモジュールを追加するには、[プロジェクト] メニューから [クラス モジュールの追加] を選択すると、[クラス モジュールの追加] ダイアログ・ボックスが表示される。[クラス モジュール] を選択して、[開く] をクリックすると、プロジェクトにクラスモジュールが追加される。

クラス・モジュールのファイル拡張子は .cls である。

VBのコンストラクタClass_Initialize

クラス・モジュールのコードを表示するウィンドウのドロップダウン・リストボックスから [Class] を選択すると、[Initialize] および [Terminate] が選択できるようになる。

Initializeを選択すると、PrivateなSubプロシージャClass_Initializeが追加される。これは、このクラスがNewされたときに実行されるプロシージャである。

たとえば、クラス MyClass にClass_Initializeプロシージャを作成しておくと、MyClassをNewしたときにClass_Initializeプロシージャが自動的に呼び出される。クラスの初期化処理などは、Class_Initializeプロシージャ内で行うとよい。大抵はメンバー変数の初期化などを行う。

Private mIsConnected As Boolean

Private Sub Class_Initialize()
    mIsConnected = False
End Sub
Dim mc As MyClass

' Class_Initializeが呼び出される
Set mc = New MyClass

VBのデストラクタClass_Terminate

クラス・モジュールのコードを表示するウィンドウのドロップダウン・リストボックスから [Class] を選択すると、[Initialize] および [Terminate] が選択できるようになる。

Terminateを選択すると、PrivateなSubプロシージャClass_Terminateが追加される。これは、オブジェクトが破棄されるときに実行されるプロシージャである。

Property

クラス・モジュールにプロパティを含めることができる。

プロパティを参照できるようにするために、クラス・モジュールにProperty Getプロシージャを作成する必要がある。

Private mStartTime As Date

Property Get StartTime As Date
    StartTime = mStartTime
End Property
Dim mc As MyClass

Set mc = New MyClass

Form1.txtStartTime.Text = mc.StartTime

プロパティプロシージャとは、プロパティを参照または設定するためのプロシージャである。

プロパティを設定できるようにするには、Property Letプロシージャを作成する。

Private mName As String

Public Property Let Name(ByVal Name As String)
    mName = Name
End Property
Dim mc As MyClass

Set mc = New MyClass

mc.Name = "Terminal1"

With...End Withステートメント

With...End Withステートメントを使用すると、指定オブジェクトに対して一連のステートメントを実行できる。

Worksheets("MySheet").Cells(1, 1).Value = "first"
Worksheets("MySheet").Cells(1, 2).Value = "second"
Worksheets("MySheet").Cells(1, 3).Value = "third"

上記のソースコードは、次のように記述することもできる。

With Worksheets("MySheet")
    .Cells(1, 1).Value = "first"
    .Cells(1, 2).Value = "second"
    .Cells(1, 3).Value = "third"
End With

ADO (ActiveX Data Objects)

Visual BasicでADOアプリケーションを作成するには、参照設定を行う必要がある。

[プロジェクト] メニューから [参照設定] を選択すると、「参照設定 - プロジェクト名」ダイアログが表示される。リストの中から「Microsoft ActiveX Data Objects x.x Library」を選択して、[OK] ボタンをクリックする。

データベースへの接続は ADODB.Connection.Open メソッドで行う。

接続に必要なパラメーターは、ADODB.Connection.ConnectionString プロパティに接続文字列を指定する。

Dim cn As ADODB.Connection

Set cn = ADODB.Connection
cn.ConnectionString = "DSN=testds;UID=okai;PWD=chisato"
cn.Open

接続時に指定するパラメーターがデータソース名およびユーザID、パスワードのみのときは、ADODB.Connection.Open メソッドの引数で指定することもできる。

Dim cn As ADODB.Connection

Set cn = ADODB.Connection
cn.Open "testds", "okai", "chisato"

ADOプログラムの例を次に示す。

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = ADODB.Connection
Set rs = ADODB.Recordset

cn.ConnectionString = "DSN=testds;UID=okai;PWD=chisato"

cn.Open
rs.Open "select * from emptable", cn

Do Until rs.EOF
  Debug.Print rs!empid rs!empname
  rs.MoveNext
Loop

rs.Close
cn.Close

Collection

VBAのDictionaryオブジェクトとは異なり、Collectionのキーは大文字と小文字を区別しない。

メソッド説明
Add(item, key)キーと項目のペアをコレクションに追加する
Remove(key)指定したキーを削除する
Clear()すべての項目を削除する
Count()項目の数を返す
Contains(key)指定したキーが存在すればTrueを返す
Item(key)指定したキーに対応する項目を返す
Dim collect As Collection
Set collect = New Collection
collect.Add "value1", "key1"
collect.Add Item:="value2" key:="key2"
MsgBox collect.Item("key1")

「ファイルを開く」ダイアログボックス

Dim filename As String

filename = Application.GetOpenFilename("Excel ブック,*.xlsx")

If filename <> "False" Then
  Workbooks.Open filename
Else
  Exit Sub
End If

フォルダ内にあるすべてのファイル名を取得する

Dim buf As String
Dim cnt As Long

buf = Dir("C:\foo\*.xlsx")
Do While buf <> ""
  cnt = cnt + 1
  buf = Dir()
Loop