2015-03-20 10 views
5

मेरे पास एक 'एक्स' चर है (3 से 20 विकल्पों के बीच होने की संभावना है), जो मानदंडों को पूरा करने के लिए सभी संभावित संयोजनों की गणना करने के लिए संयुक्त किया जाएगा। प्रत्येक अतिरिक्त चर के लिए एक अतिरिक्त पाश पेश किया जाता है, हालांकि मुझे नहीं पता कि लूप गतिशील बनाने के लिए संभव है (एक्सेल वीबीए में, कोड बहुत तेज़ नहीं होना चाहिए)।गतिशील रूप से नेस्टेड लूप को जोड़ना

प्रदर्शित करने के लिए: मेरे पास var है। एच = 2, var के साथ। एच = 3. के साथ मैं उन सभी संयोजनों को जानना चाहता हूं जो 10 के बराबर हैं या 2 चर के सर्वोत्तम संयोजन हैं।

इस मामले में: विकल्प 1 = 5 * एक = 10, 3 * बी = 9,2 * एक और 2 * बी = 10, 3 * ए और 1 * बी = 9.

कोड दिखता है इस तरह: अन्य पैरामीटर शुरू की है

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 

(उदाहरण के लिए सी = 4), कोड है:

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 

दूसरे शब्दों में, मैं जानना चाहूंगा अगर यह अनुवाद करने के लिए संभव है स्यूडोकोड वास्तविक कोड:

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 

उत्तर

1

यहां दो अलग-अलग समस्याएं हैं। आपने पहले उल्लेख नहीं किया है, और आपको एक अनिश्चित संख्या के तर्कों के साथ मूल्य की गणना करने की भी आवश्यकता है। इसके लिए, आप ParamArray का उपयोग कर सकते हैं।

उदाहरण के लिए:

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 

कौन सा इस्तेमाल किया जा सकता है और परीक्षण किया इस तरह:

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

तो, कि है कि समस्या का ख्याल रखता है। अब, जिस समस्या के बारे में आपने पूछा था, हम एक समान दृष्टिकोण लेंगे। आपके द्वारा प्राप्त प्रत्येक तर्क के लिए एक बार लूप करना कुंजी है।

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

मेरी इच्छा है कि डाउनवॉटर स्वयं को समझाएगा। – RubberDuck

+0

प्रिय रबड़ डक, आपके त्वरित और स्पष्ट उत्तर के लिए धन्यवाद। यह एक बहुत ही साफ समाधान है, हालांकि मुझे लगता है कि इसे मेरी जरूरतों के अनुरूप नहीं किया जा सकता है। ऐसा इसलिए है क्योंकि मैं मापदंडों के सर्वोत्तम दृष्टिकोण के लिए पैरामीटर (सहित एक गुणा) के सभी संभावित संयोजनों को जानना चाहता हूं <10. यह वह जगह है जहां h_test = loop1 * पैरामीटर 1 + loop2 * पैरामीटर 2 .... + loopX * पैरामीटर एक्स आता है आपका फ़ंक्शन एसयूएम केवल गुणा के बिना योग पा सकता है, और मुझे यकीन नहीं है कि यह मेरी आवश्यकताओं (एच_टेस्ट फॉर्मूला) को अनुकूलित करना संभव है या नहीं। –

+0

पॉल, मैं आपके लिए कोड लिखने वाला नहीं हूं, लेकिन आप निश्चित रूप से आपके द्वारा पूछे गए प्रश्न के अनुसार इस दृष्टिकोण का उपयोग कर सकते हैं। यदि आप नहीं कर सकते हैं, तो आपका प्रश्न आपके वास्तविक कोड का सटीक प्रतिनिधित्व नहीं है। – RubberDuck

संबंधित मुद्दे