2012-10-19 44 views
1

我將通過描述我的Excel文件的外觀和我所試圖做的啓動。首先,想象一些組合,讓一個例子開始,這是我的專欄答:擅長組合和選擇在VBA

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

.. 
.. 
ABCD 

我希望每個人都明白這一點。我想要做的是在VBA中編寫一個代碼,執行以下操作。例如如果我選擇一個,然後我的選擇是: B,C,d或BC,d或BD,C或CD,B或BCD .......等,爲所有的人。這樣我會得到一些可能性。我想我的VBA來把這個在下一張紙,然後在列,所以它下一步將它們放置到彼此它是可見....

我想不只是一個d做到這一點但是對於整個專欄中的內容,請瀏​​覽所有選項。我知道,如果我有A到D,它有5個變量,所以方程式是2^4 -1選項。但是,當4增加到50時,仍然可以放置所有選項。

有人可以幫我這個代碼或點我在正確的方向。

+0

歡迎!我們通常希望看到人們嘗試過的東西。 –

+0

啊我明白了,我從一開始就會誠實。我嘗試了一些東西,但沒有取得任何成功,這就是我上網的原因....我嘗試拿取A,然後找到沒有A並放置它們的所有選項。等等......我認爲這是正確的方法,但我的代碼不起作用。 – Mikele

+0

這將有助於看到你仍然嘗試。 –

回答

0

我寫了一個類來處理常用功能與二項式係數,這是你的問題屬於下問題的類型的工作。它執行以下任務:

  1. 以良好的格式輸出所有K指數爲任何N選擇K到文件。 K-index可以用更多的描述性字符串或字母來代替。這種方法使得解決這種類型的問題非常簡單。

  2. 將K索引轉換爲排序二項式係數表中條目的正確索引。這種技術比依靠迭代的較早發佈的技術要快得多。它通過使用Pascal三角形中固有的數學屬性來做到這一點。我的論文談論這個。我相信我是第一個發現和發佈這種技術的人,但我可能是錯的。

  3. 將排序後的二項式係數表中的索引轉換爲相應的K索引。我相信它可能比您找到的鏈接更快。

  4. 使用Mark Dominus方法來計算二項式係數,這是不太可能溢出和更大的數字作品。

  5. 該類使用.NET C#編寫,並提供了一種通過使用通用列表來管理與問題(如果有)相關的對象的方法。這個類的構造函數接受一個名爲InitTable的布爾值,當true時將創建一個通用列表來保存要管理的對象。如果此值爲false,則不會創建表。該表不需要創建以執行上述4個方法。提供Accessor方法來訪問表。

  6. 有一個關聯的測試類,顯示如何使用該類及其方法。它已被廣泛測試2例,並沒有已知的錯誤。

要了解關於此類和下載代碼的信息,請參見Tablizing The Binomial Coeffieicent

你或許可以叫我的類從您的VBA程序,所以它可能並不需要轉換爲VBA。另一方面,如果你確實需要隱藏它(因爲它是一個泛型類,並且vba可能無法通過com互操作來處理它),那麼它不應該是非常簡單的。

問題的解決方案涉及爲每個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. 
    ... 
} 
+0

但在Excel中也可以這樣做嗎? – Mikele

+0

是的,這是可能的。如果你想把所有東西放在VBA中,那麼只需將C#BinCoeff類代碼複製到一個新的vba類中即可。擺脫類的泛型部分,因爲你可能不需要它。如果你之前沒有使用vba類,那麼嘗試從谷歌搜索vba類並閱讀一些教程。另一種選擇是從你的vba代碼中引用C#類。您需要指定與C#類及其方法的鏈接。如果您不知道如何執行此操作,請執行「從VBA調用C#類」的網頁搜索。 –

+0

這似乎很複雜。你知道是否有任何教程可用或例子嗎? – Mikele