マクロ 制御式
・マクロを色んな条件で処理する際に私が良く使う制御式は
① Do Until ~ Loop 繰り返して処理をする(~の条件あり)
② For ~ Next 繰り返して処理をする
③ If ~ Then ~ Else ~ 条件で処理する(もし~だったら~等)
④ Select Case ~ 条件で処理する
繰り返し処理はループ処理と言われてます。
マクロ学習法とは 7 (条件分析) - 趣味のエクセルで当てようロト・ナンバーズ
マクロ学習方法とは 17(再帰呼び出し)趣味のエクセルで当てようロト・ナンバーズ
1.ナンバーズ4パターン表作成関係エクセルマクロ(1)では以下の様に使用してます。
(①~④を色々組み合わせてマクロに使用しています)
(上部に列を数字で表示してます Cells(i, j + 17)では j+17の部分)
Sub patapata_4() '当選数字パターン貼付け(引張表作成)
ー略ー
i = 2
Do Until Cells(i, 18) = "" ’ Cells(i, 18)のデータが無くなる迄i行で下の処理をする。
’(最初の2行18列から i=i+1で1行づつ増えながら処理)
dai = 0
For j = 1 To 4 ' 4つの出目の配列変数への入力
hit(i - 1, j) = Cells(i, j + 17) ’Cells(i,18)、Cells(i,19)、Cells(i,20)、Cells(i,21)
If hit(i - 1, j) >= 5 Then dai = dai + 1 ’出目の大小(■■□□等)、5以上の集計
kiguu(j) = Cells(i, j + 21) ’Cells(i,22)、Cells(i,23)、Cells(i,24)、Cells(i,25)
If kiguu(j) = "偶" Then kiguu(j) = "▲" Else kiguu(j) = "△"
If j = 4 Then ’4つの出目の奇遇偶数を集計する
Cells(i, 81) = kiguu(1) + kiguu(2) + kiguu(3) + kiguu(4) ’81列に▲や△を計4つ表示
End If
Next j
Select Case dai '大小の表示
Case 0: daida = "■■■■" ’4以下4つの時 daiが0の時daida を■■■■に
Case 1: daida = "■■■□" ’4以下3つの時 daiが1の時daida を■■■□に
Case 2: daida = "■■□□" ’4以下2つの時
Case 3: daida = "■□□□" ’4以下1つの時
Case 4: daida = "□□□□" ’4以下0の時
End Select
Cells(i, 79) = daida ’79列に■■□□などを表示する
i = i + 1 ’ Cells(i, 18) のiの部分が1づつ増えて行く(下の行に向かっていく)
k = i
If i = 6000 Then Exit Do ’何かあったらマクロ停止iの値はデータから決定
Loop ’Do Until ~ Loop
witi = 67 ’表示する列のスタート位置----出目0の時は67列目(67+0で)
For i = 1 To k - 2
For j = 1 To 4 '出目パターン作成(4出目分)
If Cells(i + 1, witi + hit(i, j)) = "" Then ’データが無かったら●を67~76列に表示
Cells(i + 1, witi + hit(i, j)) = "●" ’シングルの時●にする。
ElseIf Cells(i + 1, witi + hit(i, j)) = "●" Then ’データが●だったらをダブル◎表示
Cells(i + 1, witi + hit(i, j)) = "◎" ’ダブルの時◎にする。
dbl = dbl + 1 ’ダブルなどの判定計算
’ dbl = 1 だったら Db = "2"にし、違うときDb = " d2"する
If dbl = 1 Then Db = "2" Else Db = " d2"
Cells(i + 1, witi + 11) = Db ’78列にダブルかd2を表示
ElseIf Cells(i + 1, witi + hit(i, j)) = "◎" Then
Cells(i + 1, witi + hit(i, j)) = "☆" ’トリプルの時☆にする。
Cells(i + 1, witi + 11) = 3 ’78列にトリプルを表示
ElseIf Cells(i + 1, witi + hit(i, j)) = "☆" Then
Cells(i + 1, witi + hit(i, j)) = "★" ’フォースの時
Cells(i + 1, witi + 11) = 4 ’78列にフォースを表示
End If
Next j
dbl = 0
Next i
ー略ー
End Sub
上でwiti + hit(i, j) は整数変数+整数の配列変数とします。
If ~ Then ~ Else ~
(マクロだけでなく、他のプログラム言語でもほぼ共通の式ですね)
ひとつの条件だけならひとつの処理だけですが、色々な条件の場合は?
条件により処理を変えるため、もし(if )と言う考えですね。
if a=1 Then b=1 Else b=0 (a、 bは変数、この式の場合 End Ifはいらない)
変数aが1なら変数bを1にする(bに1を入れる)、aがそれ以外はbを0にする。
Thenの左の a=1はaに1を入れると言うことでは無くてa=1と言うことです。
Thenの右の b=1は等しいと言うことではないです。
上の式は 下の様にも書けますね。(最後にEnd Ifを付けます)
if a=1 Then
b=1
Else
b=0
End If
if a=1 Then b=1 (Elseが無い場合になります。この場合 End Ifはいらない)
下の様にも書けますね。
if a=1 Then
b=1
End If
ちょっと条件が複雑になると下記の様にします。 ElseIf は増やして行けます。
最後はEnd Ifで処理の終了となります。
if a=1 Then ’aが1の時
b=1 ’bを1にする
ElseIf a=2 Then ’aが2の時
b=3 ’bを3にする
ElseIf a=3 Then ’aが3の時
b=5
ElseIf a=4 Then ’aが4の時
b=7
ElseIf a=5 Then ’aが5の時
b=9
Else ’aが1~5以外の時
b=100
End If
実際にはifの中にifを入れたりして、もっと複雑な処理が出来ます。
複雑な条件で式を作るのは面倒ですが?ここはポイントですね。
条件の中で良く使う式の例(aは整数変数とする )
a=10 等しい (aが10の時)
a<>10 等しくない (aが10で無い時)
a<10 10より小さい (aが9以下の時)
a>10 10より大きい(aが11以上の時)
a>=10 10以上
a<=10 10以下
a="" データが無い時
a<>"" データがある時
Select Case ~
Select Case で始まり End Selectで終わる
If ~ Then ~ Else ~と基本的には同様らしいです。(表示がスッキリします)
Select Case で書いたマクロは If ~ Then で表せますね。
( Case 0: daida = "■■■■" ⇒ If dai=0 Then daida = "■■■■" )
Select Case dai 'dai(変数)の条件をもとに大小daida(変数)の表示をする
Case 0: daida = "■■■■" ’ daiが0の時daida を■■■■に
Case 1: daida = "■■■□" ’ daiが1の時daida を■■■□に
Case 2: daida = "■■□□" ’ daiが2の時daida を■■□□に
Case 3: daida = "■□□□" ’ daiが3の時daida を■□□□に
Case 4: daida = "□□□□" ’ daiが4の時daida を□□□□に
End Select
Case 0: daida = "■■■■" は 下の2行でもOKです。
(:は左右で独立した動きになるので)
Case 0
daida = "■■■■"
Case の使い方は下の様に、もっと.複雑に出来るようですね。
Select Case ~
Case Is < 10 '10より小さい時
処理1
Case 15 ’15の時
処理2
Case Is > 20 ’20より大きい時
処理3
Case Else ’それ以外
処理4
End Select
複数条件の場合
Case 1, 2 ’1または2の時(OR条件)
Case 1 To 3, Is >= 30 ’1以上3以下、または30以上の時
For ~ Next
・繰り返して処理をさせます。同じ処理を何回もさせる時です。
初期値1から終了値4迄+1づつ増やす場合
For n = 1 To 4
Cells(n,1) = n ’ nが1~4と変化しCells(1,1) = 1 、~Cells(4,1) = 4となる
Next n
A列の1行目から4行目にそれぞれ1から4の数字を表示させる。
Next n のnは省略可能です。
・For ~ Next を強制的に中止させる場合 Exit For (条件がある時)
Sub forexit() '条件によりFor ~ Nextの繰り返しを中止させる
For i = 1 To 200 ’i は1から200まで1ずつ変化する
ff = Int(99 * Rnd) + 1 '乱数発生させ Intで1から100までの整数にする
Cells(1, 1) = i ’1から200まで+1ずつ変化する
Cells(1, 2) = ff ’1から100までのどれかに変化する
If ff = 77 Then Exit For 'ffが77になったらiが200に成らなくても強制的に中止させる
For t = 1 To 10000: Next t 'タイマー的に使用(iとffの表示スピード調整)
Next i
End Sub
・For i = 0 To 200 Step 2 2ずつ増やす場合 (iは0,2,4----200と変化)
・For i = 200 To 0 Step-2 2ずつ減らす場合 (iは200,198,196----0と変化)
(例)最後の行startgyouから最初の行10行に向かって1行づつ処理をする。 Step -1
3.No.3 分析のSub kankaku_sita_syuukei() から
For x = startgyou To 10 Step -1 ’最後の行から最初の行に向かって下から上に処理
For n = 1 To 5
Select Case n 'データ表示列位置の設定
Case 1: span = 200 '合計
Case 2: span = 240 '奇数偶数
Case 3: span = 260 '大小
Case 4: span = 280 'ミニスプラス
Case 5: span = 310 'ミニスぺース
End Select
setretu = Cells(x, 190 + n).Value '番号によりデータ記入位置を設定する。
writretu = setretu + span
caunter = Application.CountA(Range(Cells(4500, writretu), Cells(5500, writretu))) '記入位置をカウンタから計算する。
Cells(5501, writretu) = caunter
If caunter = 0 Then '回号データを5500行から記入し間隔を表示する
Cells(5500, writretu) = Cells(x, 190)
Cells(5502, writretu) = kaigo - Cells(5500, writretu)
Else
Cells(5500 - caunter, writretu) = Cells(x, 190)
If caunter = 1 Then
Cells(5500, writretu) = Cells(5500, writretu) - Cells(5500 - caunter, writretu)
ElseIf caunter >= 2 Then
Cells(5501 - caunter, writretu) = Cells(5501 - caunter, writretu) - Cells(5500 - caunter, writretu)
End If
End If
Cells(5501, writretu) = caunter + 1 '合計カウンタを計算表示する
Cells(5504, writretu) = kaigo - Cells(5502, writretu)
Next n
Next x
Do Until ~ Loop
Do Until Cells(i, 18) = "" みたいに使っています。
Loop に来たなら条件(Cells(i, 18) = "")になるまで最初から処理を繰り返します。
For ~ Next でExit Forを組み合わせると同じ働きになります。
(If Cells(i, 18) = "" Then Exit For )
Do Loop ~ Untilの式もありますね。
If ~ Then ~ Else ~ と For ~ Next を使えば色々な処理が出来ますね。
いずれにしても、制御方法はマクロ作成では絶対マスターすべきものです。
考え方はそんなに難しくないですね。(丸暗記してしまえば良いだけですw)