Permutations in VBA Excel

后端 未结 3 1943
迷失自我
迷失自我 2020-12-21 19:53

I am trying to generate all the possible combinations of an array of characters. The input array has n characters, 5 <= n <= 7, and I would like to generate a second a

3条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-21 20:46

    Just found one way to make it recursively and avoid double results. The code is pretty ugly cause I didn't have time to think how to use the loops here.

    Public Function Permutacao(card1 As String, card2 As String, card3 As String, card4 As String, card5 As String, Optional card6 As String, Optional card7 As String)
      Dim A(1 To 7) As String
      Dim aux_A(1 To 7, 1 To 6) As String
      Dim aux2_A(1 To 6, 1 To 5) As String
      Dim final_A(1 To 42, 1 To 6) As String
      n = 5
      A(1) = card1
      A(2) = card2
      A(3) = card3
      A(4) = card4
      A(5) = card5
      If Not IsMissing(card6) Then
        A(6) = card6
        n = 6
      End If
      If Not IsMissing(card7) Then
        A(7) = card7
        n = 7
      End If
      If n = 5 Then
        final_A(1, 1) = A(1)
        final_A(1, 2) = A(2)
        final_A(1, 3) = A(3)
        final_A(1, 4) = A(4)
        final_A(1, 5) = A(5)
        ElseIf n = 6 Then
          k = 1
          final_A(k, 1) = A(1)
          final_A(k, 2) = A(2)
          final_A(k, 3) = A(3)
          final_A(k, 4) = A(4)
          final_A(k, 5) = A(5)
          k = 2
          final_A(k, 1) = A(1)
          final_A(k, 2) = A(2)
          final_A(k, 3) = A(3)
          final_A(k, 4) = A(4)
          final_A(k, 5) = A(6)
          k = 3
          final_A(k, 1) = A(1)
          final_A(k, 2) = A(2)
          final_A(k, 3) = A(3)
          final_A(k, 4) = A(6)
          final_A(k, 5) = A(5)
          k = 4
          final_A(k, 1) = A(1)
          final_A(k, 2) = A(2)
          final_A(k, 3) = A(6)
          final_A(k, 4) = A(4)
          final_A(k, 5) = A(5)
          k = 5
          final_A(k, 1) = A(1)
          final_A(k, 2) = A(6)
          final_A(k, 3) = A(3)
          final_A(k, 4) = A(4)
          final_A(k, 5) = A(5)
          k = 6
          final_A(k, 1) = A(6)
          final_A(k, 2) = A(2)
          final_A(k, 3) = A(3)
          final_A(k, 4) = A(4)
          final_A(k, 5) = A(5)
        ElseIf n = 7 Then
        k = 1
        aux_A(k, 1) = A(1)
        aux_A(k, 2) = A(2)
        aux_A(k, 3) = A(3)
        aux_A(k, 4) = A(4)
        aux_A(k, 5) = A(5)
        aux_A(k, 6) = A(6)
        k = 2
        aux_A(k, 1) = A(1)
        aux_A(k, 2) = A(2)
        aux_A(k, 3) = A(3)
        aux_A(k, 4) = A(4)
        aux_A(k, 5) = A(5)
        aux_A(k, 6) = A(7)
        k = 3
        aux_A(k, 1) = A(1)
        aux_A(k, 2) = A(2)
        aux_A(k, 3) = A(3)
        aux_A(k, 4) = A(4)
        aux_A(k, 5) = A(7)
        aux_A(k, 6) = A(6)
        k = 4
        aux_A(k, 1) = A(1)
        aux_A(k, 2) = A(2)
        aux_A(k, 3) = A(3)
        aux_A(k, 4) = A(7)
        aux_A(k, 5) = A(5)
        aux_A(k, 6) = A(6)
        k = 5
        aux_A(k, 1) = A(1)
        aux_A(k, 2) = A(2)
        aux_A(k, 3) = A(7)
        aux_A(k, 4) = A(4)
        aux_A(k, 5) = A(5)
        aux_A(k, 6) = A(6)
        k = 6
        aux_A(k, 1) = A(1)
        aux_A(k, 2) = A(7)
        aux_A(k, 3) = A(3)
        aux_A(k, 4) = A(4)
        aux_A(k, 5) = A(5)
        aux_A(k, 6) = A(6)
        k = 7
        aux_A(k, 1) = A(7)
        aux_A(k, 2) = A(2)
        aux_A(k, 3) = A(3)
        aux_A(k, 4) = A(4)
        aux_A(k, 5) = A(5)
        aux_A(k, 6) = A(6)
        c = 1
        k = 1
        While k <= 7
          If k < 2 Then
            final_A(c, 1) = aux_A(k, 1)
            final_A(c, 2) = aux_A(k, 2)
            final_A(c, 3) = aux_A(k, 3)
            final_A(c, 4) = aux_A(k, 4)
            final_A(c, 5) = aux_A(k, 5)
            c = c + 1
          End If
          
          If k < 3 Then
            final_A(c, 1) = aux_A(k, 1)
            final_A(c, 2) = aux_A(k, 2)
            final_A(c, 3) = aux_A(k, 3)
            final_A(c, 4) = aux_A(k, 4)
            final_A(c, 5) = aux_A(k, 6)
            c = c + 1
          End If
          
          If k < 4 Then
            final_A(c, 1) = aux_A(k, 1)
            final_A(c, 2) = aux_A(k, 2)
            final_A(c, 3) = aux_A(k, 3)
            final_A(c, 4) = aux_A(k, 6)
            final_A(c, 5) = aux_A(k, 5)
          c = c + 1
          End If
          
          If k < 5 Then
            final_A(c, 1) = aux_A(k, 1)
            final_A(c, 2) = aux_A(k, 2)
            final_A(c, 3) = aux_A(k, 6)
            final_A(c, 4) = aux_A(k, 4)
            final_A(c, 5) = aux_A(k, 5)
            c = c + 1
          End If
          
          If k < 6 Then
            final_A(c, 1) = aux_A(k, 1)
            final_A(c, 2) = aux_A(k, 6)
            final_A(c, 3) = aux_A(k, 3)
            final_A(c, 4) = aux_A(k, 4)
            final_A(c, 5) = aux_A(k, 5)
            c = c + 1
          End If
          
          If k < 7 Then
            final_A(c, 1) = aux_A(k, 6)
            final_A(c, 2) = aux_A(k, 2)
            final_A(c, 3) = aux_A(k, 3)
            final_A(c, 4) = aux_A(k, 4)
            final_A(c, 5) = aux_A(k, 5)
            c = c + 1
          End If
          k = k + 1
        Wend
      End If
      Permutacao = final_A
    End Function
    

提交回复
热议问题