EP05. “Rolling Average Table 滚动平均表”
🔒 登录后可标记已读- 结合命令按钮(Command Button)和 Worksheet Change 事件,做一个滚动平均表
- 每次点按钮产生新的随机数,自动把新数字塞进表格最上面、旧数字依序往下移、最后一个数字被挤出去
- 常用来模拟移动平均(moving average)这类统计场景
- 前置知识:EP04 的 Change 事件用法;学完能理解 Range 赋值给 Range 时是怎么做「批量搬移」的
重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。
表格结构
- B3:放一个命令按钮,点击后在这里塞入新的随机数
- D3:D7:五个数值的滚动窗口,D3 永远是最新值,D7 是最旧的值(下一次会被挤掉)
- D8:
=AVERAGE(D3:D7),即这五个数的平均值
步骤 1:命令按钮的 Click 代码
在工作表放一个命令按钮(Developer → Insert → Button),双击进入代码窗口,写入:
Range("B3").Value = WorksheetFunction.RandBetween(0, 100)
这行代码在 B3 塞入一个 0 到 100 之间的随机整数,每次点按钮都会触发下面的 Worksheet_Change 事件。
步骤 2:绑定 Worksheet Change 事件
- 打开 VBE,双击 Sheet1
- 左边下拉选 Worksheet,右边下拉选 Change
完整代码
Private Sub Worksheet_Change(ByVal Target As Range)
Dim newvalue As Integer, firstfourvalues As Range, lastfourvalues As Range
If Target.Address = "$B$3" Then
newvalue = Range("B3").Value
Set firstfourvalues = Range("D3:D6")
Set lastfourvalues = Range("D4:D7")
lastfourvalues.Value = firstfourvalues.Value
Range("D3").Value = newvalue
End If
End Sub
- 只有 B3 改变(也就是按钮塞入新随机数)才会触发下面的逻辑
firstfourvalues(D3:D6)和lastfourvalues(D4:D7)刻意错开一格lastfourvalues.Value = firstfourvalues.Value:把 D3:D6 整块的值直接搬到 D4:D7,同时完成「所有旧值往下移一格」,D7 原本的值因为没人再引用会被覆盖掉,等于自动被挤出窗口- 最后把新值塞进 D3,完成一次滚动
步骤 3:加上平均值公式
在 D8 输入 =AVERAGE(D3:D7),滚动窗口更新后平均值会自动跟着变。
[截图:连续点击几次命令按钮后 D3:D8 的效果,最新的随机数从 D3 塞入,旧数字依序往下移,D8 显示当下的平均值]
学完你会
- ✅ 用命令按钮的 Click 事件触发数据变化,再用 Change 事件接手处理
- ✅ 用错开一格的两个 Range 直接赋值,实现「整块数据下移、末尾被挤出」的效果
- ✅ 知道 ActiveX 命令按钮要注意 Design Mode 开关
常见错误
- 两个 Range(firstfourvalues / lastfourvalues)如果没有刻意错开一格,搬移逻辑会变成整体平移而不是「挤出最后一个」
- 命令按钮如果用的是 ActiveX 控件,要注意 Design Mode 开关,没关掉 Design Mode 点按钮不会有反应
- 误以为要一格一格手动赋值才安全,其实 Range 直接赋值给同大小的 Range 是合法且更简洁的写法
Sources
Blog / Website: