趣味のエクセルマクロ

ナンバーズ4などの数字選択式宝くじデータ分析用の自作マクロおよびナンバーズ4の各種データリストなどをブログにしています。

マクロ 制御式

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


  ① Do Until  ~ Loop     繰り返して処理をする(~の条件あり)
   
  ② For  ~  Next        繰り返して処理をする


   ③ If ~ Then  ~ Else  ~      条件で処理する(もし~だったら~等)


   ④ Select  Case ~         条件で処理する


  
   


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を入れる)、それ以外は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はいらない)



  
 ちょっと複雑になると下記の様にします。 ElseIf は増やして行けます。
    最後はEnd Ifで処理の終了となります。


 if a=1 Then
       b=1
   ElseIf a=2 Then
      b=3
   ElseIf a=3 Then
      b=5
   ElseIf a=4 Then
      b=7
 ElseIf a=5 Then
      b=9
 Else
      b=100
   End If




実際にはifの中にifを入れたりして、もっと複雑な処理が出来ます。
複雑な条件で式を作るのは面倒ですが?ここはポイントですね。


条件の中で良く使う式(aは変数 )
a=10        等しい      
a<>10   等しくない 
a<10   10より小さい 
a>10   10より大きい
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


-------------------------------------------------------------------------------------



 For  ~ Next        


・繰り返して処理をさせます。初期値1から終了値4迄+1づつ増やす。


 For n = 1 To 4
  Cells(n,1) = n ’ nが変化し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と変化)



  


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 を使えば色々な処理が出来ますね。



ユーザーホーム(UserForm)

ユーザーホームを使ってあらかじめ設定されたメニューから選択処理が出来ます。
(ユーザーホームの「表示パターンの選択」から6つの中から選びOKボタン押下します)


下では、UserForm1.Show でユーザーホーム1を開きUnload UserForm1でユーザーホーム1を閉じる。



マクロは1.minilotoの記事にありますが、各選択処理は下記の様になります。


1.   ●(本数字) と ○(ボーナス数字)選択した時

2.  ◎(本数字) と ○(ボーナス数字)選択した時

3.   /  (本数字) と ○ (ボーナス数字)選択した時

4.   ● (本数字) のみ 選択した時

5.   ○ (ボーナス数字) のみ 選択した時

6.   数字 と 0 (ボーナス数字) 選択した時


Sub patapata() '当選数字パターン貼付け
saikeisanoff


Erase hit: pata_1 = "": pata_2 = "": pata_f = 0
 
UserForm1.Show 'ユーザーホームを開く
Call syoukyo
-略-
End Sub




’ユーザーホームの「okボタン」に下のマクロ(上記1~6選択後処理する時)
Private Sub CommandButton1_Click()
 If pata_1 = "" And pata_2 = "" Then MsgBox ("選択して下さい"): Exit Sub
Unload UserForm1 'ユーザーホームを閉じる
 Exit Sub
End Sub



’ユーザーホームの「cancel」ボタンにキャンセルマクロ(処理せずに終了)
Private Sub CommandButton2_Click()
  End
End Sub


---------------------------------------------------------------------------------------------------



’メニューから選択(各○にチェックした時は下の各マクロから pata_1等が変化する)
Private Sub OptionButton1_Click()  ’●(本数字) と ○(ボーナス数字)選択した時
If OptionButton1.Value = True Then pata_1 = "○": pata_2 = "●"
End Sub


Private Sub OptionButton2_Click() ’◎(本数字) と ○(ボーナス数字)選択した時
If OptionButton2.Value = True Then pata_1 = "○ ": pata_2 = "◎ "
End Sub


Private Sub OptionButton3_Click() ’ /  (本数字) と ○ (ボーナス数字)選択した時
If OptionButton3.Value = True Then pata_1 = "○ ": pata_2 = "/ "
End Sub


Private Sub OptionButton4_Click() ’● (本数字) のみ 選択した時
If OptionButton4.Value = True Then pata_1 = "": pata_2 = "●"
End Sub


Private Sub OptionButton5_Click() ’ ○ (ボーナス数字) のみ 選択した時
If OptionButton5.Value = True Then pata_1 = "○ ": pata_2 = ""
End Sub


Private Sub OptionButton6_Click() ’ 数字 と 0 (ボーナス数字) 選択した時
If OptionButton6.Value = True Then pata_f = 1: pata_2 = "○ "
End Sub


ユーザーホーム作成方法は「エクセルの神髄」さんのサイトに詳しく載ってますね。

マクロ 対話型

 MsgBox


マクロを起動させた時に、処理を質問表示させる様にします。
ここでは、はい(Y)で実行、いいえ(N)で何もせずに終了します。
(はい(Y)で最初から最後のデータまで処理しています。)


●印表示処理に時間がかかるので、実行するか確認のために「開始しますか?」を
表示させ、下のボタン選択押下します。(4000行を超えるデータで時間がかかるw)



Sub patapata_3()  '当選数字パターン貼付け


Dim i, j, dai, lastkai As Integer
Dim daida As String


 Sheets("原本").Select
 lastkai = Cells(1, 12) + 3
 
    start = MsgBox("開始しますか?", vbYesNo)
 If start = vbNo Then End 
’もし、いいえならマクロ終了


saikeisanoff
 Range("by3:cj5000").ClearContents

ー略ー

End Sub


-------------------------------------------------------------------------------------------------


InputBox



マクロ起動で入力をうながします。
入力し「OK」ボタン押下で検索処理をします。


Sub box_kensaku() ' 検索して入力
Dim bango As String


  On Error GoTo errorcheck
Sheets("box").Select
  Range("B3:W65").Select
   bango = InputBox("box番号入力して下さい", Default:=Cells(1, 25))
  
   If Len(bango) <> 4 Then MsgBox ("4桁で番号入力してください。"): End
  
   Cells(1, 25) = bango
’ 入力したbangoを検索する
    Selection.Find(What:=bango, After:=ActiveCell, LookIn:=xlValues, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, MatchByte:=False, SearchFormat:=False).Activate



ー略ー

 End Sub


両方を組み合わせて処理しています。InputBox → MsgBox




Office TANAKA さんのサイトには詳しい説明が載っていました。
私も勉強したいと思います。