Предотвращение ввода новых записей до заполнения всех полей в MsExcel - PullRequest
0 голосов
/ 07 августа 2020

У меня есть лист в Excel: введите описание изображения здесь

Моя цель - пользователь не должен иметь возможность продолжить, пока все поля не будут заполнены из моих раскрывающихся списков.

В противном случае - должно появиться какое-то предупреждение или просто не будет ' Позвольте им перейти к следующей записи, прежде чем все поля будут введены с данными.

Еще одна важная деталь - моя форма содержит раскрывающиеся списки во всех полях. Вот почему простое правило проверки данных не работает. (Там уже другие правила и формулы)

А еще возможно ли сделать то, что описано в vba? У меня excel 2017

спасибо!

обновление из ада - 1931 Я, вероятно, делаю что-то не так Я разместил ваш код следующим образом:

     Private Sub Worksheet_Deactivate()
     Dim sh As Worksheet, lastRow As Long, lastCol As Long, 
                                  emptyCells As Range

      Set sh = Worksheets("ClientSatisfactionForm") ' very important to fully 
                                             qualify it (not ActiveSheet)!
      lastRow = sh.Range("A" & Rows.Count).End(xlUp).Row
      lastCol = sh.Cells(1, Columns.Count).End(xlToLeft).Column
     On Error Resume Next
     Set emptyCells = sh.Range(sh.Cells(1, 1), sh.Cells(lastRow, 
                        lastCol)).SpecialCells(xlCellTypeBlanks)
     If Err.Number = 1004 Then
     Err.Clear: On Error GoTo 0: Exit Sub
     End If
   On Error GoTo 0
   If emptyCells.Cells.Count > 0 Then
      MsgBox "There are empty cells, which must be filled: " & 
                                        emptyCells.Address(0, 0)
     sh.Activate: emptyCells.Select
     Exit Sub
   End If
  End Sub

Теперь он не отображает никаких сообщений об ошибках (как это было в предыдущей версии - когда я выполнял при закрытии события), даже если я ввожу пустую строку, теперь он просто спрашивает о сохранении листа ....

PS - всякий раз, когда я меняю событие на «Before Close», этот код работает так же, как и предыдущий. Но все же позволяет выйти из рабочего листа, сохраняя пустые ячейки ..

1 Ответ

1 голос
/ 07 августа 2020

Попробуйте следующий код, пожалуйста:

После редактирования : Теперь sh больше не может быть ActiveSheet! Он должен быть четко оговорен. Значение для использования задействованного имени рабочего листа .

Sub checkEmptyCells()
  Dim sh As Worksheet, lastRow As Long, lastCol As Long, emptyCells As Range
  
  Set sh = Worksheets("Involved sheet name") ' very important to fully qualify it (not ActiveSheet)!
  lastRow = sh.Range("A" & Rows.count).End(xlUp).Row
  lastCol = sh.cells(1, Columns.count).End(xlToLeft).Column
  On Error Resume Next
   Set emptyCells = sh.Range(sh.cells(1, 1), sh.cells(lastRow, lastCol)).SpecialCells(xlCellTypeBlanks)
   If Err.Number = 1004 Then
        Err.Clear: On Error GoTo 0: Exit Sub
   End If
   On Error GoTo 0
  If emptyCells.cells.count > 0 Then
    MsgBox "There are empty cells, which must be filled: " & emptyCells.Address(0, 0)
    sh.Activate: emptyCells.Select
    Exit Sub
  End If
End Sub

В приведенном выше коде предполагается, что нет ячеек с формулами, возвращающими "". В таком случае xlCellTypeBlanks не считает их пустыми ...

Отредактировано :

Чтобы не допустить выхода из обсуждаемого листа, пока все ячейки заполнены, указанное выше Sub (как бы оно ни называлось) должно вызываться просто в событии Worksheet_Deactivate, как показано ниже:

Private Sub Worksheet_Deactivate()
   checkEmptyCells
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...