2010-11-12 106 views
0
double [] numbers = new numbers[200]; 
    numbers[0] = 123; 
    numbers[1] = 456; 

    // 
    // and so on. 
    // 

    var n0 = numbers; 
    var n1 = numbers.Skip(1); 
    var n2 = numbers.Skip(2); 
    var n3 = numbers.Skip(3); 

    var x = from a in n0 
      from b in n1 
      from c in n2 
      from d in n3 
      where a + b + c + d == 2341.42 
      select new { a1 = a, b1 = b, c1 = c, d1 = d }; 

    foreach (var aa in x) 
    { 
    Console.WriteLine("{0}, {1}, {2}, {3}", aa.a1, aa.b1, aa.c1, aa.d1); 
    } 

這是我的c#代碼。我需要將其轉換爲vba。from c#to vba conversion(yes,kind of stupid)

我的主要問題是:

var x = from a in n0 
      from b in n1 
      from c in n2 
      from d in n3 
      where a + b + c + d == 2341.42 
      select new { a1 = a, b1 = b, c1 = c, d1 = d }; 

,我們會怎麼做這在VBA?

+1

我不認爲你可以在VBA中使用Linq到Objects。 – 2010-11-12 00:16:39

+2

我猜測答案會涉及循環。很多循環。 – 2010-11-12 00:18:15

回答

3
Type NumberSet 
    A As Double 
    B As Double 
    C As Double 
    D As Double 
End Type 

Public Sub TheSub() 
    Dim numbers(0 To 199) As Double 

    numbers(0) = 123 
    numbers(1) = 456 

    ' 
    ' and so on. 
    ' 

    'iterators 
    Dim ai As Integer 
    Dim bi As Integer 
    Dim ci As Integer 
    Dim di As Integer 

    'data set  
    Dim x() As NumberSet 

    'temp record holder 
    Dim ns As NumberSet 

    Dim count As Integer 

    count = 0 

    'simulate the select query 
    For ai = LBound(numbers) To UBound(numbers) 
     For bi = LBound(numbers) + 1 To UBound(numbers) 
      For ci = LBound(numbers) + 2 To UBound(numbers) 
       For di = LBound(numbers) + 3 To UBound(numbers) 
        'fill the record 
        With ns 
         .A = numbers(ai) 
         .B = numbers(bi) 
         .C = numbers(ci) 
         .D = numbers(di) 
         'test record 
         If .A + .B + .C + .D = 2341.42 Then 
          'append to the data set 
          ReDim Preserve x(0 To count) 
          x(count) = ns 
          count = count + 1 
         End If 
        End With 
       Next di 
      Next ci 
     Next bi 
    Next ai 

    'iterate through data set and print results 
    For i = LBound(x) To UBound(x) 
     ns = x(i) 
     With ns 
      Debug.Print .A & ", " & .B & ", " & .C & ", " & .D 
     End With 
    Next i 
End Sub 

不是最有效的..但試圖按照原代碼的流程..它會運行緩慢,因爲它就像暴力破解循環(這裏需要四分鐘左右)。也許使用臨時數據庫/訪問表通過ADO/DAO你可以使用SQL將會有所幫助。

+0

我一直用VBA的問題之一,我覺得我試圖用一隻手綁在背後跳繩。聰明......我希望你的建議可以通過某種臨時數據存儲來顯着提高性能。 – IAbstract 2010-11-12 02:31:37

+0

儘管我不確定這是否是一個Office項目,但我對於爲什麼MS沒有嘗試用某種輕/動態.NET語言逐步淘汰VBA(或只是添加額外的語言)感到困惑與「現代語言」功能..我們已經在Office 2010,仍然使用VBA。雖然我明白這是爲了遺留目的(他們只是在2011年的Mac OS X版本中重新實現),並且它被現有的Excel/Access解決方案大量使用。他們並沒有將VB6(VB Classic)很好,他們呢?畢竟,對象模型已經存在並且可以在.NET中使用! – 2010-11-12 02:47:42

+1

「他們沒有很好地對待VB6(VB Classic),是嗎?」 < - 恰恰相反:VB 6.0遷移到VB 7.0,這是.NET,如你所說應該完成。事實是,VBA和.NET共享相同的(COM)對象模型。而且我們也可以很容易地創建VB.NET或C#插件,因此我沒有看到.NET和VBA的限制。 – 2010-11-12 23:25:29

2
Dim N(200) 

For I0 = 0 To 199 
    For I1 = 1 To 199 
    For I2 = 2 To 199 
     For I3 = 3 To 199 
     If N(I0)+N(I1)+N(I2)+N(I3) = 2341.42 Then 
      Debug.Print N(I0) & "," & N(I1) & "," & N(I2) & "," & N(I3) 
     End If 
     Next 
    Next 
    Next 
Next 
+0

Nitpick:在技術上你的循環應該從0到199,1到199等重新創建'跳過'部分......並且你的if語句應該總結n0(i0)+ n0(i1)+ n0(i2) + n0(i3)。如果你正在循環,那麼你只需要原始數組。 – jtolle 2010-11-12 01:00:15

+0

當然,你是對的 - 編輯。 – Stu 2010-11-12 16:04:50