【发布时间】:2023-04-05 18:53:01
【问题描述】:
我在工作簿打开事件中使用以下 vba 代码:
Private Sub Workbook_Open()
On Error GoTo Message
Application.AskToUpdateLinks = False
ThisWorkbook.UpdateLinks = xlUpdateLinksNever
ActiveSheet.DisplayPageBreaks = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim currentTime As Date
currentTime = DateAdd("s", 10, Now)
Call CurUserNames
Application.OnTime currentTime, "SaveFile"
Exit Sub
Message:
Application.DisplayAlerts = False
Exit Sub
End Sub
我在一个模块中也有这段代码:
Public Sub SaveFile()
On Error GoTo Message
ThisWorkbook.Save
Dim currentTime As Date
currentTime = DateAdd("s", 10, Now)
Application.OnTime currentTime, "SaveFile"
Exit Sub
Message:
Application.DisplayAlerts = False
Exit Sub
End Sub
我想要做的是每 10 秒自动保存我的工作簿。
这行得通。
但是,我注意到发生了一些非常烦人的事情。如果用户在后台打开此工作簿并正在处理另一个 Excel 工作簿,则此工作簿将在保存时激活并显示在另一个工作簿之上。
这对用户来说可能很烦人。 有没有一种方法可以在不激活工作簿的情况下保存我的工作簿?
附注: 由于某些未知原因,这也会导致工作簿在关闭时重新打开。
编辑:
列出工作簿代码中的活跃用户:
Sub CurUserNames()
Dim str As String
Dim Val1 As String
str = "Users currently online:" & Chr(10)
For i = 1 To UBound(ThisWorkbook.UserStatus)
str = str & ThisWorkbook.UserStatus(i, 1) & ", "
Next
Val1 = DeDupeString(Mid(str, 1, Len(str) - 2))
Worksheets("Delivery Tracking").Range("F4").Value = Val1
End Sub
Function DeDupeString(ByVal sInput As String, Optional ByVal sDelimiter As String = ",") As String
Dim varSection As Variant
Dim sTemp As String
For Each varSection In Split(sInput, sDelimiter)
If InStr(1, sDelimiter & sTemp & sDelimiter, sDelimiter & varSection & sDelimiter, vbTextCompare) = 0 Then
sTemp = sTemp & sDelimiter & varSection
End If
Next varSection
DeDupeString = Mid(sTemp, Len(sDelimiter) + 1)
End Function
【问题讨论】:
-
10 秒非常频繁,为什么不添加一个条件来查看工作簿是否真的 处于活动状态,否则跳过保存?这样,如果工作簿实际发生更改,它将处于活动状态,然后每 10 秒保存一次。出于兴趣,为什么如此频繁?
-
@Wolfie 我需要经常使用它,因为用户可以访问工作簿,因为它是共享的,并且在单元格中我列出了所有活动用户。但是,除非经常保存工作簿,否则不会更新
-
回复:未知原因:除非您在
Workbook_Close事件触发时清除了OnTime事件计划,否则它将重新打开它以继续计划。有数百个示例说明如何执行此操作。此外,与其每 10 秒盲目地保存文件,为什么不先测试是否发生了变化,如果发生了则保存?如果文件已更改,ThisWorkbook.Saved将设置为False。 -
我同意@CLR,这个问题很可能有更好的攻角,比如“换页”事件加上一个计时器。首先,我希望这本工作手册很小,而且您的网络速度很快,因为即使每 10 秒自动保存一秒钟,生产力也会下降 10%!
-
该工作簿是通过 VBa 从其他工作簿打开的吗?