VBA - записать все перестановки чисел в массив - PullRequest
0 голосов
/ 13 февраля 2019

В настоящее время я вручную вводю значения в массив sign_array (a, b, c).Где с номер уровня.Итак, смотрите мой вывод ниже, где с = 1 есть только два входа в массив.Когда c = 2 (или уровень 2), есть 4 входа.Уровень 3 = 8 входов, уровень 4 - 16 входов.Но писать все это становится очень утомительно.

Я действительно борюсь с этим.Мне нужно записать в массив все комбинации 1 или 2 и найти вывод:

1    
2
1, 1    
1, 2    
2, 1
2, 2  
1, 1, 1  
2, 1, 1    
1, 2, 1    
1, 1, 2    
2, 2, 1    
2, 1, 2    
1, 2, 2    
2, 2, 2    
1, 1, 1, 1    
2, 1, 1, 1
etc

Пожалуйста, посмотрите ниже, как далеко я добрался, но понятия не имею, что делать, чтобы различать1 или 2. Любая помощь будет принята с благодарностью.В данный момент я вручную добавляю комбинации, но я все больше и больше увеличиваю размеры, которые у меня есть.

Я не против иметь цикл for для каждого создания уровня.

levels_to_use = 4
for i = 1 to levels_to_use  ^ 2
    for j = 1 to levels_to_use 
        ' in here how to chose between 1 or 2
        sign_array(i, j, levels_to_use) = 1
    next
next

1 Ответ

0 голосов
/ 13 февраля 2019

Некоторое время назад у меня не было ничего лучше, и я написал именно тот код, который вы ищете - https://www.vitoshacademy.com/vba-nested-loops-with-recursion/

Таким образом, если вы немного измените его, избегая _ ипомещая переменную size в цикл, она печатает желаемый результат:

enter image description here

Если вы измените c = Array(1, 2) на c = Array(1, 2, 3), это добавиттретий элемент системы.

Sub Main()

    Static size         As Long
    Static c            As Variant
    Static arr          As Variant
    Static n            As Long

    c = Array(1, 2)
    n = UBound(c) + 1
    For size = 1 To 4
        ReDim arr(size - 1)
        EmbeddedLoops 0, size, c, n, arr
        Debug.Print "---------"
    Next size

End Sub

Function EmbeddedLoops(index, k, c, n, arr)

    Dim i                   As Variant
    If index >= k Then
        PrintArrayInOneLine arr
    Else
        For Each i In c
            arr(index) = i
            EmbeddedLoops index + 1, k, c, n, arr
        Next i
    End If

End Function

Public Sub PrintArrayInOneLine(myArray As Variant)

    Dim counter     As Long
    Dim sArray      As String
    For counter = LBound(myArray) To UBound(myArray)
        sArray = sArray & myArray(counter)
    Next counter
    Debug.Print sArray

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...