[算表] VBA範圍 無法重算

看板Office作者 (JaJa)時間3年前 (2021/04/13 20:40), 3年前編輯推噓24(240229)
留言253則, 1人參與, 3年前最新討論串1/1
Function abc(X As Range) Dim XR As Integer, XC As Integer XR = X.Row XC = X.Column abc = Application.Average(Range(Cells(XR - 2, XC), Cells(XR, XC))) 我發現他不會自動重算! 在活頁F10輸入abc(E10) 他會計算E8:E10的平均 可是更動E8或E9的數值 他不會自動重算! 只有更改E10 或F10重新輸入 才會自動重算 即使按 立即重算 也不會重算 修改資料 但公式不會重算…… 在這簡單案例中 我知道直接拉公式比較快 但我的資料計算很複雜 公式會打一堆 一更動就很難維護 要怎麼做比較好呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.239.149.248 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Office/M.1618317619.A.BC2.html

04/13 21:21, 3年前 , 1F
是否使用儲存格變動方式,會比較適合?
04/13 21:21, 1F
是說乖乖在儲存格打公式嗎?我是把公式拆成兩格計算

04/13 21:52, 3年前 , 2F
加上 application.volatile
04/13 21:52, 2F
這個就可以自動重算,但其他無關的變化,也會讓這個公式重算? 如果這個公式用太多,可能會很慢?

04/14 10:53, 3年前 , 3F
任何儲存格變更值時,就會重新計算。也因會重新計算,因此
04/14 10:53, 3F

04/14 10:53, 3年前 , 4F
頻繁的變更值下有可能感覺效能不好。
04/14 10:53, 4F

04/14 11:09, 3年前 , 5F
回文寫"使用儲存格變動方式"來看,應該是觸發事件
04/14 11:09, 5F

04/14 11:09, 3年前 , 6F
worksheet_change,執行application.calculatefull,不要
04/14 11:09, 6F

04/14 11:09, 3年前 , 7F
儲存格變更值就執行重新運算的動作,就寫個判斷來限縮執行
04/14 11:09, 7F

04/14 11:09, 3年前 , 8F
動作的範圍
04/14 11:09, 8F
在這例子,「事件」可能比 application.volatile 還要差? 限定範圍是在公式寫 if 範圍內有變動 就重算 嗎?這個程式碼應該怎麼寫呢? 另一種方法,我已經把excel公式拆成兩格,那就寫兩個自訂公式,公式搬進VBA就好 至少維護不用擔心公式跑掉,也會自動重算

04/14 14:19, 3年前 , 9F
有限縮觸發事件範圍的話,不會
04/14 14:19, 9F

04/14 14:19, 3年前 , 10F
限縮不是寫在公式function內,而是觸發事件內
04/14 14:19, 10F

04/14 14:19, 3年前 , 11F
看要range.row、range.column、range.address或是
04/14 14:19, 11F

04/14 14:19, 3年前 , 12F
intersect
04/14 14:19, 12F
我想了一下,在我的情境,這樣寫法跟原本差不多@@現在卡在另一個 Function bcd(X As Range) XR = X.Row XC = X.Column y1 = X * 2 y2 = X * 3 bcd = y1 Cells(XR, XC + 2) = y2 是否無法這樣寫,只能sub然後 Set X = Application.InputBox(prompt:="輸入X的儲存格", Type:=8) 用sub似乎就沒那麼多問題,可是好像只能一個一個做,大量資料就要用陣列?

04/15 11:10, 3年前 , 13F
不要一個一個做的話,也可以迴圈,取出自訂函數bcd括號內
04/15 11:10, 13F

04/15 11:10, 3年前 , 14F
的儲存格字串range.formula
04/15 11:10, 14F
Range.Formula類似「拉公式」?迴圈我會好好想

04/15 15:32, 3年前 , 15F
我給個特別操作
04/15 15:32, 15F

04/15 15:32, 3年前 , 16F
Function abc(X As Range)
04/15 15:32, 16F

04/15 15:32, 3年前 , 17F
Dim XR As Integer, XC As Integer
04/15 15:32, 17F

04/15 15:32, 3年前 , 18F
XR = X.Row + 2
04/15 15:32, 18F

