2015-06-02 2 views
0

У меня есть следующие части кода для данного активного листа:VBA: Workbook.Close петля

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

Dim sh As Worksheet 
Dim myMessage 
    If ActiveSheet.Range("I5").Value > 0 Then 
     MsgBox "Some cells are empty" _ 
     & Chr(13) & Chr(13) & "Please, fill in the empty cells to proceed", _ 
     vbExclamation + vbOKOnly, "ERROR!" 
     Cancel = True 
    Else 
     ThisWorkbook.Unprotect ("123") 
     Worksheets("Instructions").Visible = True 
     Worksheets("Instructions").Activate 
     For Each sh In Worksheets 
      If sh.Name <> "Instructions" Then 
       sh.Visible = xlVeryHidden 
      End If 
     Next sh 
     ThisWorkbook.Protect ("123") 
     myMessage = MsgBox("Do you want to save and close this file?", vbQuestion + vbYesNo, "Workbook 1") 
      If myMessage = vbYes Then 
       Application.DisplayFormulaBar = True      
       ThisWorkbook.Close True 
      ElseIf myMessage = vbNo Then 
       Cancel = True 
      Else 
       'nothing 
      End If 

    End If 
End Sub 

В общем, при нажатии на кнопку закрытия на самой книге, идея заключается в том, чтобы проверить данное ячейки данного активного листа для ненулевого значения. Если он не равен нулю, пользователь должен сначала заполнить некоторые пустые ячейки, а книга не будет закрыта. В качестве альтернативы рабочий лист «Инструкция» активируется, и пользователь получает окно с сообщением о том, что делать дальше (делая это вместо простого msgbox и придерживаясь обычной подсказки «SAVE/NO», заключается в том, что я хочу устранить возможность нажатия пользователем кнопки «Нет», что приведет к невозможности сохранения). Единственная проблема, с которой я столкнулся, - это однократный цикл, который я получаю, когда пользователь выбирает ответ «Да»: снова появляется такое же окно сообщения (видимо, потому что процедура снова проходит через строку кода!). Буду признателен, если бы вы могли предложить мне, как я мог бы избежать этого цикла.

+0

Зачем вам нужно повторить функцию, уже внедренную в Excel: это всплывающее диалоговое окно подсказки на рабочем столе закрыть «Вы хотите сохранить изменения ...» с 3 стандартными кнопками? С уважением, –

+0

@AlexBell, спасибо за ваш комментарий. Как я уже упоминал в разделе вопросов, я хочу, чтобы пользователь случайно не нажал кнопку «Нет», что не приведет к тому, что ничего не будет сделано. Это единственная причина, по которой я реализовал свой собственный ящик сообщений. –

ответ

0

Если вы не позволите пользователю не сохранять, то почему бы не принудительно сохранить. Вы можете заменить все окна сообщения оперативного раздел:

myMessage = MsgBox("Do you want to save and close this file?", vbQuestion + vbYesNo, "Workbook 1") 
     If myMessage = vbYes Then 
      Application.DisplayFormulaBar = True      
      ThisWorkbook.Close True 
     ElseIf myMessage = vbNo Then 
      Cancel = True 
     Else 
      'nothing 
     End If 

с

ThisWorkbook.Save 

Это заставит сохранить и закрыть книгу.

+0

О, дорогая! Это было так просто! Фактически, я использовал строку ThisWorkbook.Save раньше в этом коде, но затем набрал ThisWorkbook.Close (я посмотрел на функцию .Save, как если бы она ТОЛЬКО сохранила мою книгу. Но я не принимал во внимание тот факт, что Excel был уже реализовав закрытие книги! Теперь я понял свою ошибку. Спасибо, тонну, @daytonrazorback! –

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