[算表] VBA範圍 無法重算

作者: j2708180 (JaJa)   2021-04-13 20:40:17
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重新輸入 才會自動重算
即使按 立即重算 也不會重算
修改資料 但公式不會重算……
在這簡單案例中 我知道直接拉公式比較快
但我的資料計算很複雜 公式會打一堆 一更動就很難維護
要怎麼做比較好呢?
作者: rafaiero (路人甲)   2021-04-13 21:21:00
是否使用儲存格變動方式,會比較適合?
作者: soyoso (我是耀宗)   2021-04-13 21:52:00
加上 application.volatile任何儲存格變更值時,就會重新計算。也因會重新計算,因此頻繁的變更值下有可能感覺效能不好。回文寫"使用儲存格變動方式"來看,應該是觸發事件worksheet_change,執行application.calculatefull,不要儲存格變更值就執行重新運算的動作,就寫個判斷來限縮執行動作的範圍有限縮觸發事件範圍的話,不會限縮不是寫在公式function內,而是觸發事件內看要range.row、range.column、range.address或是intersect
作者: waiter337 (給開司一罐蘇格登)   2021-04-15 15:32:00
我給個特別操作Function abc(X As Range)Dim XR As Integer, XC As IntegerXR = X.Row + 2XC = X.Columnabc = Application.Average(Range(Cells(XR - 2, XC),Cells(XR, XC)))End Function然後儲存格F10 =abc(E8:E10)不過還是給建議 別用這種方法像s大的建議一樣 既然都用vba 就別在儲存格工作表上用自訂函數了其實自訂函數是個很肌肋的功能寫了vba三年多 自訂函數的功能 也只有今天用上而已使用率其實非常低 而且就如同s大所說的你現在會卡死不能變更儲存格規劃好的位置就是因為你用vba 又套 儲存格公式 所才變得礙手礙腳建議直接往純vba的方向靠攏另外這段我自身也有經歷過要改成純vba操作反而很快 yt線上課程看看 一星期就能整個習慣改變成功 並且vba套儲存格函數 很容易出現未知的bug 並且更容易出錯 比如你這次碰上的狀況其實還有3~5種你還沒碰到=,= 我都碰過山不轉路轉 祝你順利
作者: soyoso (我是耀宗)   2021-04-17 11:08:00
轉置,worksheetfunction.transpose(ar)要ar = Range("B2:B11")不以迴圈的話宣告dim ar或dim ar as variant我先回原po回文「還有"soyoso的解法,我覺得很訝異,到現在還是覺得怪怪的,應該有別的方法。"」哪個解法?請提出,如果指range.formula,我並沒有回文寫這是拉公式原po回文寫"sub似乎就沒那麼多問題,可是好像只能一個一個做"我寫了"不要一個一個做的話,也可以迴圈,取出自訂函數bcd括號內儲存格字串range.formula"要如何取得儲存格字串,就以range.formula,為什麼要取得這個公式,因為括號內有儲存格字串有這個字串可以幹嘛,就可以迴圈執行Cells(XR, XC + 2) =y2這個動作,只不過用的是range接著回12:20:07的回文兩個哪個比較好?以實際資料自行測試就會知道了。要一維的話,一樣轉置,同上回文寫法,改轉置儲存格範圍可以一起寫,用application.index的方式要每欄寫成1個一維或是二維(維度下限大小的不同)就看哪個原po目前所知且是可以達成要的結果,就以該方式達成回文"那個例子是這篇 #1WBA_rjh",所以哪裡怪了,函數有函數的特性,怪在哪?又不可能每個函數都相同我還是同04/17 14:08回文"看哪個原po目前所知且是可以達成要的結果,就以該方式達成。"原po覺得一欄一個一維打法比較簡單,且這方面可以理解,又可以達成要的結果,那就以該方式達成;那要問兩三個陣列好,還是一個好,這要看實際資料和實際要執行的動作來測試,有測試才有數據,才能說這二則之間,"差不多"的程度是否是原po可以接受的,畢竟"差不多"本身是因人而異的不是嗎?
作者: waiter337 (給開司一罐蘇格登)   2021-04-19 16:48:00
為什麼redim刪除會卡住不用告訴你原因 你直接開個新sub然後用 f8 去執行 然後新增監看式br看看會發生甚麼事情 就明白了 我反而會說的你很亂Sub test()Dim arReDim ar(3)ReDim ar(2, 1)ar(0, 0) = 123ReDim ar(2, 1)ar(0, 0) = 123ReDim Preserve ar(2, 1)ReDim Preserve ar(2, 2)ReDim ar(2, 3)End Sub一個個看有甚麼變化就懂了,要新增監看把 田ar 展開看看 格子的數量 階層 內容 有甚麼變化初學陣列基本上就跟工作表擺放格子一樣 不用想的太麻煩除非未來有機會碰到3維在繼續進一步思考或者多維工作表是他EXCEL預設好了格子而陣列就是你要多少格子 你自己擺redim 基本上就是全部清空重來 所以要怎麼改都可以改多改少改寬改窄都可以但如果用上preserve 就會保留原始資料 只能多不能少雖然說是成功保留原始資料 但也是清空重刷過後了唷但因為有資料 所以你不能改小如果是一開始學 可以只練習用redim 一次開好就好盡量不碰保留 反正久了就會了補充 如果資料量龐大 用了preserve 很容易會變慢

Links booklink

Contact Us: admin [ a t ] ucptt.com