2017-11-25 88 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