正如 01:00 的视频所解释的那样,
代码必须放在 Sheet1(或用于捕获服务器数据的工作表)中,这意味着您必须双击 VBA 左上角项目资源管理器窗格中的工作表名称才能访问其代码窗口
您必须完全按照 Youtube ... 上显示的方式使用 Sub() 的名称Private Sub Worksheet_Change(ByVal Target As Range)
。您可以手动键入代码,也可以从代码窗口上方的选择框中选择“工作表”和“更改”。当您选择“工作表”(包括 )时,删除最终会自动创建的“Sub Selection_Change” SubEnd Sub
这可确保每次工作表中的(=任何)单元格更改时都会触发宏。
If Not Intersect(...)
关心只有某个单元格的更改由其余代码处理
如果您在第一行设置断点 - Private Sub ...
- 使用 Debug/Toggle Breakpoint 或 {F9} - 您将能够使用 {F8} 单步执行代码并观看
编辑:
经过一些谷歌搜索......=RTD()
不会触发更改宏(令许多人失望) - 所以需要不同的策略。
=RTD()
不时地获取数据(时间间隔 X)并将其放入与当前 [A2] 不同的单元格 C 中。您可以创建一个代码块,它执行每个 X/2 并检查是否 C <> [A2] ...如果是,则将 C 移动到 [A2] 并向下复制旧值。
例子:
创建一个模块“TimerFunctions”并添加此代码
Public IsTimer As Boolean
Sub TimerSet(IntervalSec As Date, TimerProcName As String)
If IsTimer Then Application.OnTime Now() + IntervalSec, TimerProcName, , True
End Sub
Sub TimerAction()
' look for new value ... e.g. compare RTD cell [A1] with last stored value [A2]
If [A2] <> [A1] Then
' your original code - move whole stack one down
Range("A3:A31").Value = Range("A2:A30").Value
' copy new value on top of stack
[A2] = [A1]
End If
' do it again in 2 seconds
TimerSet TimeValue("00:00:02"), "TimerAction"
End Sub
表 1
Private Sub Worksheet_Activate()
IsTimer = True
TimerSet TimeValue("00:00:02"), "TimerAction"
End Sub
Private Sub Worksheet_Deactivate()
IsTimer = False
End Sub
现在每 2 秒检查一次 RTD 函数是否有新值,如果找到该值,则将其保存在堆栈顶部,而其余 30 的值将向下推 1。只要您在工作表中,这就会起作用。如果您更改为 Sheet2(= 停用 Sheet1),此机制将停止,直到您返回到 Sheet1(= 激活工作表)。
如果这个定时的事情应该一直运行,你必须付出更多的努力来解决你的单元格,这样即使活动表是另一个,这一切也能正常工作。