[算表] 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