趣味のエクセルマクロ

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

マクロ作成方法 (N4ストレート集計) 

私のマクロ作成方法の具体例を書いて見たいと思います。


マクロ例としては下のようなナンバーズ4のストレート出現表です。




大体の作成の流れですが、下記の1~4があると思います。
厳密に考えなくても何とか出来れば良いと思います。




1、表の設計を考える。


ナンバーズ4においてストレートの出現状況を一枚の表にします。
たてよこ00~99までに対応した表を作っておきます。10000セル分




2、マクロ手順を考える。


 入力 ⇒ 計算 ⇒ 出力 について大まかにイメージします。
(データを元にすべてマクロ処理とします)




3、作成するにはどんなマクロ命令が必要か考える。


  (変数、制御式、その他など)




4、以上のことから試行錯誤して作成します。


私は出力イメージを想像し、作りながら考えるので時間が掛かりますが?
後から修正することも多いので最初から完璧は無理ですw





< ナンバーズ4ストレート当選回数データの計算出力例 > 


上のような簡単な表を作って見ました。たてよこ100個で合計10000セル用意します。
ここではA列、B列の5行目から回号と当選番号データ入れます。
(マクロでは回号データは使用していません)



それを元に表に出現回数を千百桁と十一桁に分けてj列の5行目を0000として出すようにします。0001はK5セルにします。0524の場合AH10セルになりますね。



関数を使い A1セルには当選番号数  B1セルには最高当選回数出しました。
同一番号のストレート当選回数が最高6回とは----驚きましたw




マクロとしては下記のように10数行と行数も少なく結構簡単ですね。
もっと細かくしたい場合はこれに付け加えて行きます。




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


Sub n4st_count() ’ナンバーズ4のストレート当選回数計算マクロ


Dim i, senhyaku, jyuuiti As Integer
 Sheets("出現数").Select 
   Range("J5:DE104").Select ’データ出力部は最初に消しておく
     Selection.ClearContents


i = 5 ’5行から処理する(データが5行からあるので)


Call saikeisanoff ’再計算を止める(下記のsaikeisanoffマクロ呼び出す)


Do Until Cells(i, 2) = "" ’2列目のデータが無くなるまで下の処理する


 senhyaku = Val(Left(Cells(i, 2), 2)) + 5 ’千百桁データから出力行位置計算
 jyuuiti = Val(Right(Cells(i, 2), 2)) + 10 ’十一桁データから出力列位置計算


 Cells(senhyaku, jyuuiti) = Cells(senhyaku, jyuuiti) + 1 ’上記から回数計算


 i = i + 1 ’次回の当選番号セルに行く計算(1づつ増える式)


Loop


Call saikeisanon ’再計算をする(s下記のaikeisanonマクロ呼び出す)
Cells(1, 1).Select ’最後にA1セルに移動


End Sub


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



senhyaku = Val(Left(Cells(i, 2), 2)) + 5 
jyuuiti = Val(Right(Cells(i, 2), 2)) + 10 


当選番号は文字として入れているのでLeft(Cells(i, 2), 2)やRight(Cells(i, 2), 2)で当選番号の左右から2桁に分けて、更にValで文字から数字に変えそれぞれ+5、+10をして出力対応する表のセル位置を計算しています。


当選番号0001なら  5行(0+5)の11列(1+10)
Valで文字00を数字にした場合0に、01なら1になります。


------------------------------------------------------------------
Sub saikeisanoff()
With Application
        .Calculation = xlManual
        .MaxChange = 0.001
    End With
  ActiveWorkbook.PrecisionAsDisplayed = False
 Application.ScreenUpdating = False '画面変更をしない。
End Sub
-----------------------------------
Sub saikeisanon()
 With Application
        .Calculation = xlAutomatic
        .MaxChange = 0.001
    End With
  ActiveWorkbook.PrecisionAsDisplayed = True
  Application.ScreenUpdating = True '画面変更
End Sub



・saikeisanoffマクロを使用しないと10倍位処理が遅くなります。(約5秒→50秒)






表は見やすくするために罫線変更、データ回数で色変更などしたいと思います。


データの場所や出力場所が変わればマクロを修正する必要がありますが?
出力セルの位置を求めるための考え方は、そんなに難しくないと思います。




関数を使ってそれぞれの出現回数やトータル数などが計算出来ますね。
出現回数はCountif関数を使います。(1回~6回まで関数作成可能です)



当選番号データが別のシートに有っても、セルの設定方法が少し変わるだけです。
senhyaku = Val(Left(Sheets("シート名").Cells(i, 2), 2)) + 5 のようになると思います。
(シート名の同じ位置にデータが有る場合)