2015-03-20 12 views
5

Mam "X" ilość zmiennych (prawdopodobnie od 3 do 20 opcji), które zostaną połączone, aby obliczyć wszystkie możliwe kombinacje, aby spełnić kryteria. Dla każdej dodatkowej zmiennej wprowadzana jest dodatkowa pętla, jednak nie wiem, czy możliwe jest utworzenie dynamicznych pętli (w Excelu kod nie musi być bardzo szybki).Dynamiczne dodawanie pętli zagnieżdżonych

Aby zademonstrować: Mam var. A z h = 2, var. B z h = 3. Chciałbym znać wszystkie kombinacje, które są równe 10 lub najlepszą kombinację dwóch zmiennych.

W tym przypadku: opcję 1 = 5 * A = 10, 3 * B = 9,2 * a a 2 * B = 10, 3 i 1 * a * b = 9

Wygląda kod tak:

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 

Jeśli inny parametr jest wprowadzony (na przykład C = 4), kod jest:

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 

innymi słowy, chciałbym wiedzieć, czy możliwe jest, aby przetłumaczyć pseudokod do rzeczywistego kodu:

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 

Odpowiedz

1

Występują tutaj dwa różne problemy. Nie wspomniałeś o pierwszym, i to też musisz obliczyć wartość z nieokreśloną liczbą argumentów. Do tego możesz użyć ParamArray.

Na przykład:

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 

które mogą być wykorzystywane i testowane tak:

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

Tak, że zajmuje się tym problemem. Teraz, jeśli chodzi o problem, o który pytałeś, podejmiemy podobne podejście. Kluczem jest pętla raz dla każdego otrzymanego argumentu.

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

Żałuję, że osoba zainteresowana nie wytłumaczyłaby się sama. – RubberDuck

+0

Drogi RubberDuck, dziękuję za szybką i jasną odpowiedź. Jest to bardzo czyste rozwiązanie, jednak myślę, że nie można go dostosować do moich potrzeb. Dzieje się tak dlatego, że chcę znać wszystkie możliwe kombinacje parametrów (w tym mnożenie), aby najlepiej podejść do kryteriów <10. Tutaj h_test = loop1 * parameter1 + loop2 * parameter2 .... + loopX * parametr X nadchodzi Twoja funkcja SUM może znaleźć tylko sumę bez multiplikacji i nie jestem pewna, czy można to dostosować do moich potrzeb (formuła h_test). –

+0

Paul, nie zamierzam napisać kodu dla ciebie, ale z całą pewnością możesz użyć tego podejścia, biorąc pod uwagę pytanie, które zadałeś. Jeśli nie możesz, twoje pytanie nie jest dokładną reprezentacją twojego prawdziwego kodu. – RubberDuck

Powiązane problemy