VBA数据validation从命名范围默认值

所以我有一个单元格中的数据validation,根据另一个单元格中的用户select更改为三个不同命名范围之一。 我需要的是,当用户select一个特定的值,即“selectA”时,数据validation不仅会改变到相应的命名范围,而且还会显示该范围内的第一个值。

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

在下面的示例中,我在Sheet1的单元格A1中创build一个validation列表。 列表中的条目列在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中的内容创build一个新列表。 我认为E3本身应该是一个validation列表,所有的可能性都应该在工作表变更事件中performance出来。

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