Excel数据验证以另一个单元格值为条件

时间:2017-02-10 10:32:11

标签: excel excel-vba excel-formula vba

以下是上下文:

Sheet 1 : 
A1 = "50255"
A2 = "Soccer players"
A3 = The cell I'm having a problem with

Sheet 2 :
A1:A5 : List of soccer plays (Ronaldo, Zidane...)

Sheet 3 :
A lot of datas in which I can possibly find my Sheet1!A1 value

我希望能够做到这一点:

If A1<>"" then Vlookup in Sheet 3 and print my value "50255".
If A1="" then diplay the list of possible values you can set for Sheet2!Soccer players (Ronaldo, Zidane...)

问题:我能够在2个不同的单元格中完成这两件事,但我无法在一个单元格中做到我想要的...

总结一下:我希望得到Vlookup的结果或(如果为空)可能值的列表。

我在数据验证方面的尝试:

=SI($E$31<>"";RECHERCHEV($E$31;'1 - Data players'!$G:$XFD;EQUIV('2 - OD'!$E38;'1 - Data players'!$G$6:$EX$6;0);FAUX);indirect($E$38))

英文Excel中的公式:

=IF($E$31<>"",VLOOKUP($E$31,'1 - Data players'!$G:$XFD,MATCH('2 - OD'!$E38,'1 - Data players'!$G$6:$EX$6,0),FALSE),INDIRECT($E$38))
你可以帮帮我吗?

2 个答案:

答案 0 :(得分:2)

Worksheet_Change事件添加到第一个工作单(根据您的上下文),例如Sheet1然后当目标单元格(A1)发生变化时,您可以检查该值,然后

  • 使用A3

  • Range("A3").Validation.Add...添加数据验证
  • 使用您需要的任何内容将公式插入A3

以下示例仅使用一个简单的列表和VLOOKUP范围,您可以根据自己的情况进行调整:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim blnChange As Boolean
    Dim strVlookupFormula As String

    On Error GoTo ExitFunction:

    'vlookup if target is not empty
    strVlookupFormula = "=IFERROR(VLOOKUP($A$1,$E$2:$F$4,2,FALSE),""no match"")"

    'was our cell changed
    blnChange = Not Application.Intersect(Target, Sheet1.Range("A1")) Is Nothing

    If blnChange Then
        'disable events as we are going to update cells
        Application.EnableEvents = False

        'is cell empty
        If IsEmpty(Target.Value) Then

            'remove anything from cell
            Sheet1.Range("A3").ClearContents

            'add data validation to cell
            With Sheet1.Range("A3").Validation

                .Add Type:=xlValidateList, _
                    AlertStyle:=xlValidAlertStop, _
                    Operator:=xlBetween, _
                    Formula1:="=Sheet1!C2:C5"

                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = True
            End With
        Else

            'remove any validation
            Sheet1.Range("A3").Validation.Delete

            'add vlookup formula to cell
            Sheet1.Range("A3").Formula = strVlookupFormula

        End If
    End If

ExitFunction:
    ' re-enable events
    Application.EnableEvents = True

End Sub

A1值的数据验证示例:

enter image description here

具有非空A1值的公式的示例:

enter image description here

答案 1 :(得分:2)

您可以将vlookup公式和验证放在同一个单元格中。唯一的问题是,如果使用下拉列表设置值,则会覆盖公式。为了您的目的,您是否需要在以后返回公式?如果没有,那么以下解决方案可能是合适的。

请注意,要使用其他工作表中的验证,您需要先将范围名称应用于值列表,然后在数据验证中引用范围名称。

我根据你的例子设置了3张。我已经设置了#34;玩家&#34;作为Sheet2上包含播放器名称列表的A1:A3的范围名称。然后我将vlookup公式放入A3:

=IFERROR(VLOOKUP(A1,Sheet3!$A$1:$B$3,2,0),"")

Formula

然后使用List选项将数据验证添加到A3:

=IF($A$1="",Players,"")

Data Validation

如果我清除A1中的值,则会出现下拉菜单:

Dropdown