0

我为工作而放在一起的宏有一个奇怪的问题。

背景故事,我基本上设计了一个宏来在 X 时间后打开受保护的工作簿后关闭它。它是一个共享文档,当人们打开它时,他们经常忘记关闭文档,将其锁定以防止其他人使用它。

所以我拿了一些其他的宏来创建一个计时器。

Sub Start_Timer()
'BASIC UP COUNTER
Application.OnTime Now() + TimeValue("00:00:01"), "CheckStatus"
End Sub


Sub CheckStatus()
Dim ws As Worksheet
For Each ws In Worksheets

If ws.Range("IV1").Value > 60 Then
'IF IDLE LONGER THAN VALUE ABOVE, RUN THE FOLLOWING
Application.DisplayAlerts = False 'WORKS TO DISABLE ALERT PROMPT
ThisWorkbook.Close (False) 'CLOSE FILE WITHOUT SAVING
Application.Quit
Application.DisplayAlerts = True 'RESETS DISPLAY ALERTS
End Sub    

Else
'ADD 1 TO COUNTER
ws.Range("IV1").Value = ws.Range("IV1").Value + 1
End If
Next
Start_Timer
End Sub

在本工作簿中

Private Sub Workbook_Open()
Dim ws As Worksheet
MsgBox ("This Worksheet has a 15 min timer")

Start_Timer
For Each ws In Worksheets
'Columns("IV:IV").Hidden = True

ws.Range("IV1").Value = 1
Next
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim ws As Worksheet
For Each ws In Worksheets
ts.Range("IV1").Value = 1
Next
End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False 'WORKS TO DISABLE ALERT PROMPT
ThisWorkbook.Close (False) 'CLOSE FILE WITHOUT SAVING
Application.Quit
Application.DisplayAlerts = True 'RESETS DISPLAY ALERTS
End Sub

在大多数情况下,它都有效。但是,我宁愿消除“Application.Quit”之类的东西。我遇到的问题是,当我消除该行时,工作簿在手动关闭它或尝试手动退出 excel 后立即重新打开。

我认为这可能与不断更改 1 个单元格的值有关(很远,所以没有人看到它)并在不保存的情况下退出。

谁能帮我?谢谢

4

3 回答 3

1

也许你有错字?:

Dim ws As Worksheet
For Each ts In Worksheets
         ^ws ??
If ws.Range("IV1").Value > 60 Then
于 2013-03-25T21:10:00.567 回答
0

你知道你可以给 Excel 文件一个共享状态,以便多个用户可以同时访问它吗?

例如: http: //office.microsoft.com/en-in/excel-help/share-a-workbook-HP005202595.aspx

于 2013-03-25T21:22:18.773 回答
0

添加一个全局变量来存储上次安排的 OnTime() 时间值并调整您的计时器子:

Dim lastTimer As Variant

Sub Start_Timer()
    'BASIC UP COUNTER
    lastTimer = Now() + TimeValue("00:00:01")
    Application.OnTime lastTimer, "CheckStatus"
End Sub

然后将此添加到 Workbook_BeforeClose 事件中:

Application.OnTime lastTimer, "CheckStatus", , False

这将取消 Application.OnTime() 的最后一次预定调用。

于 2013-03-26T23:25:01.257 回答