VBA数据验证到命名范围的默认值

时间:2015-06-19 18:18:26

标签: excel vba excel-vba

因此,我在一次单元格中进行数据验证,根据另一个单元格中的用户选择,该单元格将更改为三个不同命名范围之一。我需要的是当用户选择某个值时,即"选择A",数据验证不仅会改变到相应的命名范围,还会显示该范围内的第一个值。

目前我可以操纵代码来获取默认值,但是每次尝试进行选择时它都会不断变回默认值。这甚至可能吗?以下是我目前使用Worksheet_Change事件为特定命名范围运行的代码

在此示例中,我使用了命名范围selection_a

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("$E$3").Value = "Selection A" Then
    With Range("L3:R4").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=selection_a"
        .IgnoreBlank = False
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    End If

默认值显示并不断更改:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("$E$3").Value = "Selection A" Then
    Range("$L$3").Value = Sheets("sheet2").Range("$M$4").Value    
    With Range("L3:R4").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=selection_a"
        .IgnoreBlank = False
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    End If

1 个答案:

答案 0 :(得分:1)

在下面的示例中,我在Sheet1的单元格A1中创建了一个验证列表。列表的条目列在K7到K9中。

With Sheet1("A1").Validation
    .delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=Sheet1!$K$7:$K$9"
End With

我会使用这种格式,因为我更喜欢它。现在问你的问题:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Sheet1.Range("E3")) Then 'checks that E3 is the one that changed
        Application.EnableEvents = false
        If Range("$E$3").Value = "Selection A" Then 'list A
             With Sheet1("A1").Validation
               .delete
               .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                  xlBetween, Formula1:="=Sheet1!$K$7:$K$9" 'cells for list A
             End With
        ElseIf Range("$E$3").Value = "Selection B" Then' list B                 
             With Sheet1("A1").Validation
               .delete
               .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                  xlBetween, Formula1:="=Sheet1!$K$7:$K$9" 'cells for list B
             End With

        End if
    End if
    Application.EnableEvents = true

End sub

我很确定我的细胞错了,但按照我放弃的例子,选择正确的细胞! 现在当E3改变时,它将根据E3中的内容创建一个新列表。在我看来,E3本身应该是一个验证列表,所有可能性都应该在工作表更改事件中表示。

编辑:我在看到拜伦的评论之后添加了EnableEvent = False,但没有它会在执行中自行解决。