将单元格数据validation设置为dynamic范围的列表

我正在尝试使用VBAmacros从存储在我的工作表中的列表中设置单元格数据validation。 我不知道列表会有多长时间,所以需要dynamicselect范围。

此时,.Addtypes:= 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 

我已经看到以下两个问题已经问,但一直没能得到任何的工作build议:

在Excel中通过VBA进行validation在使用variables时失败

在MS-Excel中保护工作表时,如何避免运行时错误?

感谢任何帮助。

范围是一个类,所以最好不要把它用于variables名。 其次Formula1:=需要参数作为一个string,所以我已经使用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