vba中的excel组合和选项

时间:2012-10-19 16:11:42

标签: excel-vba combinations options vba excel

我将首先描述我的excel文件的外观和我想要做的事情。首先想象一下组合,让我们从一个例子开始,这是我的专栏A:

A
B
C
D
AB
AC
AD
BC
BD
CD
ABC
..

..
..
ABCD

我希望大家都明白这一点。我想要做的是在VBA中编写代码,执行以下操作。例如,如果我选择A,那么我的选项将是: 所有这些都是B,C,D或BC,D或BD,C或CD,B或BCD .......等。这样我会得到很多可能性。我希望我的VBA将它放在下一张纸上,然后放在列中,这样就可以将它们放在一起,这样就可以看到....

我想这样做的不只是A到D,而是整个专栏中的内容,所以请探索所有选项。我知道如果我有A到D它是5个变量,因此方程是2 ^ 4 -1选项。但随着4增加到可能的50,仍然可以放置所有选项。

有人可以帮助我使用此代码或指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

我编写了一个类来处理使用二项式系数的常用函数,这是您的问题所处的问题类型。它执行以下任务:

  1. 以任意N选择K到文件的格式输出所有K索引。 K索引可以用更具描述性的字符串或字母代替。这种方法使解决这类问题变得非常简单。

  2. 将K索引转换为已排序二项系数表中条目的正确索引。这种技术比依赖迭代的旧发布技术快得多。它通过使用Pascal三角形中固有的数学属性来实现。我的论文谈到了这一点。我相信我是第一个发现和发布这种技术的人,但我可能错了。

  3. 将已排序的二项系数表中的索引转换为相应的K索引。我相信它可能比您找到的链接更快。

  4. 使用Mark Dominus方法计算二项式系数,这样就不太可能溢出并使用更大的数字。

  5. 该类是用.NET C#编写的,它提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用名为InitTable的bool值,当为true时,将创建一个通用列表来保存要管理的对象。如果此值为false,则不会创建表。不需要创建表来执行上述4种方法。提供访问者方法来访问该表。

  6. 有一个关联的测试类,它显示了如何使用该类及其方法。它已经过2个案例的广泛测试,并且没有已知的错误。

  7. 要阅读此课程并下载代码,请参阅Tablizing The Binomial Coeffieicent

    您可以从您的vba程序中调用我的类,因此可能不需要将其转换为vba。另一方面,如果你确实需要转换它(因为它是一个泛型类,并且vba可能无法用com interop处理它),那么它应该不是很直接。

    您的问题的解决方案涉及为每个N选择K案例生成K索引。因此,在上面的示例中,N(A,B,C,D)有4种可能性,代码(在C#中)看起来像这样:

    int TotalColumns = 4;
    int N = TotalColumns;
    // Loop thru all the possible groups of combinations.
    for (int K = N - 1; K < N; K++)
    {
       // Create the bin coeff object required to get all
       // the combos for this N choose K combination.
       BinCoeff<int> BC = new BinCoeff<int>(N, K, false);
       int NumCombos = BinCoeff<int>.GetBinCoeff(N, K);
       int[] KIndexes = new int[K];
       // Loop thru all the combinations for this N choose K case.
       for (int Combo = 0; Combo < NumCombos; Combo++)
       {
          // Get the k-indexes for this combination, which in this case
          // are the indexes to each column starting with zero.
          BC.GetKIndexes(Loop, KIndexes);
          // Do whatever processing that needs to be done with the indicies in KIndexes.
          ...
       }
       // Handle the final combination which in this case is ABCD since since K < N.
       ...
    }