vba代码,用于获取所有组合(如果它们等于一个单元格)

vba代码,用于获取所有组合(如果它们等于一个单元格),vba,excel,combinations,permutation,Vba,Excel,Combinations,Permutation,所以我有一个15列乘以100行的数据表,它有所有不同的百分比,从100%-0%,我希望从中得到所有可能的组合。现在我有一个代码,可以将这些组合放到另外15列中。问题是,如何使代码只输出加在一起=100%的组合。这是我现在掌握的代码 Sub Perm() Dim rSets As Range, rOut As Range Dim vArr As Variant, lRow As Long Set rSets = Range("A1").CurrentRegion ReDim vA

所以我有一个15列乘以100行的数据表,它有所有不同的百分比,从100%-0%,我希望从中得到所有可能的组合。现在我有一个代码,可以将这些组合放到另外15列中。问题是,如何使代码只输出加在一起=100%的组合。这是我现在掌握的代码

Sub Perm()
  Dim rSets As Range, rOut As Range
  Dim vArr As Variant, lRow As Long

  Set rSets = Range("A1").CurrentRegion
  ReDim vArr(1 To rSets.Columns.Count)
  Set rOut = Cells(1, rSets.Columns.Count + 2)
  Perm1 rSets, vArr, rOut, 1, lRow
  End Sub

  Sub Perm1(rSets As Range, ByVal vArr As Variant, rOut As Range, ByVal lSetN As Long, lRow As Long)
  Dim j As Long

  For j = 1 To rSets.Rows.Count
      If rSets(j, lSetN) = "" Then Exit Sub
      vArr(lSetN) = rSets(j, lSetN)
      If lSetN = rSets.Columns.Count Then
          lRow = lRow + 1
          rOut(lRow).Resize(1, rSets.Columns.Count).Value = vArr
      Else
          Perm1 rSets, vArr, rOut, lSetN + 1, lRow
      End If
  Next j
  End Sub

我假设你的百分比是小数,而不是文本。3而不是30%。刚刚添加了一个if语句,该语句的sum是vArr,并检查sum是否为1

  Sub Perm1(rSets As Range, ByVal vArr As Variant, rOut As Range, ByVal lSetN As Long, lRow As Long)
  Dim j As Long

  For j = 1 To rSets.Rows.Count
      If rSets(j, lSetN) = "" Then Exit Sub
      vArr(lSetN) = rSets(j, lSetN)
      If lSetN = rSets.Columns.Count Then
          If WorksheetFunction.Sum(vArr) = 1 Then
              lRow = lRow + 1
              rOut(lRow).Resize(1, rSets.Columns.Count).Value = vArr
          End If
      Else
          Perm1 rSets, vArr, rOut, lSetN + 1, lRow
      End If
  Next j

谢谢你的帮助。是的,百分比是十进制值。因为它已经运行了一个小时,但还没有运行完,所以我不确定它是否有效?我已经用较小的数据集进行了检查,它似乎有效…但是在重新阅读您的问题并看到您使用的数据量后,您可能需要重新考虑范围。我不是数学家,但用这个算法,你要评估100^15个组合,1 000 000 000。你认为运行多久才能完成?你认为我还能用什么方法做到这一点呢?再说一次,我不是数学家,但即使是每秒10万个组合,每年31536000秒,运行时间也大约是317097919837645865年。我的计算机每秒大约有20000个组合,数据集小得多16行5列1048576个组合。您拥有的代码显然是蛮力方法。不确定您正在分析的数据是什么,但您可能需要查看它,看看是否有其他模式可以找到。。。或者重新扩大你的范围。。或者投资一台量子计算机,我上次听说它们只有1500万。他们可能有一台备用的量子计算机,可以在你们当地的租赁中心使用