電子書籍の厳選無料作品が豊富!

Excel2013で、特定の組み合わせが何個あるかを数える、もしくはどの組み合わせが一番多く登場しているのかを知る方法を教えてください。

例えば、
①みかん/りんご/なし/もも
②りんご/なし/みかん/いちご
③いちご/もも/ぶどう/みかん
④なし/りんご/みかん/ぶどう
…と続いていくとします。
この場合、2つの組み合わせでは①②③にみかんとなしのペアが3回現れており、一番多いです。
3つの組み合わせでは、①②④にみかんとりんごとなしが3回現れており、一番多いです。

なるべく分かりやすくするため果物にしましたが、実際は1~30の数字から10個入ります。
つまり、
第1回/2/3/7/11/15/18/19/21/24/26(この中で数字の重複無し。スラッシュでセル変えてます)
第2回/1/2/4/6/9/10/14/18/21/29

第200回/4/8/11/12/16/20/21/23/27/30と言った感じです。

第1回~第200回の中で、
(三つの数字)1,2,3の組み合わせ=〇個あった、1,2,4の組み合わせ=〇個あった……28,29,30の組み合わせ=〇個あった。
(四つの数字)1,2,3,4の組み合わせ=〇個、…27,28,29,30の組み合わせ=〇個。
(五つの数字)1,2,3,4,5の…
(六つ)1,2,3,4,5,6の…
(七つ)1,2,3,4,5,6,7の…
といった個数の部分が出せる方法を知りたいです。
いろいろ検索してみた中で、より近い質問をしていた方への答えに、「ピボットテーブルを使った方がいい、あとは自分で」と書いてあったのですが、結局訳が分からずここに質問してきています。

できる組み合わせ自体は万どころではないかなりの数になるので、どういう組み合わせがあるのかを書き出し、そこから数を数えるのは面倒です。
なるべく少ない手数で出せる方法はありませんか?

どうしても組み合わせ数が出ないのでしたら、数字が三つ、四つ、…、七つの7パターンにおいて、どの組み合わせがそれぞれのパターンで一番頻繁に登場しているのかを知りたいです。

大変複雑なことかとは思いますが、超初心者ですので、なるべく分かりやすく、もしくはこれをそのままコピペすれば大丈夫、もしくは実際の画像といった形でのお答えをお待ちしています。

質問者からの補足コメント

  • すみません!分かりづらかったですね。
    必ず小さい順です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/02/19 10:13

A 回答 (3件)

No.1です。



二つの関数を作成してみました。
1-1. generateCombination(e, maxNum)
  1~maxNumまでの数字の内,e個の数字からなる組み合わせの最初のものを配列で返す。
1-2. generateCombination()
  関数を呼ぶ毎に次の組み合わせの配列を返す。
  全ての組み合わせを返した後はFalseを返す。
  なので終了判定はIsArray関数で行ってください(下のtestプロシージャを参照)

2. containsCombination(rng, combination)
  セル範囲の中に、combinationの組み合わせがあればTrueを返す
  combinationは1の関数の戻り値です。


使い方はtestプロシージャの内容も参考にしてください。
あとは、各行のセルと組み合わせを関数containsCombinationに与えてTrueが返った数を数えれば求める結果が得られます。
出力の仕様が不明なので書きませんでしたが、簡単なプログラムなので頑張ってみてください。




Sub test()
  Dim combination As Variant
  Dim retMsg As Long

  ' 1~5の数字のうち、2個の数字からなる最初の組み合わせの配列を取得。最初の戻り値は(1,2)
  combination = generateCombination(2, 5)
  
  ' 上記の組み合わせを全て取得するまでループ。戻り値:(1,2),(1,3),(1,4),(1,5),(2.3)……(4,5)
  Do While IsArray(combination)
    ' セルA1:E1の範囲で、取得した組み合わせがあるか確認
    If containsCombination(Range("A1:E1"), combination) Then
      retMsg = MsgBox(Join(combination, ",") & "は含まれます。" & vbNewLine & "終了しますか?", vbYesNo)
    Else
      retMsg = MsgBox(Join(combination, ",") & "は含まれません。" & vbNewLine & "終了しますか?", vbYesNo)
    End If
    If retMsg = vbYes Then Exit Do
    combination = generateCombination()
  Loop
  MsgBox "終了"
End Sub



Function generateCombination(Optional elm As Long = 0, Optional maxNum As Long = 30) As Variant
  Static ary As Variant
  Static max As Long
  Dim i As Long, j As Long, limit As Long
  Dim isValid As Boolean
  
  If elm > 0 Then
    max = maxNum
    ReDim ary(elm - 1)
    For i = 0 To elm - 1
      ary(i) = i + 1
    Next
    isValid = True
  Else
    isValid = False
    For i = UBound(ary) To 0 Step -1
      If i = UBound(ary) Then
        limit = max
      Else
        limit = ary(i + 1) - 1
      End If
    
      If ary(i) < limit Then
        ary(i) = ary(i) + 1
        For j = i + 1 To UBound(ary)
          ary(j) = ary(j - 1) + 1
        Next
        isValid = True
        Exit For
      End If
    Next
  End If
  If isValid Then
    generateCombination = ary
  Else
    Set ary = Nothing
    generateCombination = False
  End If
End Function

Function containsCombination(rng As Range, combination As Variant) As Boolean
  Dim cIdx As Long, dIdx As Long, b_dIdx As Long
  Dim ret As Boolean
  
  b_dIdx = 0
  For cIdx = 0 To UBound(combination)
    ret = False
    If b_dIdx = rng.Cells.Count Then Exit For
    For dIdx = b_dIdx + 1 To rng.Cells.Count
      If combination(cIdx) = rng.Cells(dIdx).Value Then
        ret = True
        Exit For
      End If
    Next
    If ret = False Then Exit For
    b_dIdx = dIdx
  Next
  containsCombination = ret
End Function
    • good
    • 0

直接の回答ではありませんが、もしかしたら、これは、ロト6あたりではないでしょうか。

時々、同じような質問が出てきますので、そう思いました。以前、Microsoft Office の宣伝で、家族全員が利用する中に、Excel でロト6の統計を取るという内容がありました。

>近い質問をしていた方への答えに、「ピボットテーブルを使った方がいい、あとは自分で」

そう言っている人はいます。いろんな人がいろんなノウハウを持っていたりしますが、実際の公開はしないのがほとんどです。しかし、逆に結果論としての成果を上げているというのだから、すごいなって思います。私は、掲示板で質問が出た時に、自分なりに考えたり調べたりしましたが、難しい計算をしている人もいました。

もし、勘違いでしたら、無視してください。
以下は、ミニロトです。かなり古いものですが、約2年のデータををグラフにしたものを、頻度順にカテゴリ分けしました。
「Excel2013:特定の組み合わせの個」の回答画像2
    • good
    • 0

二種類の例が却って分かりにくいです。



10個一組の数字は、小さい順にソートされているのでしょうか?
ソートされていない場合、例えば1/2 と 2/1 は同じ組み合わせなのか否か、どちらですか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!