アクセス数
健康情報 ⇒ どこへ向かって・・・ ⇒ VBAトップ ⇒ プログラムを動かすために
難しいプログラム、簡単なプログラム、
どれも基本となるのは3つの動作です。
@実行順序
A条件分岐
B繰り返し処理(ループ)
プログラムとは、現実をシミュレートするもの。
現実といっても、ひとつひとつを細かく分解すると、結構単純なものです。
この三つのやり方さえ知っていれば、大概のことはできます。
@実行順序
どこから始まるか、どうやって処理が流れていくか、を、思ったとおりに制御する必要があります。
まず、何をキッカケにプログラムが始まるのか? ですが、通常のプログラムですと実行ファイル(.exe)を動かした時に始まりますが、Excel VBAでは、既にエクセルが動いているので、他にプログラムが動き出すキッカケを作ってやらないといけません。
VBAでは、様々なイベントをキッカケとしてプログラムが走り出すようになっています(イベントドリブン型と言います)。 ファイルを開いたとき、ボタンを押したときなど、又は、プログラムから明示的に他のプログラムを呼び出す場合もあります。
開始のためのプログラム(例)
●Microsoft Excelのファイルを開いた時に始まるプログラム
プロジェクトエクスプローラ(↑)で「ThisWorkbook」をダブルクリックすると、ワークブック全体に関するプログラムを書くことができるファイルが開きます。
このファイルで、「Workbookオブジェクト」の「Openイベント」を選択したところです。
Private Sub Workbook_Open()
End Sub
と自動的に出てくるので、「Private Sub Workbook_Open()」と「End Sub」の間にプログラムを書いて保存すると、このファイルを開いた時にそのプログラムは実行されます。
●シートをダブルクリックした時に始まるプログラム
プロジェクトエクスプローラ(↑)で「Sheet1(Sheet1)」をダブルクリックすると、ワークシート(Sheet1)に関するプログラムを書くことができるファイルが開きます。
このファイルで、「Worksheetオブジェクト」の「BeforeDoubleClickイベント」を選択したところです。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
Boolean)
End Sub
ここにプログラムを記述すると、Sheet1をダブルクリックすると実行されます。
●ボタンを押したときに始まるプログラム
↑ワークシートに貼り付ける場合と、ユーザーフォームに貼り付ける場合
デザインモード(三角定規ON)で、コマンドボタンをダブルクリックするとVBAの画面が開きます。
●コードの途中にタグを入れる
タグ名:
Goto タグ名
Goto で強制的にタグ(xxx:)にジャンプさせます。
これが入ると、読みにくく、改修しにくいダメなコードと言われる場合が多いですが、確実にその場限り、といった場合や、それ以上の機能を期待しない場合などには良いのかも。
※個人的には、私の書いたコードを他の誰かが見たり直したりということはなかったので、セオリー無視のスピード重視、当然ですが、昔のコードは意味不明です(完全にプログラムから離れていたからと思いたい)
A条件分岐
もしこうだったら、あの時ああしていれば・・・ 後になってくよくよしても仕方がありません。
前もって準備しておきましょう! 何いってんだか
条件分岐の王様は「If」
他にも、
IIf
Select Case
Switch
Do Loop の中でのWhile 又は Until
これらを組み合わせると更に強力になります。
まずは「If」から
使い方としては、以下のようになります。
If i = 1 Then
j = 2
ElseIf i = 2 Then
j = 3
Else
j = 4
End If
i = 1 が条件式。
i = 1 が真(True)なら直下の命令を実行し、ElseIf やElseで指定されたプログラムは実行されません。
ElseIfはIf命令が偽(False)であった場合、別の条件式を判定します。
Trueであれば良いので、戻り値がBool型の関数などを使ってもいいです。(If CHECK_TRUE Then〜)
A = False や Not A としますと、条件が逆転します。
※True=False ⇒ False , False=False ⇒ True
Elseは、全ての条件が偽(False)だった場合に実行されます。
If文の中にIf文を入れて、入れ子(ネスト)状態にすることにより、より複雑な条件分岐を実現することもできます。
If (i = 1 or i = 3) And j = 1 Then
というように、複合的な条件を指定することもできます。
複合的な条件では>> If a = 1 And b = 1 Then 〜
●a=1ではなかったらその時点でb=1かどうかまでは判定されません。ですから例えば、If a = 1 And fncCheck Then 〜 というように、関数fncCheckを後方に配置した場合、fncCheckは実行されるかどうか分からないので、必ず実行したい場合には別の方法による必要があります。
IIf
ifの真偽に分岐する一行版
j = IIf(i = 1, 2, 3)
で、Excelシート関数の=IF([式],[真],[偽]) と使い方は同じです。
Select Case
Dim i As Integer
Dim j As Integer
i = InputBox("i=")
Select Case i
Case 1 To 2 ’1〜2
j = 1
Case 3 ’3だけ
j = 2
Case 4, 5, 7 And 6 ’4,5,6,7
j = 3
Case i < 5 ’条件式付き
MsgBox "i < 5"
Case Else ’条件に合致しなかった場合
j = 4
End Select
MsgBox j
このように、様々な分岐ができますが、実際に実行してみると、Case i < 5 が実行されていないので、上から順番に判定して、合致した時点でSelect文を抜けます。
C言語では確かbreak;と書いて抜けないと次の条件も判定されたような気がしますが、VBAでは基本的に一つの条件に合致したら他の条件式は判定しません。
Switch
j = Switch(i = 1, 2, i = 2, 3, i = 3 = 4)
i = 1 なら j = 2 , i = 2 なら j = 3 ・・・・
Switch関数の引数を左から評価していって、最初に合致した物が j に格納されます。
Do Loop の中でのWhile 又は Until
↓で解説
Bループ
For Next
For Each Next
Do Loop
For Next
For i = 1 to 10
・・・
Next
i の値が1〜10まで変化しながらループします。
For i = 1 to 10 Step 2
For i = 10 to 1 Step -1
Stepを使うことにより、変化の仕方を設定できます。省略したら+1です。
For i = 0 to UBound([配列])
上のように配列の上限までループさせる場合など、その都度値を変更させる場合にも適用できます。
Exit For を途中で入れるとループを強制的に抜けます。
For Each Next
For Each [Object型変数] In [Object]
・・・
Next
オブジェクトの内容の一つがオブジェクト型変数の中に格納された状態でループします。
Objectの型が分からなければ、Variant型変数を使うと確実
Do Loop
Do
・・・
Loop
とにかくループさせます。
ループを抜ける方法
・途中にExit Doを入れる
・Do While[Until] 条件式 ⇒ループが始まる前に条件判定
・Loop While[Until] 条件式 ⇒ループが終わってから条件判定
Do While [Trueになる式] ⇒ OK
Do Untile [Falseになる式] ⇒ OK
(例)
Do While i = 0
j = InputBox("j=")
if j = 1 then i = 1
Loop
条件が偽(False)で処理を抜けます。