You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

长时间运行Excel VBA时如何防止电脑休眠锁屏?

解决Excel VBA运行期间电脑自动休眠/锁屏的方案

以下是几种比鼠标移动、播放直播更可靠的解决方案,按有效性排序:

1. 使用Windows API强制保持系统唤醒(推荐)

直接调用系统API告诉Windows不要进入休眠或关闭显示器,这是最稳定的系统级解决方案,不会被电源计划或其他设置干扰。

VBA代码实现:

' 声明Windows API函数(适配32/64位Office)
Private Declare PtrSafe Function SetThreadExecutionState Lib "kernel32.dll" (ByVal esFlags As LongPtr) As LongPtr

' 定义API所需常量
Private Const ES_CONTINUOUS = &H80000000
Private Const ES_SYSTEM_REQUIRED = &H1
Private Const ES_DISPLAY_REQUIRED = &H2

' 开启防休眠模式
Sub KeepSystemAwake()
    ' 同时阻止系统休眠和显示器关闭
    SetThreadExecutionState ES_CONTINUOUS Or ES_SYSTEM_REQUIRED Or ES_DISPLAY_REQUIRED
End Sub

' 恢复系统默认休眠设置
Sub AllowSystemSleep()
    SetThreadExecutionState ES_CONTINUOUS
End Sub

使用方法:

在你的长时运行宏中加入错误处理,确保无论宏正常结束还是意外中断,都能恢复系统设置:

Sub LongRunningMainMacro()
    On Error GoTo Cleanup
    
    ' 启动防休眠
    KeepSystemAwake
    
    ' ----------------------
    ' 你的核心VBA代码逻辑
    ' ----------------------
    
Cleanup:
    ' 恢复系统休眠设置
    AllowSystemSleep
    ' 处理错误(如果有)
    If Err.Number <> 0 Then
        MsgBox "宏执行出错: " & Err.Description, vbCritical
    End If
End Sub

2. 临时修改电源计划

通过VBA调用系统命令,临时创建并启用一个禁用休眠、显示器关闭的电源计划,宏结束后恢复原计划。

VBA代码实现:

' 创建临时电源计划并禁用休眠/显示器关闭
Sub SetTemporaryPowerPlan()
    Dim wsh As Object
    Set wsh = CreateObject("WScript.Shell")
    
    ' 获取当前激活的电源计划GUID并保存到单元格(用于恢复)
    Dim currentPlanGuid As String
    currentPlanGuid = Trim(Split(wsh.Exec("powercfg /getactivepolicy").StdOut.ReadAll, vbCrLf)(1))
    ThisWorkbook.Sheets("Sheet1").Range("A1").Value = currentPlanGuid
    
    ' 复制"高性能"计划作为临时计划(GUID固定)
    wsh.Run "powercfg /duplicatescheme 381b4222-f694-41f0-9685-ff5bb260df2e 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c", 0, True
    ' 启用临时计划
    wsh.Run "powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c", 0, True
    ' 禁用休眠、待机、显示器关闭(AC电源下)
    wsh.Run "powercfg /change 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c standby-timeout-ac 0", 0, True
    wsh.Run "powercfg /change 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c hibernate-timeout-ac 0", 0, True
    wsh.Run "powercfg /change 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c monitor-timeout-ac 0", 0, True
    
    Set wsh = Nothing
End Sub

' 恢复原电源计划并删除临时计划
Sub RestoreOriginalPowerPlan()
    Dim wsh As Object
    Set wsh = CreateObject("WScript.Shell")
    
    Dim currentPlanGuid As String
    currentPlanGuid = ThisWorkbook.Sheets("Sheet1").Range("A1").Value
    
    If currentPlanGuid <> "" Then
        ' 恢复原计划
        wsh.Run "powercfg /setactive " & currentPlanGuid, 0, True
        ' 删除临时计划
        wsh.Run "powercfg /delete 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c", 0, True
        ' 清空保存的GUID
        ThisWorkbook.Sheets("Sheet1").Range("A1").Clear
    End If
    
    Set wsh = Nothing
End Sub

使用方法:

在主宏开头调用SetTemporaryPowerPlan,结尾调用RestoreOriginalPowerPlan。注意:此操作需要管理员权限,否则命令可能执行失败。

3. 低频率模拟键盘操作

模拟按下Scroll Lock键(无实际功能影响),让系统认为有用户活动。相比鼠标移动,键盘操作更不容易被系统的节能策略忽略。

VBA代码实现:

' 每隔10分钟触发一次键盘操作,持续20小时
Sub PreventSleepWithKeyboard()
    Dim elapsedTime As Double
    elapsedTime = Timer
    
    ' 循环20小时(72000秒)
    Do While Timer - elapsedTime < 72000
        ' 按下再松开Scroll Lock,避免指示灯一直亮着
        CreateObject("WScript.Shell").SendKeys "{SCROLLLOCK}"
        Application.Wait Now + TimeValue("00:10:00")
        CreateObject("WScript.Shell").SendKeys "{SCROLLLOCK}"
    Loop
End Sub

使用方法:

可以将此代码嵌入到主宏的循环逻辑中(如果主宏本身有循环),或者开启一个新的Excel线程并行运行。


为什么之前的方法无效?

  • 鼠标移动代码可能间隔过长,或系统的电源策略对模拟鼠标操作识别度低;
  • YouTube直播可能被浏览器的节能模式限制,或系统将媒体播放判定为非用户交互操作,不触发唤醒机制。

内容的提问来源于stack exchange,提问作者ptownbro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:56:02