vba中的excel组合和选项

Posted

技术标签:

【中文标题】vba中的excel组合和选项【英文标题】:excel combinations and options in vba 【发布时间】:2012-10-10 07:21:06 【问题描述】:

我将首先描述我的 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 时,应该仍然可以放置所有选项。

有人可以帮我处理这段代码或指出正确的方向吗?

【问题讨论】:

欢迎迈克勒!我们通常想看看人们尝试了什么。 啊我明白了,我从一开始就诚实。我尝试了一些事情,但没有任何成功,这就是我上网的原因....我尝试以抓取 A 为例,然后找到所有没有 A 的选项并放置它们。等等....我认为这是正确的方法,但我的代码不起作用。 看看你还在尝试什么会很有帮助。 (1) 您的意思是您有一个完整的组合列表,并且您希望从该列表中获得每个不包含给定值的组合吗? (2) 您是否有一个值列表,然后您希望每个组合不包括其中一个值? (3) 2^50 是 1,125,899,906,842,620。您希望将所有这些组合放在哪里? 我的这个较早的答案有帮助吗? ***.com/a/8761434/973283 【参考方案1】:

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

    以适合任何 N 选择 K 的格式将所有 K 索引输出到文件。 K-indexes 可以替换为更具描述性的字符串或字母。这种方法使得解决这类问题变得非常简单。

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

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

    使用Mark Dominus 方法计算二项式系数,该方法不太可能溢出并且适用于较大的数字。

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

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

要了解该课程并下载代码,请参阅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.
   ...

【讨论】:

但是否也可以在 Excel 中执行此操作? 是的,这是可能的。如果您想将所有内容保留在 VBA 中,则只需将 C# BinCoeff 类代码复制到新的 vba 类。摆脱类的泛型部分,因为您可能不需要它。如果您以前没有使用过 vba 类,请尝试从 google 搜索 vba 类并阅读一些教程。另一种选择是从您的 vba 代码中引用 C# 类。您将需要指定与 C# 类及其方法的链接。如果您不知道如何执行此操作,请在网络上搜索“从 VBA 调用 C# 类”。 这似乎很复杂。你知道是否有可用的教程或示例? 如果您觉得这很复杂,那么也许您应该将任务交给更有经验的开发人员,或者如果您是所有者/经理,请考虑聘请开发人员为您完成这项工作。这段代码实际上非常简单易懂。经验丰富的 VBA 开发人员将上述 C# 代码和 C# BinCoeff 类转换为 VBA 不会有任何问题。

以上是关于vba中的excel组合和选项的主要内容,如果未能解决你的问题,请参考以下文章

excel VBA 组合框 取值

Excel VBA中的组合算法

如何使用 VBA 根据值和组合框选择填充 excel 中的行?

Excel VBA - 组合宏以重命名工作表和宏以在一个宏中合并工作表

Excel VBA 代码 - 有限制的组合

Excel VBA文本框以填充组合框