9-05.その他のテクニック:エラーを無視するには?

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

 

実行結果

 

 

 

2022年9月21日

9-04.その他のテクニック:同じ対象に複数の処理を施すには?

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

 

 

2022年9月21日

9-03.その他のテクニック:処理を繰り返すには?

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

 

実行結果

 

2022年9月21日

9-02.その他のテクニック:複雑な条件分岐をするには?

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

 

実行結果

 

2022年9月21日

9-01.その他のテクニック:条件に応じて処理を分岐するには?

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

 

実行結果

 

2022年9月20日

8-18.ユーザーフォームの操作:マルチページを操作するには?

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

 

実行結果

 

 

 

 

2022年9月20日

8-17.ユーザーフォームの操作:スクロールバーを使うには?

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

 

実行例

 

 

 

 

2022年9月20日

8-16.ユーザーフォームの操作:オプションボタンを判定するには?

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

 

実行結果

 

 

2022年9月20日

8-15.ユーザーフォームの操作:チェックボックスを判定するには?

CheckBoxオブジェクトのValueプロパティ

チェックボックス.Value

チェックボックスが選択されているかどうかを判定するには、CheckBoxオブジェクトのValueプロパティを使います。チェックボックスにチェックが付いている場合はTrue、付いていない場合はFalseとなります。

 次のサンプルコードは、「CommandButton1」という名前のボタン(ボタンの表示は「確認」)をクリックすると、チェックボックスの状態をメッセージボックスに表示します。


チェックボックスにチェックが付いているかどうかを判定

Private Sub CommandButton1_Click()

If CheckBox1.Value = True Then

MsgBox “オンです。”

Else

MsgBox “オフです。”

End If

End Sub

 

実行結果

 

 

 

 

 

 

2022年9月20日

8-14.ユーザーフォームの操作:コンボボックスにデータを登録するには?

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

 

実行結果

 

 

 

2022年9月20日