看板 Visual_Basic 關於我們 聯絡資訊
※ 引述《A1pha ([αλφα])》之銘言: : 標題: [VBA ] 請問如何在VBA裡面使用矩陣公式? : 時間: Tue Mar 2 14:11:37 2010 : : 請問, : 在VBA裡面, : 要怎麼使用矩陣啊? : : 在工作表中, : =B2:B30+D2:D30 : 只要按下ctrl+shift+Enter就可以產生矩陣了, : 在VBA裡面有沒有像這樣的方法? : : 例如我異想天開地,這樣寫: : Array("b2:B30"+"D2:D30") : 結果當然是不行.... : : 有沒有類似這樣的概念或是方法呀? : 還是只能乖乖用 dim arr() as variant : 然後一個一個將儲存格裡面的東西丟進去,然後再做運算這樣...囧 : : -- : 據聞,椅子在聽說Money Ball要拍成電影後如是回應: : : : 我椅子,就在這個moment,要爆啦! : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 123.194.88.67 : → stool100:你的運算結果是? 03/02 17:00 : → A1pha:#VALUE! 03/02 18:04 : 推 rushcat:錄製巨集 看看他怎麼運作的吧!? 03/02 18:36 : → A1pha:這招我試過,但是他錄製的東西是讓某儲存格的值= 03/02 18:47 : → A1pha:你所輸入的那些字 Selection.FormulaArray = "你輸入的公式" 03/02 18:48 : → A1pha:而我想要的,是直接在VBA裡面做運算,然後在拿去做別的用途 03/02 18:48 : 推 stool100:你最後的目的是要做什麼運算? 03/02 21:28 : 推 qsss:答案已經出來了不是嗎? 你把"某儲存格"變成變數去接受結果不 03/03 08:43 : → qsss:就是你要的嗎? 03/03 08:43 好吧。 事到如今, 也只能全盤托出了@@ 是這樣的, 其實原本我只是要做簡單的a=a+b這種東西。 a和b其實是兩欄儲存格, 也就是在B輸入想要購買的東西,然後執行巨集時, 把他加入到A欄代表已購買的東西。 其實這我有寫出來: Sub Add_in() Dim i As Integer For i = 1 To UBound(Range("已種").Rows().Value) '這是該欄的列數 Range("已種").Rows(i).Value = _ Range("已種").Rows(i).Value + Range("放入推車").Rows(i).Value Next End Sub 問題好像解決了, 但是其實接下來才是我把事情搞得那麼複雜的主因....囧 我在該工作表裡面,還寫了一個麻煩的東西... 一個4*27 總共108個儲存格的自訂函數, 每一欄的值都和前一欄的值環環相扣~ 自訂函數就算了, 麻煩的是, 自訂函數的引數是包含NOW()的運算公式... 好了,這麻煩在哪裡? 麻煩在於,每當我執行上述那個Add_in程序的時候, 由於儲存格是一個一個改變的, 每改變一個,那108個包含自訂函數的儲存格都要再運算一遍.. 每按一次巨集,都要等個3秒多.... 讓人實在嚥不下個口氣== 好吧, 那麼我就想說那就把那108個儲存格的揮發性改成False好了。 於是在自訂函數裡面增加 Application.Volatile (Fasle) 嗯嗯,很好! 使用Add_in的時候不會LAG了,不用1秒東西就出來了~ OH YA好歡樂啊~~~ 但 是 ! 我就了為了要把現在的時間也當作變數做考量, 所以才在儲存格的公式裡面加入NOW()的。 現在儲存格變成非揮發性了, 函式所算出來的值,也就不是及時的NOW()了.... 可能是三分鐘前、五分鐘前,或是根本就是昨天的時間... 這就根本和我原本的目的相違背了啊...囧 於是, 解決得方向就變成有兩個: 1. 保持揮發性,但不要讓Add_in裡面的東西用回圈跑,不要讓他一個一個加, 因為每加一次那108格就要再算一次。 我試過用錄製巨集的方法,把a和b用陣列公式相加放在另外一格儲存格, 然後再用選擇性貼上,只把值覆蓋到B上面。 這巨集的執行速度比上面那個回圈巨集快很多,一秒左右可以好。 所以我才想說能不能也把陣列公式用在VBA裡面。 2. 第二個方法,就是讓那108格,變成非揮發。 而在只有需要用到那些數據的時候,才強制他們做運算。 例如當我需要用到那些數據的時候,只要按下某按鈕,就讓那些儲存格重新運算, 讓我得到現在時間的值。 我有試過這樣的方法: Dim trigger as Boolean Function Adjust_Time(par As Double) As Double Application.Volatile (trigger) . . . End Function 然後,寫另外一個SUB: Sub Test() trigger = true Range("G1").Value="這儲存格的值變化了,那108格應該也要變化吧?" Trigger = False End Sub 但是還是不行...囧 我還想過各種奇怪的方法, 像是在那108格儲存格的公式後面加個假人~例如: Adjust_Time(NOW()+C4/24)+$H$2 那個$H$2就是假人,他的值是0, 然後每當按下test()的時候,就讓$H$2的值再一次=0 看看會不會被判斷成儲存格的值改變了,而重新運算。 但還是失敗...囧 總之, 我現在就是卡在這奇怪的地方啦...囧 程式其實是可以動, 只是不漂亮QQ 委曲求全的話,等那3~5秒鐘,程式還是可以跑。 但是就是很煩啊(╯‵□′)╯┴─┴ 太醜了QQ 補上: 現在已經不是醜不醜的問題了... 而是我把108格的揮發性打開的話。 我用規劃求解想分析時...根本跑不動!!! 所以現在變成一定要把揮發性關起來了... 囧 問題越滾越大....慘烈啊~ -- 伊蝶爾: 「接受命運的人,可以得到幸福 違抗命運的人,可以得到榮耀」 你的選擇呢.....? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.194.88.67 ※ 編輯: A1pha 來自: 123.194.88.67 (03/03 13:05) ※ 編輯: A1pha 來自: 123.194.88.67 (03/03 13:54)
MOONRAKER:我看你打掉用VBA陣列重寫比較快,跑起來也會更快 XD 03/03 15:06
MOONRAKER:(當然這只是第一眼看到的想法) 03/03 15:06
A1pha:XD 我也快放棄了 XD 可能真的就砍掉重練比較快XD 03/03 17:29