04/15 15:33, 3年前 , 19F
XC = X.Column
04/15 15:33, 19F

04/15 15:33, 3年前 , 20F
abc = Application.Average(Range(Cells(XR - 2, XC),
04/15 15:33, 20F

04/15 15:33, 3年前 , 21F
Cells(XR, XC)))
04/15 15:33, 21F

04/15 15:33, 3年前 , 22F
End Function
04/15 15:33, 22F

04/15 15:33, 3年前 , 23F
然後
04/15 15:33, 23F

04/15 15:34, 3年前 , 24F
儲存格F10 =abc(E8:E10)
04/15 15:34, 24F
這個方法確實可行,但我不太懂為何他只有一個range,而且是第一個的range 如果要保留3個range,是否要用陣列?

04/15 15:35, 3年前 , 25F
不過還是給建議 別用這種方法
04/15 15:35, 25F

04/15 15:35, 3年前 , 26F
像s大的建議一樣 既然都用vba 就別在儲存格工作表上用
04/15 15:35, 26F

04/15 15:35, 3年前 , 27F
自訂函數了
04/15 15:35, 27F

04/15 15:36, 3年前 , 28F
其實自訂函數是個很肌肋的功能
04/15 15:36, 28F

04/15 15:37, 3年前 , 29F
寫了vba三年多 自訂函數的功能 也只有今天用上而已
04/15 15:37, 29F

04/15 15:37, 3年前 , 30F
使用率其實非常低 而且就如同s大所說的
04/15 15:37, 30F

04/15 15:38, 3年前 , 31F
你現在會卡死不能變更儲存格規劃好的位置
04/15 15:38, 31F

04/15 15:39, 3年前 , 32F
就是因為你用vba 又套 儲存格公式 所才變得礙手礙腳
04/15 15:39, 32F

04/15 15:39, 3年前 , 33F
建議直接往純vba的方向靠攏
04/15 15:39, 33F
還有 338 則推文
還有 35 段內文
05/01 08:10, 3年前 , 372F
你把他的網址傳給任何人 突然某個人又將網址傳給你
05/01 08:10, 372F

05/01 08:12, 3年前 , 373F
不行 我例子頗爛
05/01 08:12, 373F

05/01 08:13, 3年前 , 374F
還是用門牌號 跟 房子 的例子比較好
05/01 08:13, 374F

05/01 08:18, 3年前 , 375F

05/01 08:22, 3年前 , 376F
感覺還是挺模糊的
05/01 08:22, 376F

05/01 08:23, 3年前 , 377F
google 傳值 傳址 門牌 房子 大概看2~3個網站就能
05/01 08:23, 377F

05/01 08:25, 3年前 , 378F
反正 傳值就回不去了
05/01 08:25, 378F

05/01 08:25, 3年前 , 379F
你也可以改成Function b(ByVal b1, ByVal b2)
05/01 08:25, 379F

05/01 08:25, 3年前 , 380F
看看Z會變成多少
05/01 08:25, 380F

05/01 08:26, 3年前 , 381F
傳址 是本體根本沒出去過 分身出去了!影分身之術
05/01 08:26, 381F

05/01 08:28, 3年前 , 382F
byval 是 by value的縮寫 by ref 是reference (參考)
05/01 08:28, 382F
傳值、傳參考,我之前搞不清楚,現在我這樣理解: X=10:Y=20 X、Y叫變數,一個變數等於是一個籃子(記憶體的一個單位?),兩個籃子的標籤分別 是X和Y,內容物則分別是10和20。 VBA預設是傳參考,等於說各個sub、function在計算的時候,是傳遞X、Y這種標籤,找 到籃子後,再來讀取裡面的內容、計算、更改。 比如倉庫紅色籃子是3瓶果汁,黃色籃子是10瓶果汁,員工的任務是把2瓶果汁放進紅色 籃子,那麼他應該是無中生有變出2瓶果汁,然後放進紅色籃子。這過程並沒有摸到黃色 籃子,2瓶果汁也不是從黃色籃子拿出來的。這樣嗎? 傳值不知哪邊用得到?或者其實function本身就是傳值?如果sub的參數都是傳值,那麼 就跟function差不多了?但是要弄個變數去儲存他的答案? end sub,會消滅這個sub的籃子,除非sub外面有籃子,而且標籤要一樣,資料才會留下 來,但是傳值就不會改動籃子內的東西了。 在前面我的問題中,兩個sub是end了,但外面的籃子(陣列和變數)還在,裡面資料也 還在,所以重新計算時,就會用到這些舊資料,而非原先預期的「空」,所以要補上dim 或redim把籃子清空。 ※ 編輯: j2708180 (36.239.159.74 臺灣), 05/01/2021 12:00:53

