2013-03-22 3 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 - вы получаете ошибки? Если да, то какой текст является ошибкой, а какая строка выбрасывает ошибку? Если нет ошибки, что происходит при переходе в отладчик? Другими словами, каково неожиданное поведение? –

+0

Код из книги Excel и использует ячейки для хранения данных. Не отличное место для функции доступа. – grantnz

+0

Да, я должен был упомянуть, извините, это код excel, и он копирует значения в книге. Мне просто нужно передать значения переменной. – lalachka

ответ

0

Я не уверен, что это лучший способ сделать это, но я хотел бы использовать своего рода двоичное представление. Например, рассмотрим слово «мальчик» с числом букв n = 3. Это слово имеет три буквы, так что вы можете использовать что-то вроде этого:

001 = у, 010 = О, 011 = OY, 100 = Ь, 101 = по, 110 = бо, 111 = мальчик.

Левую сторону можно выполнить с помощью цикла от i = 1 до мощности (2, n) -1 и преобразования i в число в двоичном виде. Итак, единственное, что вам нужно сделать, это использовать ненулевые позиции для создания ваших комбинаций.

Возможно, в Кнуте есть что-то более интересное.

+0

это из моей лиги, чтобы написать этот кусок, вот почему я ищу готовый код, который я могу настроить. извините, я даже не могу сказать, если это правильный ответ или нет, потому что я этого не понимаю. Однако, спасибо – lalachka

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 
Смежные вопросы