点击MsgBox确定按钮后,恢复指定单元格至之前有效值的VBA需求
实现Excel VBA单元格输入无效时自动恢复至之前有效值
我明白你的需求啦——现在的代码只能提示输入错误,但得手动重新输入,你想要点击提示框的确定后,直接把单元格变回之前的有效内容对吧?
要实现这个功能,核心是提前记录单元格的原始有效值,因为当Worksheet_Change事件触发时,单元格已经变成新的无效值了,所以我们需要在用户开始编辑这个单元格前就把旧值存下来。
下面是修改后的完整代码,直接放到你的工作表模块里就行:
' 模块级变量,用来存储Range("x")的原始有效值 Private originalXValue As Variant Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 当选中Range("x")时,记录它当前的值 If Target.Address = Range("x").Address Then originalXValue = Range("x").Value End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) ' 只处理Range("x")的修改 If Target.Address = Range("x").Address Then ' 判断输入内容是否无效:既不是数字,也不是"Not relevant" If Not IsNumeric(Range("x").Value) And InStr(1, Range("x").Value, "Not relevant", vbTextCompare) = 0 Then ' 弹出错误提示 MsgBox "Please enter a number", vbCritical, "Distance between point loads, x-direction" ' 关闭事件触发,避免恢复值时再次触发Change事件 Application.EnableEvents = False ' 将单元格恢复到之前的有效值 Range("x").Value = originalXValue ' 重新开启事件触发 Application.EnableEvents = True End If End If End Sub
代码细节说明:
originalXValue:模块级变量,专门用来存储Range("x")的原始值,只要用户选中这个单元格,就会自动更新记录的内容Worksheet_SelectionChange:用户选中单元格时触发,这里仅在选中目标单元格时记录当前值,避免不必要的存储操作Application.EnableEvents = False:恢复单元格值时必须关闭事件触发,否则设置值的操作会再次触发Worksheet_Change事件,导致死循环vbTextCompare:在InStr中加入这个参数,让大小写不同的"not relevant"也能被识别,提升输入的灵活性
这样设置后,只要用户输入无效内容,弹出提示点击确定后,单元格就会立刻变回之前的有效内容啦!
内容的提问来源于stack exchange,提问作者DFH
相关产品推荐
相关产品推荐

