2012-03-10 63 views
3

大家好:繼liitle問題:VBA陣列乘法,按元素沒有循環

Option Base 1 
Sub Test() 
Dim aa() As Integer 
Dim bb() As Integer 
ReDim aa(3) 
ReDim bb(3) 
For j = 1 To 3 
    aa(j) = j * 2 
    bb(j) = j * 3 
Next j 
End Sub 

現在,我要做的只是小東西乘以兩個一維數組的elementwise不循環,然後卸載這個新的數組(6,24,54)在一個範圍內。我相信這一定很容易實現。我會看到的一個解決方案是創建一個對角矩陣(數組),然後使用mmult,但我確信這是非常簡單的方法。謝謝您的幫助。

+0

所以這是Excel? – brettdj 2012-03-10 10:57:09

+1

循環是唯一的方法 - mmult會在內部循環它的矩陣 - 在你的例程中做什麼是反對意見? – 2012-03-10 11:48:29

+0

嗯,我有一個在一個工作表中的行中的幾個值,在另一個工作表的一列中的幾個值,與vba我想他們乘以元素和卸載他們在第三張表....我習慣了Matlab/R,所以我認爲最有效的方法是將值讀入數組,然後執行元素乘法...因此我將在這種情況下進行循環。但是你知道在Range類中應用乘法運算會更快嗎?或者首先將數據加載到數組中,執行計算然後再將它們推回到某個範圍是可行的? – Eva 2012-03-10 14:07:18

回答

4

沒有循環,沒有辦法在數組中的每個元素上進行乘法運算。有些語言的方法似乎只是這樣做的,但是它們在循環之中。

正如你在評論提到過,你有2種選擇:

  • 遍歷一個範圍,並做乘法
  • 轉儲範圍到一個數組,做乘法,然後傾倒返回到一系列

這一切都取決於你的數據,但幾乎總是你會發現,傾倒的範圍爲變量數組,做你的工作,併爲之傾倒回來會比通過一系列細胞的循環更快。如何將其轉儲回範圍內也會影響速度,請介意。

+0

那麼將其轉儲回範圍的最佳方法是什麼? ;-)是否需要循環? – Eva 2012-03-10 14:58:14

+0

您可以使用數組上的轉置工作表方法來一次轉儲它。 – aevanko 2012-03-10 15:19:48

+0

轉置工作表方法? – Eva 2012-03-10 15:23:16

0

我不完全確定這是可能的任何語言(可能例外的一些功能語言)。也許如果你告訴我們爲什麼你想這樣做,我們可以幫助你更多?

4

可以在沒有明確循環的情況下乘以範圍,例如,嘗試:

sub try() 
    [c1:c3].value = [a1:a3 * b1:b3] 
end sub 

同樣的邏輯: = SUMPRODUCT(A1:A3,B1:B3,A1:A3,B1:B3)