2015-06-19 60 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