基于下拉列表响应的条件数据验证

时间:2015-10-29 20:26:13

标签: excel vba excel-vba

我正在使用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

2 个答案:

答案 0 :(得分:0)

您的Target被定义为范围(ByVal Target as Range)。尝试使用If (Target.Value = "No") Or (Target.Value = "N/A") Then

替换if语句

编辑:嗯,我只是在使用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}因为我发现这些更能代表您正在使用的条件类型。