2017-02-22 23 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 буквы этого являются «СЦС», если после этого запустить Public Sub под названием «Data_generator», сохранить его и бросить курить. Если он не проверяет следующую открытую книгу и т. Д.

Когда файл открывается из проводника Windows, excel запускает (как с требуемой книгой, так и с личной рабочей книгой), однако, поскольку Excel сначала открывает персональную макрокоманду и запускает код перед тем, как открыть желаемую книгу, он не найдет книгу под названием «EDN».

Если приведенный выше код запускается после открытия обеих книг, код работает по назначению и циклически проходит через каждую открытую книгу, чтобы увидеть, есть ли один из них под названием «EDN» (это было доказано путем помещения сообщения после «затем» и запуск кода), если так запустить sub.

Я доказал это, поставив сообщение через «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