我正在使用Microsoft Excel 2013 for Windows。我正在尝试使用不同线程(Allow cell population according to other cell's contents)中提供的VBA代码设置数据验证,但遇到了问题。
我在工作表的E栏中设置了数据验证列表,列表选项为"是","否"," N / A"。如果用户选择"否"或者" N / A",我想" N / A"自动出现在F列中并使单元格无法编辑。如果用户选择"是",那么我希望列F被解锁并且用户能够输入数字(任何数字)。
以下是我在VBA中使用的代码。当我运行它时,我得到并且错误突出了代码行" If(Target =" No")或(Target =" N / A")然后&# 34;和一个说'#34; Type Mismatch"的方框。有什么建议?非常感谢!
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect Password:="Your Password"
Application.EnableEvents = False
If Not Intersect(Range("E:E"), Target) Is Nothing Then
If (Target = "No") Or (Target = "N/A") Then
Target.Offset(0, 1).Validation.Delete
Target.Offset(0, 1) = "n/a"
Target.Offset(0, 1).Locked = True
Else
Target.Offset(0, 1).Locked = False
End If
End If
Application.EnableEvents = True
ActiveSheet.Protect Password:="Your Password"
End Sub
答案 0 :(得分:0)
您的Target
被定义为范围(ByVal Target as Range
)。尝试使用If (Target.Value = "No") Or (Target.Value = "N/A") Then
编辑:嗯,我只是在使用Target
时没有收到错误。如果你在该行放置一个换行符(光标在行中,按F9键),当你更改E列中的值时会发生什么?我怀疑它与正在使用的数据验证有关。
Edit2:嗯,它也适用于我的数据验证。您可以发布一些相同的数据,或者列E(相关区域)的屏幕截图吗?
答案 1 :(得分:0)
我可以重现错误的唯一方法是使用粘贴操作或通过在多个单元格中键入值并使用 Ctrl + 结束更改E列中的多个值Enter↵。以下内容将处理多项更改。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("E:E"), Target) Is Nothing Then
On Error GoTo bm_safe_exit
Application.EnableEvents = False
Me.Unprotect Password:="Your Password"
Dim rng As Range
For Each rng In Intersect(Range("E:E"), Target)
Select Case LCase(rng.Value2)
Case "no", "n/a"
rng.Offset(0, 1).Validation.Delete
rng.Offset(0, 1) = "n/a"
rng.Offset(0, 1).Locked = True
Case "yes"
rng.Offset(0, 1).Locked = False
Intersect(Range("E:E"), Target).Cells(1).Offset(0, 1).Select
Case Else
'cannot be here. do nothing
End Select
Next rng
End If
bm_safe_exit:
If Not Application.EnableEvents Then
Me.Protect Password:="Your Password"
Application.EnableEvents = True
End If
End Sub
我已经重新组织了代码中的一些行,并且只有在列E中的更改或更改时才进行取消保护和事件禁用过程。我还将If ...
语句替换为{{3}因为我发现这些更能代表您正在使用的条件类型。