【发布时间】:2021-10-15 13:54:52
【问题描述】:
我有这样的事情
| A | B |
|---|---|
| Q? | Y or N |
| Number | number or zero |
我想做的是:
如果 B1 = “Y”,则让用户在 B2 中输入一个数字。 如果 B1 = “N”,则将 B2 中的值更改为零,并且不允许用户在 B2 中输入任何数字,除非用户将 B1 的值更改回“Y”。 基本上,当且仅当 B1=”Y” 时,才允许用户在 B2 中输入数字。
到目前为止我做了什么:
- 数据 -> 数据验证 -> 自定义,这是我编写的公式
=OR(AND(B1="Y",ISNUMBER(B2)),AND(B1="N",B2=0))
此解决方案并不理想,因为当 B1 被选为 N 时,它不会将 B2 更改为零。此外,当 B1 更改为 Y 时,它不会强制用户在 B2 中输入新值。
- 我已尝试使用 VBA 解决问题。这是我写的代码
ActiveSheet.Unprotect
Range("B2").Locked = False
If Target.Address = "$B$1" Then
Dim myValue As Variant
If Range("B1").Value = "N" Then
Range("B2").Value = 0
Else
myValue = InputBox("Give me some input")
Range("B2").Value = myValue
End If
End If
Range("B2").Locked = True
ActiveSheet.Protect
End Sub
此解决方案工作正常,只是当代码尝试再次锁定 B2 以防止用户直接在 B2 单元格中输入数字(不使用输入框)时出现错误。另外,我需要添加一些代码来将数据输入限制为数字。
知道如何解决这个问题吗?
PS:我在 SJR 的帮助下成功解决了上述代码
Private Sub Worksheet_Change(ByVal Target As Range)
Worksheets("Sheet1").Unprotect
If Target.Address = "$B$1" Then
Dim myValue As Variant
If Range("B1").Value = "N" Then
Range("B2").Value = 0
Else
myValue = "no"
Do Until IsNumeric(myValue)
myValue = InputBox("Enter a number > 0")
Loop
Range("B2").Value = myValue
End If
End If
Worksheets("Sheet1").Protect
End Sub
【问题讨论】:
-
您不需要锁定或解锁单元格。将 B2 格式设置为锁定,然后您只需要取消保护并保护工作表。然后检查
isnumeric(myvalue)。