• ベストアンサー

くだらない質問ですが・・・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 バカバカしいとお笑いのことでしょうが、 私は真剣です。 どうかヨロシクご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.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 ※ 当てられたら分け前があるかも、ということで

fine-top
質問者

お礼

おはようございます、30246kikuさん。 早速貼り付けてやっているんですが (1日中、やってましたのでお礼が遅くなりました。) なぜか上手く行っていません。 私の勉強不足です。 絶対完成したいと思っていますので もう少し時間を下さい。 一先ず、ありがとうございました。

その他の回答 (3)

  • sige1701
  • ベストアンサー率28% (74/260)
回答No.3

訂正します 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"),""))," ","-")

fine-top
質問者

お礼

おはようございます、sige1701さん。 エクセルですね!ありがとうございます。 今回はロト6ですので最低約610万行が必要となりますので エクセルでは行数が足りません。 一度何かやってみたいと思います。 こんな私のくだらない質問に真剣にお答え頂きまして 本当に感謝しています。ありがとうございました。

  • sige1701
  • ベストアンサー率28% (74/260)
回答No.2

関数で作ってみました    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)
回答No.1

テーブル名が「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;

fine-top
質問者

お礼

こんばんわ、30246kikuさん (^-^)/ いやぁ~!おみごとです。うれしいです。 ありがとうございます。 迷惑ついでにお尋ねしたいのですが、 今回の例ではボーナス数字が【5】と一番若い数字で一番左側に 来る組合せになるのですが、【5】ではなく、 【29】だったとしたら ほぼ真ん中辺りに並べ替えられますよね? 左から昇順に並べ替えるということは かなり難しいプログラムになりそうですね!? この《並び替える》というプログラムの方法を ご存知でしたら再度、ご教授いただけませんか? ヨロシクお願いします。 ありがとうございました。

関連するQ&A

専門家に質問してみよう