MICROSOFT

EP05. “Rolling Average Table 滚动平均表”

首页 Microsoft 工具 Excel · VBA · Events · EP05
约 6 分钟· #EP05#Excel#Events
🔒 登录后可标记已读
  • 结合命令按钮(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 事件

  1. 打开 VBE,双击 Sheet1
  2. 左边下拉选 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:

  1. Rolling Average Table