我可以判断一个文件是否由本地宏打开 - 或者,我能找到一个实例文件的调用者或父母是谁吗?

时间:2015-10-16 10:57:50

标签: excel-vba vba excel

当且仅当目标文件已关闭或由本地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

这种解决方法有点类型,除了它无法判断文件是手动打开还是由某个程序代理打开。有没有办法做到这一点,还是有更简单的方法来做我在我的代码中尝试做的事情?

1 个答案:

答案 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