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

Windows锁定时VBA全天候警报系统时间获取异常求助

解决Windows锁定时VBA Now函数返回异常时间的问题

看起来你碰到了一个挺棘手的场景:你的全天候警报系统在Windows锁定时,VBA的Now函数居然返回了27/08/2138这个离谱的未来时间,而解锁状态下一切正常。这个问题其实是VBA和Windows系统锁定状态交互的一个已知小坑,我来给你拆解原因和解决办法:

问题根源

当Windows系统锁定时,VBA的内置时间函数(Now/Date)可能无法正常调用系统的实时时间服务,转而 fallback到了一个预设的错误时间值——2138年这个点其实是32位Unix时间戳的上限,底层可能是某些时间处理逻辑的溢出或默认值导致的。如果你的Office是32位版本,出现这个问题的概率会更高。

解决方案

1. 改用Windows API直接获取系统时间(最可靠)

绕过VBA内置的时间函数,直接调用Windows内核的API来获取时间,这样不受系统锁定状态的影响。

首先在你的VBA模块顶部添加以下API声明和自定义函数(兼容32/64位Office):

#If VBA7 Then
    Private Declare PtrSafe Function GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) As Long
#Else
    Private Declare Function GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) As Long
#End If

Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

Function GetCurrentSystemTime() As Date
    Dim sysTime As SYSTEMTIME
    GetSystemTime sysTime
    GetCurrentSystemTime = DateSerial(sysTime.wYear, sysTime.wMonth, sysTime.wDay) + _
                           TimeSerial(sysTime.wHour, sysTime.wMinute, sysTime.wSecond)
End Function

然后修改你的Actualizar_Online子过程,把所有用到Now/Date的地方替换成这个自定义函数:

Sub Actualizar_Online()
 Dim Inicio As Long, Fin As Long, Fecha As Date, Hora As Date
 AhorroMemoria True
 Declaraciones
 ' 替换Now为自定义函数的时间部分
 Hora = TimeValue(GetCurrentSystemTime)
 If Minute(Hora) > 30 Then
 Hora = TimeSerial(Hour(Hora), 0, 0)
 ElseIf Minute(Hora) < 30 Then
 Hora = TimeSerial(Hour(Hora) - 1, 30, 0)
 End If
 ' 直接组合日期和处理后的时间
 HoraInforme = DateValue(GetCurrentSystemTime) + Hora
 Fecha = DateValue(GetCurrentSystemTime)
 CargarDia
 With wsDB
 Inicio = .Cells.Find("SUR").Row
 Fin = .Cells.Find(Fecha - 1, After:=.Cells(Inicio, 1)).Row
 If Inicio <> Fin Then
 .Rows(Inicio & ":" & Fin - 1).Delete
 .Rows(.Cells(.Rows.Count, 1).End(xlUp).Row + 1 & ":" & .Rows.Count).Delete
 End If
 End With
 wb.RefreshAll
 Segmentaciones
 wsAlerta.Cells(2, 1) = HoraInforme
 wsAlerta.Calculate
 ComprobarMail
 AhorroMemoria False
End Sub

这个方法直接从系统内核获取时间,完全避开了VBA内置函数的问题,在锁定状态下也能准确拿到当前时间。

2. 切换到64位Office(如果可行)

如果你的当前Office是32位版本,升级到64位Office可以减少这类系统资源访问限制导致的异常,64位程序在系统锁定状态下的兼容性更好。

3. 调整任务计划设置(如果用任务计划触发宏)

如果你的警报系统是通过Windows任务计划触发的,检查以下设置:

  • 勾选**“不管用户是否登录都要运行”**,并确保任务有足够的权限;
  • 避免使用“仅当用户登录时运行”的选项,锁定状态下这个设置会限制宏对系统资源的访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:35:33