2017-02-22 100 views
0

我正在寫vba,它在工作表中操縱數據,但是我試圖在工作簿打開時運行它。每當打開工作簿時運行vba代碼

我遇到的問題是,由於工作簿(代碼需要運行)每次都不同/新,我需要將auto_open代碼放在​​個人宏工作簿中。

Sub Auto_Open() 
Dim bookname As String 
Dim checkbook As String 
Dim Workbook As Workbook 

For Each Workbook In Application.Workbooks 
bookname = Workbook.Name 
checkbook = Left(bookname, 3) 
    If checkbook = "EDN" Then 
    Data_generator 
    Application.DisplayAlerts = False 
    ThisWorkbook.Save 
    Application.DisplayAlerts = True 
    Application.Quit 
    Else 
    End If 
Next Workbook 
End Sub 

運行此代碼時它會檢查所有打開的工作簿,並認爲,如果它的前3個字母是「EDN」,如果是則運行名爲「Data_generator」公衆子,保存並退出。如果它不檢查下一個打開的工作簿等。

當從Windows資源管理器打開文件時,Excel啓動(同時包含所需的工作簿和個人宏工作簿),但是因爲Excel首先打開個人宏工作簿,在打開所需的工作簿之前運行代碼,但沒有找到名爲「EDN」的工作簿。

如果上面的代碼在兩個工作簿打開後運行,那麼代碼按預期工作,並循環遍歷每個打開的工作簿,看看是否有一個名爲'EDN'(這已通過在'then'之後放置一個messagebox和運行代碼),如果是的話運行子。

我已經通過在'else'之後放置一個消息框來證明這一點,當這樣做完成後,它會顯示帶有我想要的工作簿的消息框,而不是打開的。消息框被清除後,工作簿隨即打開。

是否有任何方法可以使所需的工作簿首先打開或其他任何解決方法?

+3

您需要的應​​用程序事件:http://www.cpearson.com/Excel/AppEvent.aspx特別是您想要捕獲應用程序的'WorkbookOpen'事件,該事件將觸發任何工作簿打開。 – Rory

+0

完美,這正是我想要的。 –

回答

0

您應該能夠使用應用程序,您可以創建一個加載項運行。 OnWindow事件在文件打開或關閉時觸發宏。

在的ThisWorkbook

Private Sub Workbook_Open() 
    Call StartTracking 
End Sub 

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    Call StopTracking 
End Sub 

在模塊

Function StartTracking() 
    Application.OnWindow = "AutoRunOnWindowChange" 
End Function 

Function StopTracking() 
    Application.OnWindow = "" 
End Function 

Function AutoRunOnWindowChange() 
    If Left(ActiveWorkbook.Name, 3) = "EDN" Then 
     Call Data_generator 
     Application.DisplayAlerts = False 
     ThisWorkbook.Save 
     Application.DisplayAlerts = True 
     Application.Quit 
    End If 
End Function 
相關問題