2013-03-22 153 views
0

我需要獲得所有可能的組合列表,而不是排列組合。所有可能的組合

爲了確保我有正確的名字,123和321對我來說是一回事,應該只列出一次。

下面的代碼做我需要但我不能將其轉換爲MS Access vba。

對不起,我知道這是基本的,它已被問及一百萬次,但我找不到任何適用於我的MS Access。

Sub test_print_nCr() 
     print_nCr 7, 3, Range("A1") 
    End Sub 

2.

Public Function print_nCr(n As Integer, r As Integer, p As Range) 

    c = 1 
    internal_print_nCr n, r, p, 1, 1 
End Function 

3.

Public Function internal_print_nCr(n As Integer, r As Integer, ByVal p As Range, Optional i As Integer, Optional l As Integer) As Integer 

    ' n is the number of items we are choosing from 
    ' r is the number of items to choose 
    ' p is the upper corner of the output range 
    ' i is the minimum item we are allowed to pick 
    ' l is how many levels we are in to the choosing 
    ' c is the complete set we are working on 

    If n < 1 Or r > n Or r < 0 Then Err.Raise 1 
    If i < 1 Then i = 1 
    If l < 1 Then l = 1 
    If c < 1 Then c = 1 
    If r = 0 Then 
    p = 1 
    Exit Function 
    End If 

    Dim x As Integer 
    Dim y As Integer 

    For x = i To n - r + 1 
    If r = 1 Then 
     If c > 1 Then 
     For y = 0 To l - 2 
      If p.Offset(c - 1, y) = "" Then p.Offset(c - 1, y) = p.Offset(c - 2, y) 
     Next 
     End If 
     p.Offset(c - 1, l - 1) = x 
     c = c + 1 
    Else 
     p.Offset(c - 1, l - 1) = x 
     internal_print_nCr n, r - 1, p, x + 1, l + 1 
    End If 
    Next 

End Function 

再次感謝您

+0

你怎麼能不把它轉換?這看起來像VBA代碼 - 你會得到錯誤嗎?如果是這樣,錯誤文本是什麼,以及哪一行是拋出錯誤?如果沒有錯誤,當您在調試器中完成時發生了什麼?換句話說,什麼是意外行爲? – 2013-03-22 01:07:19

+0

來自Excel工作簿的代碼並使用單元格來存儲數據。不適合從Access功能開始。 – grantnz 2013-03-22 01:17:47

+0

是的,我應該提到,對不起,這是excel代碼,它複製工作簿中的值。我只需要能夠將值傳遞給一個變量。 – lalachka 2013-03-22 01:31:17

回答

0

我不知道這是否是做到這一點的最好方法,但我會用一種二進制表示。例如,考慮字母n = 3的「男孩」一詞。這個詞有三個字母,所以你可以使用這樣的事情:

001 = Y, 010 = O, 011 = OY, 100 = B, 101 =通過, 110 =博, 111 =男孩。

左側可以用從i = 1到power(2,n)-1的循環完成,並將i轉換爲以二進制爲基礎的數字。所以,你唯一需要做的就是使用非空位來構建你的組合。

Knuth中可能比這更有趣。

+0

這是我的聯盟,寫這篇文章,這就是爲什麼我要找現成的代碼,我可以調整。對不起,我甚至不能說這是正確的答案,因爲我不明白。謝謝你 – lalachka 2013-03-22 04:37:28

0

我在這裏找到了這段代碼,它給了我確切的需求。你只需要創建一個1-100的數字表格。在低於

enter link description here

的鏈接指令謝謝大家

Public Sub buildquery(strN As String, K As Integer) 
    Dim qd As DAO.QueryDef 
    Dim intI As Integer 
    Dim strsql As String 
    Dim strSelect As String 
    Dim strFrom As String 
    Dim strWhere As String 

    Set qd = CurrentDb.QueryDefs("QN") 
    qd.sql = "SELECT N FROM tblN WHERE N IN (" & strN & ")" 
    Set qd = Nothing 
    strSelect = "SELECT QN.N " 
    strFrom = "FROM QN " 
    strWhere = "WHERE QN_1.N > QN.N " 
    For intI = 1 To K - 1 
     strSelect = strSelect & ", QN_" & intI & ".N AS N" & intI & " " 
     strFrom = strFrom & ", QN AS QN_" & intI & " " 
     If intI < K - 1 Then 
      strWhere = strWhere & " AND QN_" & intI + 1 & ".N > QN_" & intI & ".N " 
     End If 
    Next 
    strsql = strSelect & " INTO tblCombinations " & strFrom & strWhere 
    DoCmd.SetWarnings False 
    DoCmd.RunSQL strsql 
    DoCmd.SetWarnings True 
End Sub 

然後測試

Public Sub testbuildquery() 
    buildquery "1,2,3,4,5,6,7", 3 
End Sub