05/01 20:08, 3年前 , 383F
小時候用過遊戲修改大師
05/01 20:08, 383F

05/01 20:09, 3年前 , 384F
如果他傳出來的是值 你怎麼改 hp mp都不會變
05/01 20:09, 384F

05/01 20:09, 3年前 , 385F
如果他傳出來的是址 你一改完 就會變
05/01 20:09, 385F

05/01 20:10, 3年前 , 386F
就用 數值 跟 地址(路徑) 來解釋 最洽當
05/01 20:10, 386F

05/01 20:11, 3年前 , 387F
數值(物質) 地址(路徑)
05/01 20:11, 387F

05/01 20:17, 3年前 , 388F
預設是傳址
05/01 20:17, 388F

05/01 20:18, 3年前 , 389F
原本的function 記得沒錯有個功能能決定是否會刷新
05/01 20:18, 389F

05/01 20:19, 3年前 , 390F
那個部分可能是事件觸發>結束 只要程式跑完 會自動清空
05/01 20:19, 390F

05/01 20:20, 3年前 , 391F
除非你像我前面把dim寫在外面 那麼這個項目就不會清空
05/01 20:20, 391F

05/01 20:23, 3年前 , 392F
抱歉 更正 那個function的觸發方式 我也不知道是甚麼
05/01 20:23, 392F

05/01 20:24, 3年前 , 393F
我只知道 你給定範圍的資料有變化 他就會變 範圍外不管
05/01 20:24, 393F

05/01 20:24, 3年前 , 394F
好像有個excel有個功能是控制刷新的
05/01 20:24, 394F

05/01 20:26, 3年前 , 395F
function 分兩個部分 傳傳值址的預設 跟資料的預設
05/01 20:26, 395F

05/01 20:26, 3年前 , 396F
如果是資料的預設
05/01 20:26, 396F

05/01 20:34, 3年前 , 397F
如下
05/01 20:34, 397F

05/01 20:34, 3年前 , 398F
Sub a1()
05/01 20:34, 398F

05/01 20:34, 3年前 , 399F
x = 1: y = 2
05/01 20:34, 399F

05/01 20:35, 3年前 , 400F
Call c(x, y) '改成callc(x) 試試
05/01 20:35, 400F

05/01 20:35, 3年前 , 401F
Z = x + y
05/01 20:35, 401F

05/01 20:35, 3年前 , 402F
Debug.Print Z
05/01 20:35, 402F

05/01 20:35, 3年前 , 403F
End Sub
05/01 20:35, 403F

05/01 20:36, 3年前 , 404F
Function c(b1, Optional ByVal b2 As Integer = 9)
05/01 20:36, 404F

05/01 20:36, 3年前 , 405F
b1 = b1 * 2
05/01 20:36, 405F

05/01 20:36, 3年前 , 406F
b2 = b2 * 2
05/01 20:36, 406F

05/01 20:36, 3年前 , 407F
End Function
05/01 20:36, 407F

05/01 20:39, 3年前 , 408F
當b2沒東西時 就自動將b2設成9
05/01 20:39, 408F
總之傳值不會改變原變數的值,傳參考會,可是除了x=x+1這種,兩個好像沒差? 那麼什麼情況會需要把ByVal打出來呢? ※ 編輯: j2708180 (218.173.181.14 臺灣), 05/02/2021 13:25:14

05/02 13:43, 3年前 , 409F
這個考倒我了
05/02 13:43, 409F
文章代碼(AID): #1WTP4pl2 (Office)
文章代碼(AID): #1WTP4pl2 (Office)