2013-11-17 2 views
3

У меня есть следующий фрагмент кода, который я написал в excel vba для управления событием On_Close любой книги Excel. Я написал код как надстройку Excel и, следовательно, загружается для всех открытых книг excel.Excel WorkbookBeforeClose событие, выпущенное несколько раз

Цель добавления для поиска по закрытому событию (скорее, перед закрытием), что если книга была сохранена по определенному пути, она должна предупредить пользователя о некоторых пользовательских приглашениях, иначе ничего не делать.

Проблема в том, что хотя событие срабатывает правильно, оно срабатывает несколько раз (в основном) (3), и я не могу найти причину этого. Я перевел тот же код в Word VBA и, похоже, там отлично работает.

  • У меня есть стандартный модуль: "savefromtemp"

код

Option Explicit 

Dim oAppClass As New ThisApplication 

Sub Auto_Open() 
    Set oAppClass.oApp = Application 
End Sub 
  • У меня есть модуль класса: ThisApplication

Код

Option Explicit 

Public WithEvents oApp As Application  

Private Sub oApp_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) 
    MsgBox "abt to close" 
    Dim iRet As Integer 
    Dim sFolderName As String, fDialog As FileDialog, ret As Long 

    'Debug.Print ActiveWorkbook.FullName 

    If InStr(1, ActiveWorkbook.FullName, "C:\Users\" & Environ("username") & "\SDocuments\") Then 
     iRet = MsgBox("Blah Blah Blah. Do you want to save this file to different location?", vbOKCancel, "Alert") 

     If iRet = vbOK Then 

      Set fDialog = Application.FileDialog(msoFileDialogSaveAs) 
      ret = fDialog.Show 

      If ret <> 0 Then 
       sFolderName = fDialog.SelectedItems(1) 
       'MsgBox sFolderName 
       If sFolderName = "" Then 
        MsgBox "Failed to save. Please check!" 
       End If 
    '  Else 
    '   MsgBox "User pressed cancel" 
      End If 
      Set fDialog = Nothing 

     ElseIf iRet = vbCancel Then 

     End If 

    End If 
End Sub 
+0

Просто наблюдение, но «(в основном 3)» заставляет меня думать, что он может стрелять для каждого рабочего листа в книге (по умолчанию 3). Наверное, не полезно - но может дать вам что-то, на что посмотреть. – dav1dsm1th

+0

Как вызывается 'oApp_WorkbookBeforeClose'? Разве это не стандартная нотация «Workbook_BeforeClose»? –

+0

Вы пытались отключить события? 'Application.EnableEvents = False' (после этого в конце вашего кода возвращается значение true) – Sam

ответ

1

Поскольку это обработчик события на уровне приложения, при закрытии самого приложения Excel, он срабатывает для всех открытых книг, в том числе любых AddIn-х гг.

Вам нужно будет проверить, если закрытие книги является тот, который вы хотите обработать

Примечание: когда я тестировал его, закрыв один учебное пособие вызывает событие только один раз для меня.

+0

Я не тестировал вашу логику в обработчике событий (ну, только ненадолго). Похоже, что он содержит другие проблемы, но я думаю, что это незавершенная работа. –

+0

Да, это незавершенная работа ... Мне нужна помощь :(спасибо neilsen –

+0

Вместо того, чтобы превращать этот OP в вопрос хамелеона, сначала давайте сосредоточимся на событии, снимающем часть. Отвечает ли мне ответ? заключается в том, чтобы временно прокомментировать весь код, кроме 'MsgBox Wb.FullName', который сообщит вам, какая рабочая книга запускает событие (используйте' Wb' в вашем 'If' тоже, а не Activeworkbook). Как только вы довольны стрельбой, если вы все еще застряли, задайте другой вопрос. –

Смежные вопросы