根据另一个单元格中的值在单元格中创建数据验证

时间:2014-02-13 17:52:30

标签: excel vba excel-vba

我在电子表格中有两列,都是从下拉列表中选取的。

Col A是"您想要更多信息" - 可能的值是\否

Col B是"你是怎么听说我们的?#34; - 可能的值是Email \ Phone \ Other

问题:如果"否"在Col A中选择,然后Col B的值应为N / A,否则用户应该能够从下拉列表中选择并选择一个值。使用下面的公式,我可以显示N / A,但是" false"选项会覆盖任何可用的下拉值或先前选择的值。所以简单地说,如果选择是,则让用户在另一个单元格中选择一个值。如果选择否,则在另一个单元格中显示N / A.关于如何让这个工作的想法?

我当前的公式不起作用(位于单元格A2中):

=IF(A1="No","N/A","Select Value")

3 个答案:

答案 0 :(得分:1)

试试这个:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Cell As Range
    If Target.Column = 1 Then
        Set Cell = Target.Offset(0, 1)
        If Len(Target.Value) = 0 Then
            Cell.Validation.Delete
            Cell.Value = vbNullString
        Else
            If Target.Value = "Yes" Then
                With Cell.Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                    Operator:=xlBetween, Formula1:="=ContactMethod"
                End With
            ElseIf Target.Value = "No" Then
                Cell.Validation.Delete
                Cell.Value = "N/A"
            Else
                MsgBox "Input only Yes or No."
                Target.ClearContents
                Cell.Validation.Delete
            End If
        End If
    End If
End Sub

<强>截图:

如果在A栏中输入Yes(请注意下拉箭头):

enter image description here

如果在A栏中输入No(请注意现在缺少的下拉箭头):

enter image description here

如果在A栏中输入任何其他内容:

enter image description here

此外,如果删除列A的值或将其更改为No,它会安全地删除验证。这样,除非列A具体为Yes,否则无法访问下拉列表。

确保将其粘贴到工作表的模块中(下面屏幕截图中的Sheet9):

enter image description here

如果有帮助,请告诉我们。

答案 1 :(得分:0)

只是为了它的乐趣,因为它不是一个完整的解决方案,需要一个litle vba ...... A1中的Firs ComboBox(是/否),D1:D3(电子邮件/电话/其他),E1(NA)。写为B1列表数据验证的来源:

=CHOOSE(IF(A1="Yes";1;2);D1:D3;E1)

您需要VBA,至少在A1中的值更改时删除B1中的值,如果A1 =否则需要将其更改为“NA”

答案 2 :(得分:0)

这是我的任务的解决方案。 该代码使我们可以根据上一个单元格中经过数据验证的输入来更改一个单元格中的数据验证。

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("L21")) Is Nothing Then
    Worksheets(3).Range("L23").Clear
    Select Case Range("L21")
        Case "x": x_projection
        Case "y": y_projection
        Case "z": z_projection
    End Select

End If
End Sub

Sub x_projection()

    Worksheets(3).Range("L23").Validation.Delete
    Worksheets(3).Range("L23").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                    Operator:=xlBetween, Formula1:="y, z"
    Worksheets(3).Range("L23") = "z"

End Sub

Sub y_projection()

    Worksheets(3).Range("L23").Validation.Delete
    Worksheets(3).Range("L23").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                    Operator:=xlBetween, Formula1:="x, z"
    Worksheets(3).Range("L23") = "x"

End Sub

Sub z_projection()

    Worksheets(3).Range("L23").Validation.Delete
    Worksheets(3).Range("L23").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                    Operator:=xlBetween, Formula1:="x, y"
    Worksheets(3).Range("L23") = "y"

End Sub