作者A1pha ([αλφα])
看板Visual_Basic
标题Re: [VBA ] 请问如何在VBA里面使用矩阵公式?
时间Wed Mar 3 13:03:15 2010
※ 引述《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)
1F:→ MOONRAKER:我看你打掉用VBA阵列重写比较快,跑起来也会更快 XD 03/03 15:06
2F:→ MOONRAKER:(当然这只是第一眼看到的想法) 03/03 15:06
3F:→ A1pha:XD 我也快放弃了 XD 可能真的就砍掉重练比较快XD 03/03 17:29