2015-06-19 59 views
2

所以我有一次数据验证单元格更改为三个不同的命名范围之一基于另一个单元格中的用户选择。我需要的是,当用户选择某个值,即“选择A”时,数据验证不仅会改变到相应的命名范围,而且还会显示该范围内的第一个值。VBA数据验证默认值从命名范围

目前我可以操作代码来获取默认值,但是每次尝试并做出选择时,它都会一直变回默认值。这甚至有可能吗?下面是我的代码,我在一次特定的命名范围内使用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

您应该在您的事件处理代码中禁用事件,因为您正在更改单元格。相关:http://stackoverflow.com/questions/13860894/ms-excel-crashes-when-vba-code-runs/13861640#13861640 –

+0

@Byron好抓,加我的回答 –

回答

1

在下面的例子我在小区Sheet 1中的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,没有它会使自己在执行中触发。

+0

工程就像一个魅力!非常感谢您的帮助! – tbg0001