On Errorステートメント
On Error Resume Next
エラーが発生しても、そのエラーを無視して次の行の処理を継続するには、On Errorステートメントに「Resume Next」と付けて実行します。
こうすると、エラー発生時にマクロが止まらないので、マクロの中でエラーへの対応を決められます。エラーの原因を探るのに役立つのがErrオブジェクトです。実行時エラーが発生すると、そのエラーに関する情報がErrオブジェクトに格納されます。するとNumberプロパティでエラー番号を、Descriptionプロパティでエラーメッセージを取得できます。
次のサンプルは、10番目のシートを選択したときに、シートが存在しない場合のエラーに対応するコードです。シートがなければエラーが発生し、Errオブジェクトにはエラー番号が格納されます。そこで、Numberプロパティが0より大きい場合をIf文で判定して、Descriptionプロパティの内容を表示します。
エラー時にマクロを停止せず、その原因を表示する
Sub Sample()
On Error Resume Next
Sheets(124).Select
If Err.Number > 0 Then
MsgBox Err.Description
Else
MsgBox ActiveSheet.Name
End If
End Sub
実行結果




Withステートメント
With オブジェクト
.処理1
.処理2
:
End With
同じセルに対して、値を入れたり、文字色を変更したり、塗りつぶしを設定したりと、複数の処理を実行するようなケースがあります。このとき、個々の処理に対して「Range(”A1″).~」のように毎回セルを指定して書くのは面倒です。
このような場合に便利なのがWithステートメントです。WithとEnd Withの間に囲まれ
た行では、Withの行で指定したオブジェクトの記述を省略できます。
ただし省略した場合も、オブジェクトを省略したことを示すピリオドは必要な点に注意してください。
‘Sample1:B2セルに3つの処理を施す
Sub Sample1()
With Range(“B2”)
.Value = “Jam & Momo”
.Interior.ColorIndex = 3
.Font.ColorIndex = 2
End With
End Sub
‘Sample2:Sample1をWithステートメントを使わずに書いた場合
Sub Sample2()
Range(“B2”).Value = “Jam & Momo”
Range(“B2”).Interior.ColorIndex = 3
Range(“B2”).Font.ColorIndex = 2
End Sub


For Nextステートメント、Do Loopステートメント
For 変数 = 初期値 To 終了値
処理
Next 変数
Do 条件
処理
Loop
表の1行目から10行目までを続けて処理する場合など、特定の処理を繰り返すにはFor NextステートメントやDo Loopステートメントを使います。
For Nextでは、「i」などの変数を用意して、変数の初期値と終了値を指定します。すると、初期値から1ずつ加算しながら、終了値になるまで繰り返します。終了値を指定した後に、加算する値の大きさを「Step 3」や「Step -1」などと指定して、「3ずつ増やしながら繰り返す」や「1ずつ減らしながら繰り返す」といった指定も可能です。
Do Loopでは、Do(またはLoop)に続けて繰り返しの条件を指定します。WhileやUntilを利用して、例えば「While i < 10」(iが10未満の間は繰り返す)、「Until i = 10」(iが10になるまで繰り返す)といった具合に指定します。
1行目から10行目まで1行おきに入力を繰り返す
Sub Sample()
Dim i As Long
For i = 1 To 10 Step 2
Cells(i, 1).Value = “ジャム&モモ”
Next i
End Sub
実行結果


Select Case文
Select Case 値
Case 値1
処理1
Case 値2
処理2
:
End Select
Select Case True
Case 条件式1
処理1
Case 条件式2
処理2
:
End Select
複雑な条件分岐には、Select Caseを使うと便利です。指定した「値」が、値1のときは処理1、値2のときは処理2…という具合に、上から順番に条件分岐できます。「Case 80 To 99」や「CaseIs < 50」のように数値の範囲を条件にすることも可能です。どの条件にも当てはまらない場合の処理を、「Case Else」として記述することもできます。また、先頭に「Select Case True」と記述すれば、以降のCase節で「、Case Lef(t Rang(e “A1″), 1)= “A”」のように関数などを使った条件式を指定できます。
D6セルの値に応じて、処理を複数に分岐する
Sub Sample()
Select Case Range(“D6”).Value
Case 80 To 100
MsgBox “合格”
Case 50 To 79
MsgBox “不合格”
Case Is < 50
MsgBox “再テスト”
End Select
End Sub
実行結果


If文
If 条件式 Then
処理
End If
If 条件式 Then
処理1
Else
処理2
End If
条件が成り立つ場合にだけ特定の処理を実行させるには、If文を使います。IfとThenの間に条件式を書き、End Ifとの間に、条件が成り立つときの処理を記述します。
成り立たないときに別の処理を実行したい場合は、成り立つときの処理を書いた後、Elseと記述して、成り立たないときの処理を書きます。If文の中に、さらに別のIf文を入れ子にすることで、複雑な条件分岐も指定できます。
D6セルが80以上なら「合格」と表示する
Sub Sample()
If Range(“D6”).Value >= 80 Then
MsgBox “合格”
Else
MsgBox “不合格”
End If
End Sub
実行結果


