ここから本文です

エクセルで10個の数字から6個の組み合わせを表に表示する方法が分かる方いますか?

kar********さん

2017/10/617:21:03

エクセルで10個の数字から6個の組み合わせを表に表示する方法が分かる方いますか?

補足母数が10個の場合

全組み合わせは210通りになると思います。

出来れば重複なしにできれば最高です。

よろしくお願いします。

閲覧数:
209
回答数:
1

違反報告

ベストアンサーに選ばれた回答

kik********さん

2017/10/707:02:53

以下でどうなりますか

標準モジュールに以下を記述します
アクティブシートの
A1 ~ A10 に数字を、B1 に 6 を記述後、Samp1 を実行してみます
結果は D1 ~ 書出します


> 出来れば重複なしにできれば最高です。

解釈できません
A 列に記述した中で重複を排除する?

A 列に記述する個数、B1 に記述する 6 は自由に変更してください
※ A 列は文字でも構いません



Option Explicit

Public Sub Samp1()
   Dim vA As Variant, vR As Variant
   Dim jP() As Long, jC As Long
   Dim i As Long, j As Long, k As Long, n As Long

   With ActiveSheet
      jC = .Range("B1").Value
      With .Range("A1", .Cells(Rows.Count, "A").End(xlUp))
         If (.Rows.Count < jC) Then Exit Sub
         vA = WorksheetFunction.Transpose(.Value)
         k = UBound(vA)
      End With
      ReDim vR(1 To jC)
      ReDim jP(1 To jC)

      Application.ScreenUpdating = False
      With .Range("D1")
         .CurrentRegion.ClearContents
         n = 0
         i = 1
         jP(i) = 1
         vR(i) = vA(jP(i))
         i = 2
         While (i > 0)
            If (i = jC) Then
               For j = jP(i - 1) + 1 To k
                  vR(i) = vA(j)
                  With .Offset(n)
                     .Value = n + 1
                     .Offset(, 1).Resize(, jC).Value = vR
                  End With
                  n = n + 1
               Next
               i = i - 1
            Else
               If (jP(i) = 0) Then
                  jP(i) = jP(i - 1) + 1
               Else
                  jP(i) = jP(i) + 1
               End If
               If (k - jP(i) >= jC - i) Then
                  vR(i) = vA(jP(i))
                  i = i + 1
               Else
                  jP(i) = 0
                  i = i - 1
               End If
            End If
         Wend
      End With
      Application.ScreenUpdating = True
   End With
End Sub

  • kik********さん

    2017/10/808:19:06

    補足

    > n = 0
    > ・・・・・
    > Wend


    上記部分を以下に書き換えると、
    気持ちだけ速くなるかも・・・


    n = 0
    i = 1
    While (i > 0)
       jP(i) = jP(i) + 1
       If (k - jP(i) >= jC - i) Then
          vR(i) = vA(jP(i))
          For i = i + 1 To jC - 1
             jP(i) = jP(i - 1) + 1
             vR(i) = vA(jP(i))
          Next
          For j = jP(i - 1) + 1 To k
             vR(i) = vA(j)
             With .Offset(n)
                .Value = n + 1
                .Offset(, 1).Resize(, jC).Value = vR
             End With
             n = n + 1
          Next
       End If
       i = i - 1
    Wend

  • その他の返信(5件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2017/10/8 20:59:41

この作業がこんな簡単にできるようになって嬉しいです。

今まで手作業でした、(笑)


ありがとうございました、(^^♪

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる