2013-07-10 62 views
3

我想從使用VBA宏存儲在我的工作表中的列表中設置單元格數據驗證。我不知道列表會有多長時間,所以需要動態選擇範圍。將細胞數據驗證設置爲動態範圍列表

此刻行.Add類型:= Formula1:=「= perfGradeRange」正在引發運行時錯誤'1004'應用程序定義或對象定義的錯誤。

我的代碼是這樣的:

Sub Perf_Grade_Dropdown() 

Dim perfGradeData As Worksheet 
Dim usedRange As range 
Dim rLastCell As range 
Dim range As range 
Dim perfGradeRange As range 

Set perfGradeData = Worksheets("Values") 

perfGradeData.Unprotect Password:="pass" 

perfGradeData.Activate 

Set rLastCell = perfGradeData.Cells.Find(What:="*", After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:= _ 
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False) 

Set perfGradeRange = perfGradeData.range(Cells(1, 1), rLastCell) 

Set range = perfGradeData.range(Cells(3, 3), Cells(4, 3)) 

    With range.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
    xlBetween, Formula1:="=perfGradeRange" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
End With 

perfGradeData.Protect Password:="pass", DrawingObjects:=True, contents:=True,   Scenarios:=True, userinterfaceonly:=True, _ 
AllowSorting:=True, AllowFiltering:=True, AllowDeletingColumns:=True, AllowInsertingColumns:=True 
perfGradeData.EnableAutoFilter = True 

End Sub 

我見過已經提出以下兩個問題,但一直沒能得到任何的建議的工作:

Setting validation via VBA in excel fails when using variable

How do I avoid run-time error when a worksheet is protected in MS-Excel?

感謝任何幫助。

回答

3

範圍是一個類,所以最好不要將它用於變量名。其次Formula1:=需要參數作爲字符串,所以我用perfGradeRange.Cells(1)

Sub Perf_Grade_Dropdown() 

     Dim perfGradeData As Worksheet 
     Dim usedRange As range 
     Dim rLastCell As range 
     Dim rng As range 
     Dim perfGradeRange As range 

     Set perfGradeData = Worksheets("Values") 

     perfGradeData.Unprotect Password:="pass" 

     perfGradeData.Activate 

     Set rLastCell = perfGradeData.Cells.Find(What:="*", After:=Cells(1, 1), LookIn:=xlFormulas, LookAt:= _ 
               xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False) 

     Set perfGradeRange = perfGradeData.range(Cells(1, 1), rLastCell) 

     Set rng = perfGradeData.range(Cells(3, 3), Cells(4, 3)) 

     With rng.Validation 
      .Delete 
      .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=perfGradeRange.Cells(1) 
      .IgnoreBlank = True 
      .InputTitle = "" 
      .ErrorTitle = "" 
      .InputMessage = "" 
      .ErrorMessage = "" 
      .ShowInput = True 
      .ShowError = True 
     End With 


     perfGradeData.Protect Password:="pass", DrawingObjects:=True, contents:=True, Scenarios:=True, userinterfaceonly:=True, _ 
           AllowSorting:=True, AllowFiltering:=True, AllowDeletingColumns:=True, AllowInsertingColumns:=True 
     perfGradeData.EnableAutoFilter = True 

    End Sub 
+0

這幾乎可以工作,但這意味着我的下拉列表只包含第一個單元格中的值,我如何將其更改爲包含範圍內所有單元格的值? – db579

+0

你的意思是這樣的:Formula1:= range(「perfGradeRange」)。Address?這再次給我1004運行時錯誤 – db579

+1

@ db579使用Formula1:=「=」&perfGradeRange.Address – Santosh