2015-03-20 26 views
5

Ho una quantità "X" di variabili (con probabilità compresa tra 3 e 20 opzioni), che verranno combinate per calcolare tutte le combinazioni possibili per soddisfare un criterio. Per ogni variabile extra viene introdotto un ciclo aggiuntivo, tuttavia non so se sia possibile rendere dinamica la creazione di loop (in Excel VBA, il codice non deve essere molto veloce).Aggiunta dinamica di anelli nidificati

Per dimostrare: Ho var. A con h = 2, var. B con h = 3. Mi piacerebbe conoscere tutte le combinazioni che sono uguali a 10 o la migliore combinazione delle 2 variabili.

In questo caso: opzione 1 = 5 * A = 10, 3 * B = 9,2 * A e 2 * B = 10, 3 * A e 1 * B = 9.

L'aspetto codice in questo modo:

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 

Se viene introdotto un altro parametro (per esempio C = 4), il codice è:

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 

In altre parole, vorrei sapere se è possibile traslare la pseudocodice al codice reale:

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 

risposta

1

Ci sono due problemi distinti qui. Non hai menzionato il primo, e devi anche calcolare un valore con un numero indeterminato di argomenti. Per questo, è possibile utilizzare uno ParamArray.

Ad esempio:

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 

che può essere utilizzato e testato in questo modo:

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

Quindi, che si occupa di questo problema. Ora, per quanto riguarda il problema che hai chiesto, adotteremo un approccio simile. La chiave è di fare un ciclo una volta per ogni argomento che hai ricevuto.

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

Vorrei che il down-put si sarebbe spiegato. – RubberDuck

+0

Caro RubberDuck, grazie per la tua risposta veloce e chiara. È una soluzione molto pulita, tuttavia penso che non possa essere adattata alle mie esigenze. Questo perché voglio conoscere tutte le possibili combinazioni di parametri (compresa una moltiplicazione) per affrontare al meglio i criteri <10. Qui è dove entra in h_test = loop1 * parametro1 + loop2 * parametro2 .... + loopX * parametro X La tua funzione SUM può solo trovare la somma senza le moltiplicazioni e non sono sicuro se sia possibile adattarla alle mie esigenze (la formula h_test). –

+0

Paul, non ho intenzione di scrivere il codice per te, ma puoi sicuramente usare questo approccio alla domanda che hai posto. Se non puoi, la tua domanda non è una rappresentazione accurata del tuo codice reale. – RubberDuck