修改:我已成功解决了以下问题,方法是使用工作簿A中的Application.EnableEvents = False
停止Workbook_Open()
代码在工作簿B中运行,但如果有人关心,我仍然会被问题困扰解释一下?
我已经获得了工作簿A打开,编辑,保存和关闭工作簿B.由于多个用户使用了工作簿B,我在打开时切换到只读模式并显示弹出消息。但是,从Workbook A运行代码时,我想停止打开消息框。我在打开时使用Application.OnTime
将工作簿B更改为只读,并在10秒内保存后取消待处理代码。
问题:代码在我直接打开Workbook B并在10秒内保存但在将工作簿A中的代码运行到open=>edit=>save=>close Workbook B
时工作,即使关闭后,工作簿B也会自动打开。
在尝试使用公共变量和引用VBA项目进行大量研究和反复试验之后,我使用以下资源确定了Application.OnTime
:
http://www.cpearson.com/excel/OnTime.aspx
以下是我的代码示例。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call StopTimer
End Sub
Private Sub Workbook_Open()
Call StartTimer
End Sub
Public RunWhen As Double
Public Const cRunWhat = "Change_File_Access"
Public Const cRunIntervalSeconds = 15
Public DatabaseWB As Workbook
Sub StartTimer()
RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
Schedule:=True
End Sub
Sub StopTimer()
MsgBox RunWhen
On Error Resume Next
Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
Schedule:=False
End Sub
Sub Change_File_Access()
If Not Workbooks("WorkbookB.xlsm").ReadOnly Then Workbooks("WorkbookB.xlsm").ChangeFileAccess xlReadOnly
MsgBox "This file is set as Read-Only"
End Sub
答案 0 :(得分:0)
一些快速测试显示计时器似乎在宏所在的工作簿的上下文中运行 - 而不是您从中执行它的工作簿。因此,您需要执行以下两项操作之一 - 完全退出Excel应用程序(可能不方便),或者从您正在运行代码的工作表中重置计时器。
即,在WorkbookA中:
<ul>
<li>
<span class="weekday" id="monday">Mo  </span>8:00 - 12:00, 14:30 - 17:00
</li>
<li>
<span class="weekday" id="tuesday">Di, </span><span class="weekday" id="thursday">Do  </span>8:00 - 12:00, 15:30 - 19:00
</li>
<li>
<span class="weekday" id="wednesday">Mi,</span> <span class="weekday" id="friday">Fr  </span>8:00 - 13:00
</li>