- ベストアンサー
くだらない質問ですが・・・MSアクセス
全くをもってくだらない質問ですが、 どうか見放さないで下さい。 ロト6の組合せについての方法なのですが 例えば、 【抽選例】 本数字1個目が、10 本数字2個目が、17 本数字3個目が、28 本数字4個目が、30 本数字5個目が、36 本数字6個目が、42 ボーナス数字が、5 だとします。 【必須条件】 1:ボーナス数字が必ず入っている 2:本数字1個目から6個目の内、5つを使って6つ組合せを作る 3:テーブルに、抽選結果が入っていて、関数かマクロ、モジュールを 使って、クエリーで答えを表示する。 4:左から昇順に並び替えられていること。 【表示例】 05-10-17-28-30-36 05-10-17-28-30-42 05-10-17-28-36-42 05-10-17-30-36-42 05-10-28-30-36-42 05-17-28-30-36-42 バカバカしいとお笑いのことでしょうが、 私は真剣です。 どうかヨロシクご教授ください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です > 迷惑ついでにお尋ねしたいのですが、 ほにほに あまりいい例ではないと思いますが、#1での関数 MakeNumString を書き換えます。 (関数 MakeNumString2 でやる時には同じような変更で、ということで) Public Function MakeNumString(ParamArray vF()) As String Dim i As Integer Dim j As Integer Dim iNum(1 To 43) As Integer Dim sRet As String Dim sTmp As String sRet = "" For i = UBound(vF) To LBound(vF) + 1 Step -1 For j = 1 To 43 iNum(j) = 0 Next For j = LBound(vF) To UBound(vF) If (i <> j) Then iNum(vF(j)) = 1 Next sTmp = "" For j = 1 To 43 If (iNum(j) <> 0) Then sTmp = sTmp & "-" & Format(j, "00") Next sRet = sRet & "," & Mid(sTmp, 2) Next MakeNumString = Mid(sRet, 2) End Function ボーナス数値 N0 は必ず初めに指定することが条件です。 結果はそれぞれ以下の様になります。 回数 N0 N1 N2 N3 N4 N5 N6 src 1 39 2 8 10 13 27 30 02-08-10-13-27-39,02-08-10-13-30-39,02-08-10-27-30-39,02-08-13-27-30-39,02-10-13-27-30-39,08-10-13-27-30-39 2 5 1 9 16 20 21 43 01-05-09-16-20-21,01-05-09-16-20-43,01-05-09-16-21-43,01-05-09-20-21-43,01-05-16-20-21-43,05-09-16-20-21-43 3 13 1 5 15 31 36 38 01-05-13-15-31-36,01-05-13-15-31-38,01-05-13-15-36-38,01-05-13-31-36-38,01-13-15-31-36-38,05-13-15-31-36-38 回数 N0 N1 N2 N3 N4 N5 N6 解 1 39 2 8 10 13 27 30 02-08-10-13-27-39 1 39 2 8 10 13 27 30 02-08-10-13-30-39 1 39 2 8 10 13 27 30 02-08-10-27-30-39 1 39 2 8 10 13 27 30 02-08-13-27-30-39 1 39 2 8 10 13 27 30 02-10-13-27-30-39 1 39 2 8 10 13 27 30 08-10-13-27-30-39 2 5 1 9 16 20 21 43 01-05-09-16-20-21 2 5 1 9 16 20 21 43 01-05-09-16-20-43 2 5 1 9 16 20 21 43 01-05-09-16-21-43 2 5 1 9 16 20 21 43 01-05-09-20-21-43 2 5 1 9 16 20 21 43 01-05-16-20-21-43 2 5 1 9 16 20 21 43 05-09-16-20-21-43 3 13 1 5 15 31 36 38 01-05-13-15-31-36 3 13 1 5 15 31 36 38 01-05-13-15-31-38 3 13 1 5 15 31 36 38 01-05-13-15-36-38 3 13 1 5 15 31 36 38 01-05-13-31-36-38 3 13 1 5 15 31 36 38 01-13-15-31-36-38 3 13 1 5 15 31 36 38 05-13-15-31-36-38 回数 解 1 02-08-10-13-27-39 1 02-08-10-13-30-39 1 02-08-10-27-30-39 1 02-08-13-27-30-39 1 02-10-13-27-30-39 1 08-10-13-27-30-39 2 01-05-09-16-20-21 2 01-05-09-16-20-43 2 01-05-09-16-21-43 2 01-05-09-20-21-43 2 01-05-16-20-21-43 2 05-09-16-20-21-43 3 01-05-13-15-31-36 3 01-05-13-15-31-38 3 01-05-13-15-36-38 3 01-05-13-31-36-38 3 01-13-15-31-36-38 3 05-13-15-31-36-38 ※ 当てられたら分け前があるかも、ということで
その他の回答 (3)
- sige1701
- ベストアンサー率28% (74/260)
訂正します C1=SUBSTITUTE(TRIM(SUBSTITUTE(TEXT(MIN($B$1:$B$7),"00")&" "&TEXT(SMALL($B$1:$B$7,2),"00")&" "&TEXT(SMALL($B$1:$B$7,3),"00")&" "&TEXT(SMALL($B$1:$B$7,4),"00")&" "&TEXT(SMALL($B$1:$B$7,5),"00")&" "&TEXT(SMALL($B$1:$B$7,6),"00")&" "&TEXT(MAX($B$1:$B$7),"00"),TEXT(LARGE($B$1:$B$6,ROW(A1)),"00"),""))," ","-")
お礼
おはようございます、sige1701さん。 エクセルですね!ありがとうございます。 今回はロト6ですので最低約610万行が必要となりますので エクセルでは行数が足りません。 一度何かやってみたいと思います。 こんな私のくだらない質問に真剣にお答え頂きまして 本当に感謝しています。ありがとうございました。
- sige1701
- ベストアンサー率28% (74/260)
関数で作ってみました A B C 1 本数字1個目 10 10-17-20-28-30-36 2 本数字2個目 17 20-17-20-28-30-42 3 本数字3個目 28 10-17-20-28-36-42 4 本数字4個目 30 10-17-20-30-36-42 5 本数字5個目 36 10-20-28-30-36-42 6 本数字6個目 42 17-20-28-30-36-42 7 ボーナス数字 20 C2=SUBSTITUTE(TRIM(SUBSTITUTE(TEXT(MIN($B$2:$B$8),"00")&" "&TEXT(SMALL($B$2:$B$8,2),"00")&" "&TEXT(SMALL($B$2:$B$8,3),"00")&" "&TEXT(SMALL($B$2:$B$8,4),"00")&" "&TEXT(SMALL($B$2:$B$8,5),"00")&" "&TEXT(SMALL($B$2:$B$8,6),"00")&" "&TEXT(MAX($B$2:$B$8),"00"),TEXT(LARGE($B$2:$B$7,ROW(A1)),"00"),""))," ","-")
- 30246kiku
- ベストアンサー率73% (370/504)
テーブル名が「loto6」 フィールド名が「回数」「N0」「N1」「N2」「N3」「N4」「N5」「N6」で 「N0」(エヌゼロ)がボーナスとします。 フィールドの型は、整数 テーブルサンプル 回数 N0 N1 N2 N3 N4 N5 N6 1 39 2 8 10 13 27 30 2 5 1 9 16 20 21 43 標準モジュールに以下関数を作成します。 Public Function MakeNumString(ParamArray vF()) As String Dim i As Integer Dim j As Integer Dim sRet As String Dim sTmp As String sRet = "" For i = UBound(vF) To LBound(vF) + 1 Step -1 sTmp = "" For j = LBound(vF) To UBound(vF) If (i <> j) Then sTmp = sTmp & "-" & Format(vF(j), "00") End If Next sRet = sRet & "," & Mid(sTmp, 2) Next MakeNumString = Mid(sRet, 2) End Function Public Function MySplit(vF As Variant, iNum As Integer) As String MySplit = "" If (Not IsNull(vF)) Then MySplit = Split(vF, ",")(iNum) End If End Function 関数 MakeNumString では、1つ目に指定されてものを必ず使い 2つ目以降のものを1つ抜いた形で文字列を作ります。 1度の呼び出しで複数のレコードに値を戻せないので , 区切りで戻します。 (ミニロトでも使えると思います) 関数 MySplit では、, 区切りの文字列何番目を得たいか指定します。 関数名は適宜変更してください。 クエリは2段階の作成になると思います。 クエリ「Q1」のSQLビューの内容が以下 SELECT 回数, N0, N1, N2, N3, N4, N5, N6 , MakeNumString([N0],[N1],[N2],[N3],[N4],[N5],[N6]) AS src FROM loto6; クエリ「Q1」の結果が以下 回数 N0 N1 N2 N3 N4 N5 N6 src 1 39 2 8 10 13 27 30 39-02-08-10-13-27,39-02-08-10-13-30,39-02-08-10-27-30,39-02-08-13-27-30,39-02-10-13-27-30,39-08-10-13-27-30 2 5 1 9 16 20 21 43 05-01-09-16-20-21,05-01-09-16-20-43,05-01-09-16-21-43,05-01-09-20-21-43,05-01-16-20-21-43,05-09-16-20-21-43 クエリ「Q1」をもとにしたクエリのSQLビューの内容が以下 SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],0) AS 解 FROM Q1 UNION SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],1) AS 解 FROM Q1 UNION SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],2) AS 解 FROM Q1 UNION SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],3) AS 解 FROM Q1 UNION SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],4) AS 解 FROM Q1 UNION SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],5) AS 解 FROM Q1 ; そのクエリの結果が以下 回数 N0 N1 N2 N3 N4 N5 N6 解 1 39 2 8 10 13 27 30 39-02-08-10-13-27 1 39 2 8 10 13 27 30 39-02-08-10-13-30 1 39 2 8 10 13 27 30 39-02-08-10-27-30 1 39 2 8 10 13 27 30 39-02-08-13-27-30 1 39 2 8 10 13 27 30 39-02-10-13-27-30 1 39 2 8 10 13 27 30 39-08-10-13-27-30 2 5 1 9 16 20 21 43 05-01-09-16-20-21 2 5 1 9 16 20 21 43 05-01-09-16-20-43 2 5 1 9 16 20 21 43 05-01-09-16-21-43 2 5 1 9 16 20 21 43 05-01-09-20-21-43 2 5 1 9 16 20 21 43 05-01-16-20-21-43 2 5 1 9 16 20 21 43 05-09-16-20-21-43 クエリ「Q1」をもとにしたクエリのSQLビューの内容が以下 SELECT 回数, MySplit([src],0) AS 解 FROM Q1 UNION SELECT 回数, MySplit([src],1) AS 解 FROM Q1 UNION SELECT 回数, MySplit([src],2) AS 解 FROM Q1 UNION SELECT 回数, MySplit([src],3) AS 解 FROM Q1 UNION SELECT 回数, MySplit([src],4) AS 解 FROM Q1 UNION SELECT 回数, MySplit([src],5) AS 解 FROM Q1 ; そのクエリの結果が以下 回数 解 1 39-02-08-10-13-27 1 39-02-08-10-13-30 1 39-02-08-10-27-30 1 39-02-08-13-27-30 1 39-02-10-13-27-30 1 39-08-10-13-27-30 2 05-01-09-16-20-21 2 05-01-09-16-20-43 2 05-01-09-16-21-43 2 05-01-09-20-21-43 2 05-01-16-20-21-43 2 05-09-16-20-21-43 また、自分で指定するやり方では、 Public Function MakeNumString2(ParamArray vF()) As String Dim i As Integer Dim sRet As String sRet = "" For i = LBound(vF) To UBound(vF) sRet = sRet & "-" & Format(vF(i), "00") Next MakeNumString2 = Mid(sRet, 2) End Function で、クエリの内容を SELECT 回数, MakeNumString2([N0],[N1],[N2],[N3],[N4],[N5]) AS 解 FROM loto6 UNION SELECT 回数, MakeNumString2([N0],[N1],[N2],[N3],[N4],[N6]) AS 解 FROM loto6 UNION SELECT 回数, MakeNumString2([N0],[N1],[N2],[N3],[N5],[N6]) AS 解 FROM loto6 UNION SELECT 回数, MakeNumString2([N0],[N1],[N2],[N4],[N5],[N6]) AS 解 FROM loto6 UNION SELECT 回数, MakeNumString2([N0],[N1],[N3],[N4],[N5],[N6]) AS 解 FROM loto6 UNION SELECT 回数, MakeNumString2([N0],[N2],[N3],[N4],[N5],[N6]) AS 解 FROM loto6 ; そのクエリの結果が以下 回数 解 1 39-02-08-10-13-27 1 39-02-08-10-13-30 1 39-02-08-10-27-30 1 39-02-08-13-27-30 1 39-02-10-13-27-30 1 39-08-10-13-27-30 2 05-01-09-16-20-21 2 05-01-09-16-20-43 2 05-01-09-16-21-43 2 05-01-09-20-21-43 2 05-01-16-20-21-43 2 05-09-16-20-21-43 ※ MakeNumString2([N0],[N1],[N2],[N3],[N4],[N5]) の記述部分は、関数を使わなくても [N0] & "-" & [N1] & "-" & [N2] & "-" & [N3] & "-" & [N4] & "-" & [N5] の記述で、2桁に合わせるのならそれぞれ Format([N0],"00") とすればよいと思います。 ※今までの関数を組み合わせて SELECT 回数, MySplit(MakeNumString([N0],[N1],[N2],[N3],[N4],[N5],[N6]),0) AS 解 FROM loto6 UNION SELECT 回数, MySplit(MakeNumString([N0],[N1],[N2],[N3],[N4],[N5],[N6]),1) AS 解 FROM loto6 UNION SELECT 回数, MySplit(MakeNumString([N0],[N1],[N2],[N3],[N4],[N5],[N6]),2) AS 解 FROM loto6 UNION SELECT 回数, MySplit(MakeNumString([N0],[N1],[N2],[N3],[N4],[N5],[N6]),3) AS 解 FROM loto6 UNION SELECT 回数, MySplit(MakeNumString([N0],[N1],[N2],[N3],[N4],[N5],[N6]),4) AS 解 FROM loto6 UNION SELECT 回数, MySplit(MakeNumString([N0],[N1],[N2],[N3],[N4],[N5],[N6]),5) AS 解 FROM loto6 ; でも上記結果は得られます。 ※ できても、使える使えないはあるので、検討してください。 ※ 抽出条件を記述する時には、作成した関数をできるだけ呼ばないようにすると速くなります SELECT * FROM ( SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],0) AS 解 FROM Q1 UNION SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],1) AS 解 FROM Q1 ) WHERE N0=5; より SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],0) AS 解 FROM Q1 WHERE N0=5 UNION SELECT 回数, N0, N1, N2, N3, N4, N5, N6, MySplit([src],1) AS 解 FROM Q1 WHERE N0=5; より SELECT 回数, N0, N1, N2, N3, N4, N5, N6 , MakeNumString([N0],[N1],[N2],[N3],[N4],[N5],[N6]) AS src FROM loto6 WHERE N0=5;
お礼
こんばんわ、30246kikuさん (^-^)/ いやぁ~!おみごとです。うれしいです。 ありがとうございます。 迷惑ついでにお尋ねしたいのですが、 今回の例ではボーナス数字が【5】と一番若い数字で一番左側に 来る組合せになるのですが、【5】ではなく、 【29】だったとしたら ほぼ真ん中辺りに並べ替えられますよね? 左から昇順に並べ替えるということは かなり難しいプログラムになりそうですね!? この《並び替える》というプログラムの方法を ご存知でしたら再度、ご教授いただけませんか? ヨロシクお願いします。 ありがとうございました。
お礼
おはようございます、30246kikuさん。 早速貼り付けてやっているんですが (1日中、やってましたのでお礼が遅くなりました。) なぜか上手く行っていません。 私の勉強不足です。 絶対完成したいと思っていますので もう少し時間を下さい。 一先ず、ありがとうございました。