2015-10-16 33 views
0

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

THRE没有告诉在目前的情况下打开工作簿是否由用户或代码打开,除非代码设置某种标志的方式。为什么它作为一个利益的事情有所作为? – Rory

+0

'ThisWorkbook'需要执行一些计算并仅在某些条件下(当被“中央”文件调用时)刷新某些数据连接。如果无法读取文件是否以vba打开,我必须添加冗长的冗余。必要性源于连接 - 刷新:如果数据连接的来源在刷新尝试时不可用,则Excel会尝试打开文件的本地副本,从而中断宏的流向。所以我必须编写一个例程来捕捉这种情况,并在后台打开文件以避免代码停止。 – Vegard

+0

续。我担心调用文件会调用本地打开的工作簿的宏,因为我之前有过时间问题(在工作簿打开之前调用宏),所以我使用了宏初始化有问题的文件的“Workbook_Open”。因此,希望知道谁/什么打开了文件。 – Vegard

回答

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 
+0

我正在使用'Workbook_Open'来启动宏,所以我不认为调用者会在其他宏已经运行之前写入单元。但是我会牢记这一点,或许可以一起破解一些东西。直到星期一,我无法测试它,但感谢迄今为止的输入。 – Vegard

+0

怎么样 - 在可能或可能没有打开工作簿的宏中,首先更改* old *工作簿中形状的属性,然后运行工作簿打开命令。然后在Workbook_Open事件下,检查(a)以前的工作簿是否已打开,以及(b)该工作簿中的计时器是否表示工作簿打开宏已运行。 –

+0

这是一个非常聪明的方式来看待它...我有点失意,我没有想到这一点。当我有机会尝试时,我会检查回来! – Vegard