当且仅当目标文件已关闭或由本地VBA宏打开时,我想运行一段特定的代码。如果文件由网络上的其他用户打开,则代码不应运行。
到目前为止,我有这个测试代码:
Sub refreshAll()
Dim wbIsOpen As Boolean, wbIsOpenByMe As Boolean
Dim fileName As String, filePath As String
Dim testWb As Workbook
fileName = "test.xlsm"
If IsWorkBookOpen(ThisWorkbook.Path & "\" & fileName) Then wbIsOpen = True
On Error Resume Next
Set testWb = Workbooks(fileName)
If Not testWb Is Nothing Then wbIsOpenByMe = True
Err.Clear
On Error GoTo 0
If wbIsOpen = False Or wbIsOpenByMe = True Then
ThisWorkbook.Connections("testcon").OLEDBConnection.BackgroundQuery = False
ThisWorkbook.refreshAll
DoEvents
End If
End Sub
这种解决方法有点类型,除了它无法判断文件是手动打开还是由某个程序代理打开。有没有办法做到这一点,还是有更简单的方法来做我在我的代码中尝试做的事情?
答案 0 :(得分:0)
如果你知道可以打开文件的宏,你对它有权威吗?也许只是让宏更改了工作簿中的一些受保护的值 - 即:让它将该时刻的日期和时间添加到隐藏的形状标题中。然后这个宏可以检查标题上的日期和时间是否与当前日期和时间匹配(在处理时间误差范围内)。
这可能有点像:
Sub MacroWhichCouldHaveBeenUsedToOpenWorkbook()
'Other code
'Code to open target workbook
Workbooks("TargetWorkbook.xlsx").Sheets(1).Shapes(1).Title = Now()
End Sub
Sub RunIfAutoOpened()
If (Now + #0:00:05#) < Workbooks("TargetWorkbook.xlsx").Sheets(1).Shapes(1).Title Then
'Run desired code
End If
End Sub