2017-10-05 591 views
0

我想使第二列中的所有行都是下拉列表。用戶點擊單元格並選擇任何現有名稱。excel VBA如何創建下拉列表

該怎麼辦?

當我運行這段代碼它顯示一個錯誤:

無效的或不合格的參考

代碼:

Sub test() 
Dim i As Integer 
Dim OfficerList(4) As String 

OfficerList(0) = "test1" 
OfficerList(1) = "test2" 
OfficerList(2) = "test3" 
OfficerList(3) = "test4" 
OfficerList(4) = "test5" 

For i = Range("B5000").End(xlUp).Row To 2 
    Select Case VBA.CDate(Cells(i, 2)) 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ 
     Operator:=xlBetween, Formula1:=Join(OfficerList, ",") 
    End Select 
Next 


For i = Range("C5000").End(xlUp).Row To 2 Step -1 'Range upto 5000, chnge this as per your requirment' 

    Select Case VBA.CDate(Cells(i, 3)) 

    Case Is < VBA.Date() 
     Cells(i, 3).Interior.Color = vbGreen 

    Case Is = VBA.Date() 
     Cells(i, 3).Interior.Color = vbYellow 

    Case Is > VBA.Date() 
     Cells(i, 3).Interior.Color = vbRed 

    End Select 
Next 
End Sub 
+0

哪條線顯示錯誤? – Tom

+0

它確實顯示行號只是編譯錯誤與上面輸入的錯誤 –

+0

如果你然後按'調試'上彈出的消息它將突出顯示有錯誤的行 – Tom

回答

0

這似乎並不像Select Case正確的地方:嘗試這取代你的第一個循環

For i = Range("B5000").End(xlUp).Row To 2 Step -1 
    With Cells(i, 2).Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(OfficerList, ",") 
    End With 
Next i 

而不是Select Case,我只是使用With,並確保指定您正在更改單元格的驗證條目,並將環路更改爲包括Step -1(如您的第二個循環)。

+0

我試過你的答案,它沒有使第二列中的所有單元格都成爲下拉列表.....只是第二行顯示下拉列表 –

+0

我們可以看看在你的工作表上?這可能有助於那部分。 –

0

看看這個。我也結合了你的循環。不知道你爲什麼倒退,但我已經離開它

Sub test() 
    Dim i As Long 
    Dim OfficerList(4) As String 

    OfficerList(0) = "test1" 
    OfficerList(1) = "test2" 
    OfficerList(2) = "test3" 
    OfficerList(3) = "test4" 
    OfficerList(4) = "test5" 
    ' Update this with your sheet 
    With Sheet1 
     For i = .Range("B5000").End(xlUp).Row To 2 Step -1 
      With .Cells(i, 2).Validation 
      .Delete 
      .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ 
       Operator:=xlBetween, Formula1:=Join(OfficerList, ",") 
      End With 

      Select Case VBA.CDate(.Cells(i, 3)) 
      Case Is < VBA.Date() 
       .Cells(i, 3).Interior.Color = vbGreen 
      Case Is = VBA.Date() 
       .Cells(i, 3).Interior.Color = vbYellow 
      Case Is > VBA.Date() 
       .Cells(i, 3).Interior.Color = vbRed 
      End Select 
     Next i 
    End With 
End Sub