PagesオブジェクトのCountプロパティ
マルチページ.Pages
マルチページは、フォーム上に複数のタブを設ける機能です。タブの数(ページ数)はPagesオブジェクトのCountプロパティで、表示中のタブのインデックス値はValueプロパティで取得できます。タブを切り替えるには、MultiPageのValueプロパティに、表示するタブのインデックス値を指定します。インデックス値は左端が0になるので注意しましょう。タブを操作するには、Pages(1)のようにインデックス値を指定します。
次のサンプルコードは、「CommandButton1」という名前のボタン(ボタンの表示は「確認」)をクリックすると、マルチページの総ページ数(タブの数)と、現在表示中のタブの名前(Caption)を表示します。
タブ(ページ)の総数と選択中のタブの名前を表示
Private Sub CommandButton1_Click()
With MultiPage1
MsgBox “総ページ数:” & .Pages.Count & vbCrLf _
& “現在:” & .Pages(.Value).Caption
End With
End Sub
実行結果





ScrollBarオブジェクトのMinプロパティとMaxプロパティ
スクロールバー.Value
フォームにスクロールバーを配置すると、左右のボタンのクリックやバーのスライド操作で数値を増減できます。数値の最小値、最大値は、ScrollBarオブジェクトのMinプロパティとMaxプロパティで設定します。VBEのプロパティウィンドウで設定することもできますが、コードに記述することで、動的に変化させられます。バーの中間部分をクリックしたときの増減幅はLargeChangeプロパティで指定します。スクロールバーが示す値は、Valueプロパティで取得できます。
サンプル1は、フォームを起動したときの初期化処理として、スクロールバーの最小値、最大値、増減幅を設定しています。サンプル2では、スクロールバーを動かしたときに実行される「ScrollBar1_Change」のイベントマクロで、現在の値をラベルに表示させています。
スクロールバーの初期設定
Private Sub UserForm_Initialize()
ScrollBar1.Min = 1
ScrollBar1.Max = 50
ScrollBar1.LargeChange = 5
End Sub
スクロールバーの値を取得
Private Sub ScrollBar1_Change()
Label1.Caption = ScrollBar1.Value
End Sub
実行例




OptionButtonオブジェクトのValueプロパティ
オプションボタン.Value
オプションボタンが選択されているかどうかを判定するには、OptionButtonオブジェクトのValueプロパティを使います。オプションボタンが選択されている場合はTrue、そうでない場合はFalseとなります。
次のサンプルコードは、OptionButton1、OptionButton2、OptionButton3という3つのオプションボタンのうち、どれが選択されているかを判定します。For文で繰り返しながら1つずつオプションボタンの状態を調べ、ValueプロパティがTrueならそのCaptionをメッセージに加えて表示します。
選択されているオプションボタンを判定
Private Sub CommandButton1_Click()
Dim i As Long
For i = 1 To 3
If Controls(“OptionButton” & i).Value = True Then
MsgBox Controls(“OptionButton” & i).Caption _
& “が選択されています。”
End If
Next i
End Sub
実行結果




↓
CheckBoxオブジェクトのValueプロパティ
チェックボックス.Value
チェックボックスが選択されているかどうかを判定するには、CheckBoxオブジェクトのValueプロパティを使います。チェックボックスにチェックが付いている場合はTrue、付いていない場合はFalseとなります。
次のサンプルコードは、「CommandButton1」という名前のボタン(ボタンの表示は「確認」)をクリックすると、チェックボックスの状態をメッセージボックスに表示します。
チェックボックスにチェックが付いているかどうかを判定
Private Sub CommandButton1_Click()
If CheckBox1.Value = True Then
MsgBox “オンです。”
Else
MsgBox “オフです。”
End If
End Sub
実行結果






AddItemメソッド
オブジェクト.AddItem データ
コンボボックスは、テキストボックスとリストボックスが合体したようなコントロールです。それぞれの部位は、テキストボックスやリストボックスと同じように操作できます。コンボボックスのリスト部分にデータを登録するには、AddItemメソッドを使います。
次のサンプルコードは、シートのA1~A5セルのデータを、コンボボックスのリスト部分に登録しています。
フォームの起動時に、A1 ~ A5セルのデータをコンボボックスに登録
Private Sub UserForm1_Initialize()
Dim i As Long
For i = 1 To 5
ComboBox1.AddItem Cells(i, 1)
Next i
End Sub
実行結果



