為什麼這篇VBA 陣列 push鄉民發文收入到精華區:因為在VBA 陣列 push這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者A1pha ([αλφα])看板Visual_Basic標題Re: [VBA ] 請問如何在VB...
※ 引述《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)