2015-03-20 8 views
5

Ich habe eine 'X' Anzahl von Variablen (wahrscheinlich zwischen 3 bis 20 Optionen), die kombiniert werden, um alle möglichen Kombinationen zu berechnen, um ein Kriterium zu erfüllen. Für jede zusätzliche Variable wird eine zusätzliche Schleife eingeführt, aber ich weiß nicht, ob es möglich ist, die Erstellung von Schleifen dynamisch zu machen (in Excel VBA muss der Code nicht sehr schnell sein).Dynamisches Hinzufügen von verschachtelten Schleifen

Um zu demonstrieren: Ich habe var. A mit h = 2, var. B mit h = 3. Ich möchte alle Kombinationen kennen, die 10 oder die beste Kombination der 2 Variablen sind.

In diesem Fall: Option 1 = 5 * A = 10, B = 3 * 9,2 * A 2 * und B = 10, 3 * und A * B 1 = 9.

Der Code sieht dies wie:

For A = 0 to 5 
    h = 0 'Reset previous h if solution is found 

    For B = 0 to 5 

     h_test = A * height(A) + B * heigth(B) 

      if h_test > 10 
      if h = 0 then 
       exit for 
      else 
       write h 
       exit for 
      end if 

      h = h_test 

    Next B 
Next A 

wenn ein anderer Parameter (zB C = 4) eingeführt wird, ist der Code:

For A = 0 to 5 
    h = 0 'Reset previous h if solution is found 

    For B = 0 to 5 
    h = 0 'Reset previous h if solution is found 

    For C = 0 to 5 

     h_test = A * height(A) + B * heigth(B) + C * heigth(C) 

     if h_test > 10 
      if h = 0 then 
      exit for 
      else 
      write h 
      exit for 
     end if 

     h = h_test 

     Next C 
    Next B 
Next A 

Mit anderen Worten, ich würde gerne wissen, ob es möglich ist, das übersetzen Pseudocode zu realem Code:

For #parameter. = X 

For loop1 = 1 to 5 
    h = 0 

    For loop2 = 1 to 5 
     h = 0 

    .... 

     For loopX = 1 to 5 

      h_test = loop1 *parameter1 + loop2 * parameter 2 ... 
         + loopX * parameter X 

      If h_test > 10 
       Somecode 
       exit for 
      End if 

     Next X 
    ... 
    Next loop2 
Next loop1 

Antwort

1

Es gibt zwei verschiedene Probleme hier. Sie haben die erste nicht erwähnt, und Sie müssen auch einen Wert mit einer unbestimmten Anzahl von Argumenten berechnen. Dafür können Sie eine ParamArray verwenden.

Zum Beispiel:

Public Function Sum(ParamArray args() As Variant) As Long 
    Dim i As Long 
    Dim operand As Integer 
    Dim result As Long 

    For i = LBound(args) To UBound(args) 
     result = args(i) + result 
    Next i 

    Sum = result 
End Function 

, die verwendet und wie diese getestet werden können:

Public Sub Test() 
    Debug.Print Sum(1,2) '=> 3 
    Debug.Print Sum(1,2,3) '=> 6 
End Sub 

Also, die sich um dieses Problem nimmt. Nun zu dem Problem, nach dem Sie gefragt haben, wir werden einen ähnlichen Ansatz verfolgen. Der Schlüssel besteht darin, für jedes Argument, das Sie erhalten haben, eine Schleife auszuführen.

Public Sub Run() 
    NestedLoop 1, 2, 3 

End Sub 

Public Sub NestedLoop(ParamArray args() As Variant) 
    Dim result As Long 
    Dim a As Variant 
    a = args 

    Dim h_test As Long 
    Dim i As Long, j As Long 

    For i = LBound(args) To UBound(args) 
     For j = 1 To 5 
     result = 0 
      h_test = Sum(a) 

      If h_test > 10 Then 
       If result = 0 Then 
        Exit For 
       Else 
        Debug.Print result 
        Exit For 
       End If 
      End If 

      result = h_test 
     Next j 
    Next i 
End Sub 


Public Function Sum(args As Variant) As Long 
    Dim i As Long 
    Dim operand As Integer 
    Dim result As Long 

    For i = LBound(args) To UBound(args) 
     result = args(i) + result 
    Next i 

    Sum = result 
End Function 
+0

Ich wünschte, der Downvoter hätte sich selbst erklärt. – RubberDuck

+0

Hallo RubberDuck, danke für deine schnelle und klare Antwort. Es ist eine sehr saubere Lösung, aber ich denke, es kann nicht an meine Bedürfnisse angepasst werden. Dies liegt daran, dass ich alle möglichen Kombinationen von Parametern (einschließlich einer Multiplikation) kennen möchte, um die Kriterien <10 am besten zu erreichen. Hier kommt h_test = loop1 * parameter1 + loop2 * parameter2 .... + loopX * Parameter X ins Spiel Ihre Funktion SUM kann nur die Summe ohne die Multiplikationen finden, und ich bin mir nicht sicher, ob es möglich ist, dies an meine Bedürfnisse anzupassen (die h_test-Formel). –

+0

Paul, ich werde den Code nicht für Sie schreiben, aber Sie können diesen Ansatz sicherlich verwenden, wenn Sie die Frage stellen, die Sie gestellt haben. Wenn dies nicht möglich ist, ist Ihre Frage keine genaue Darstellung Ihres echten Codes. – RubberDuck