2016-01-02 52 views
0

我想要监视何时打开excel文件并使用VBA提取文件名。 我想将代码放在另一个excel文件中,而不是打开文件。使用VBA打开excelfile时的监视

我可以使用运行每1秒,我算的工作簿的数字环路 - “workbooks.Count” - 但是,我不知道是否有另一种方式,也许用事件

回答

2

而不是运行每秒一次的计时器,您可以使用事件Application.OnWindow

当打开新的工作簿时激活此事件,但每当焦点从一个工作簿更改为另一个工作簿时。因此,为了跟踪会话期间打开的所有工作簿的名称,您需要将它们放在Collection中,以便每个名称只添加一次。

下面的代码添加到代码模块:

Public openedFiles As New Collection 

Sub StartTracking() '<~~ run this macro to start tracking any opened workbook 
    Application.OnWindow = "OnWnd" 
End Sub 
Sub StopTracking() '<~~ run this macro to stop the tracking 
    Application.OnWindow = "" 
End Sub 

Sub OnWnd() 
    If ActiveWorkbook Is ThisWorkbook Then Exit Sub 
    For Each x In openedFiles 
     If x = ActiveWorkbook.fullName Then Exit Sub 
    Next 

    openedFiles.Add ActiveWorkbook.fullName 

    ' An example usage: display the names of the files opened during session 
    Dim s As String: s = "workbooks opened so far: " & vbCrLf 
    For Each F In openedFiles 
     s = s & vbCrLf & F 
    Next 
    MsgBox s 
End Sub 
+0

我以前从未见过的OnWindow事件。有趣的是,不需要应用程序事件。我看到这是用Excel 2013添加的。 –

+0

@DougGlancy感谢您的评论。此外,我有Excel 2010,它有它。我不知道什么时候它确实存在... –

+0

好的解决方案 但是我还有一个额外的问题。如果一个文件关闭后再打开,那么它将不会被监控,因为我了解您的代码。 – user3357510