在 MsExcel 中,防止在填写所有字段之前输入新记录
Preventing entering new records before all the fields filled, in MsExcel
我在 Excel 有一个作品sheet:
我的目标 - 在我的下拉列表中填写所有字段之前,用户不应该能够继续。
否则 - 在所有字段都输入数据之前,应该出现某种警报,或者只是不让他们继续处理下一条记录。
另一个重要细节 - 我的表单在所有字段中都包含下拉列表
这就是为什么仅简单的数据验证规则不起作用的原因。
(已经有其他规则和公式)
是否仍然可以执行 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
现在,它不会显示任何错误消息(就像在以前的版本中一样 - 当我在关闭事件中执行时),即使我输入空行它现在也只是询问是否保存 sheet... .
PS - 每当我将事件更改为“关闭前”时,此代码与前一个代码一样有效。但仍然让退出 Worksheet 保存空单元格 ..
请尝试下一个代码:
编辑后:现在sh
不能ActiveSheet
了!它必须明确限定。含义使用涉及的工作sheet名称。
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
以上代码假设没有单元格具有 returns "" 的公式。在这种情况下 xlCellTypeBlanks
不认为它们是空的...
已编辑:
为了在讨论中不允许离开sheet,直到所有单元格都被填满,上面的Sub
(无论如何命名)应该在[=16中简单调用=]事件,如下:
Private Sub Worksheet_Deactivate()
checkEmptyCells
End Sub
我在 Excel 有一个作品sheet:
我的目标 - 在我的下拉列表中填写所有字段之前,用户不应该能够继续。
否则 - 在所有字段都输入数据之前,应该出现某种警报,或者只是不让他们继续处理下一条记录。
另一个重要细节 - 我的表单在所有字段中都包含下拉列表 这就是为什么仅简单的数据验证规则不起作用的原因。 (已经有其他规则和公式)
是否仍然可以执行 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
现在,它不会显示任何错误消息(就像在以前的版本中一样 - 当我在关闭事件中执行时),即使我输入空行它现在也只是询问是否保存 sheet... .
PS - 每当我将事件更改为“关闭前”时,此代码与前一个代码一样有效。但仍然让退出 Worksheet 保存空单元格 ..
请尝试下一个代码:
编辑后:现在sh
不能ActiveSheet
了!它必须明确限定。含义使用涉及的工作sheet名称。
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
以上代码假设没有单元格具有 returns "" 的公式。在这种情况下 xlCellTypeBlanks
不认为它们是空的...
已编辑:
为了在讨论中不允许离开sheet,直到所有单元格都被填满,上面的Sub
(无论如何命名)应该在[=16中简单调用=]事件,如下:
Private Sub Worksheet_Deactivate()
checkEmptyCells
End Sub