2017-11-25 93 views
-2

我有一個Excel行,看起來像這樣:列出所有不同的分佈選項VBA

0.0 0.0 0.0 0.0 0.0 1.0 

,每個值都是一個單元。我想要的是以0.1的步驟列出所有不同的分配選項。該行的總和邏輯始終爲1 所以結果應該是這個樣子:

0.0 0.0 0.0 0.0 0.1 0.9 
0.0 0.0 0.0 0.0 0.2 0.8 
0.0 0.0 0.0 0.0 0.3 0.7 
... 
0.0 0.0 0.0 0.1 0.1 0.8 
0.0 0.0 0.1 0.0 0.1 0.8 
0.0 0.1 0.0 0.0 0.1 0.8 
... 

結果將包含數百行。我不知道如何編程這個算法。 感謝您的每一個解決方案!

+0

什麼是最後一行的基礎相對於其前任顯示? – pnuts

+0

@pnuts列表如何顯示並不重要。最主要的是最終所有的可能性都應該列出來。 – InformatikBabo

+2

對我來說,你需要更多的列來完成「每個組合」 - 比如10. –

回答

2

考慮:

Sub whatever() 
Dim K As Long 
K = 1 
For i1 = 0 To 1 Step 0.1 
    For i2 = 0 To 1 Step 0.1 
     For i3 = 0 To 1 Step 0.1 
      For i4 = 0 To 1 Step 0.1 
       For i5 = 0 To 1 Step 0.1 
        For i6 = 0 To 1 Step 0.1 
         If Abs(i1 + i2 + i3 + i4 + i5 + i6 - 1) < 0.001 Then 
          Cells(K, 1) = i1 
          Cells(K, 2) = i2 
          Cells(K, 3) = i3 
          Cells(K, 4) = i4 
          Cells(K, 5) = i5 
          Cells(K, 6) = i6 
          K = K + 1 
         End If 
        Next 
       Next 
      Next 
     Next 
    Next 
Next 
MsgBox K 
End Sub 

enter image description here

+0

我建議在每個級別都放上If語句,但是有不到200萬次的迭代,所以這可能不值得。 – YowE3K

+1

@ YowE3K它運行速度相當快,因爲​​只有大約3000個工作表「觸摸」 –

+0

是的,正如我所說的,不值得付出努力。如果OP想要使用大於1的數字作爲總數,或者想要使用更多的列來表示更多的組合,那麼如果它們能夠產生潛在的答案,那麼僅僅進行循環可能是值得的 - 但是,如目前所問,只有11^6個組合才能檢查(這在內存中沒有時間),只有很少數量的寫入意味着這個答案能很好地完成這項工作。 – YowE3K