2015-11-13 18 views
2

我使用以下代码在Excel中动态更改验证列表。我们的想法是,当其他价值变动则列表应,例如,包含三个项目,而不是五(前两个是走了):如何将一个动态更改的验证列表重置为第一项?

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim ToS, CoC As String 
Dim HoC, HoR As Single 

ToS = Range("B4").Value 
CoC = Range("B12").Value 
HoC = Range("B10").Value 
HoR = Range("B11").Value 

With Range("B6") 
    With .Validation 
     .Delete 
     If ToS = "CMSA" Then 
      If HoC <= 7.6 Then 
       If HoR > 10.7 Then 
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$3:$V$3" 
       Else 
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$1:$V$3" 
       End If 
      ElseIf CoC = "III" Or CoC = "IV" Then 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$3:$V$3" 
      Else 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$1:$V$3" 
      End If 
     ElseIf ToS = "ESFR" Then 
      If HoR > 10.7 And HoR <= 12.2 Then 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$7:$V$9" 
      ElseIf HoR > 9.1 And HoR <= 9.8 And HoC > 6.1 And HoC <= 7.6 Then 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$6:$V$7" 
      ElseIf HoR > 12.2 And HoR <= 13.7 And HoC > 7.6 And HoC <= 12.2 Then 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$7:$V$9" 
      Else 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$6:$V$9" 
      End If 
     Else 
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$6:$V$9" 
     End If 
    End With 
End With 

End Sub 

的问题是,我想它会自动被重置为列表中的第一项。该列表正在从同一工作表中的某一行中的某些其他单元获取数据。

我该怎么做?

我需要添加哪些代码?

我试过在...formula1:=命令之后添加类似Range("B6").Value= "the value I want"的命令,但它不起作用。

+1

这很可能没有使用VBA - 您是否将VBA用于项目的不同部分?因为如果这意味着工作簿是免费的,那么在此避免它会很有用。有关如何在没有VBA的情况下执行此操作的示例,请参阅http://stackoverflow.com/q/31948083/5090027。 –

+0

非vba答案给出[这里](http://stackoverflow.com/questions/33697154/change-sheet-source-dynamically)。就在今天上午我可能会补充一点 –

回答

0

虽然我有级“呃,”培根&斯科特在他们的意见达成一致,我认为正在寻求简直像下面:

(这是我认为你只是想添加一个行更改值是在数据验证列表中的第一个值)

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim ToS, CoC As String 
Dim HoC, HoR As Single 

ToS = Range("B4").Value 
CoC = Range("B12").Value 
HoC = Range("B10").Value 
HoR = Range("B11").Value 

With Range("B6") 
    With .Validation 
     .Delete 
     If ToS = "CMSA" Then 
      If HoC <= 7.6 Then 
       If HoR > 10.7 Then 
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$3:$V$3" 
        .Value=Range("$V$3").Value 
       Else 
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$1:$V$3" 
        .Value=Range("$V$1").Value 
       End If 
      ElseIf CoC = "III" Or CoC = "IV" Then 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$3:$V$3" 
        .Value=Range("$V$3").Value 
      Else 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$1:$V$3" 
        .Value=Range("$V$1").Value 
      End If 
     ElseIf ToS = "ESFR" Then 
      If HoR > 10.7 And HoR <= 12.2 Then 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$7:$V$9" 
        .Value=Range("$V$7").Value 
      ElseIf HoR > 9.1 And HoR <= 9.8 And HoC > 6.1 And HoC <= 7.6 Then 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$6:$V$7" 
        .Value=Range("$V$6").Value 
      ElseIf HoR > 12.2 And HoR <= 13.7 And HoC > 7.6 And HoC <= 12.2 Then 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$7:$V$9" 
        .Value=Range("$V$7").Value 
      Else 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$6:$V$9" 
        .Value=Range("$V$6").Value 
      End If 
     Else 
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
        xlBetween, Formula1:="=$V$6:$V$9" 
        .Value=Range("$V$6").Value 
     End If 
    End With 
End With 

End Sub 

但同样我想你会过得更好处理数据验证,因为他们认为,也许只是使用VBA来改变细胞的值。

相关问题