使用vbaselect长度为3的唯一子集

我试图从1到6的整数生成长度为3的独特子集。我已经玩了很多版本的脚本,但似乎总是碰到一些问题。 如果有人能给我一些指点,那将是很棒的。 谢谢。

Sub permuteTest() num = 6 cRow = 1 For i = 1 To num - 2 For j = 2 To num - 1 For k = 3 To num Cells(cRow, 1).Value = i Cells(cRow, 2).Value = j Cells(cRow, 3).Value = k cRow = cRow + 1 Next k Next j Next i End Sub 

像这样:

 Sub permuteTest() num = 6 cRow = 1 For i = 1 To num - 2 For j = i + 1 To num - 1 For k = j + 1 To num Cells(cRow, 1).Value = i Cells(cRow, 2).Value = j Cells(cRow, 3).Value = k cRow = cRow + 1 Next k Next j Next i End Sub 

这个例程说明了如何解决。 它生成string元组“3,4,1”,但你可以修改使用数组,如果你喜欢。 不容易阅读,但如果你通过一切将明确。 为了紧凑,我没有声明variables,所以运行WITHOUT Option Explicit。

 Const T = 3 ' generate 3-tuples Const N = 6 ' using digits 1,...,6 Private Sub Permute() Dim cTuples As New Collection: Call cTuples.Add(Empty) ' start w empty tuple (rank 0) For i = 1 To T: Set cTuples = NewTuples(cTuples, N): Next i ' increase tuple rank T times using N digits For Each vTuple In cTuples: Debug.Print vTuple: Next ' display the results End Sub ' helper func: turn a set of T-tuples into T+1 tuples Private Function NewTuples(Tuples As Collection, N As Integer) As Collection Set NewTuples = New Collection For Each vOldTuple In Tuples For i = 1 To N: NewTuples.Add (AppendToTuple(vOldTuple, i)): Next Next End Function ' helper func: turn a single T tuple into a T+1 tuple Private Function AppendToTuple(Tuple, i) If IsEmpty(Tuple) Then AppendToTuple = i Else AppendToTuple = Tuple & "," & i End Function 

生成的string元组debug.print'ed到Immed窗口(ctrl-G):

 1,1,1 1,1,2 1,1,3 1,1,4 1,1,5 1,1,6 1,2,1 1,2,2 ... 6,6,5 6,6,6