趣味のエクセルで当てよう!ロト・ナンバーズ

当選狙いで、ナンバーズ4をメインにロト、ビンゴ5などの各種データリストや、それらの分析用エクセルVBAなどについて書いてます。

マクロ 制御式

・マクロを色んな条件で処理する際に私が良く使う制御式は


  ① 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)