【问题标题】:Setting cell data validation as list from dynamic range将单元格数据验证设置为动态范围的列表
【发布时间】:2013-07-07 20:47:01
【问题描述】:

我正在尝试使用 VBA 宏从存储在我的工作表中的列表中设置单元格数据验证。我不知道列表会有多长,所以需要动态选择范围。

目前 .Add Type:= 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?

感谢任何帮助。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    Range 是一个类,所以最好不要将它用于变量名。其次,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
    

    【讨论】:

    • 这几乎可以工作,但这意味着我的下拉列表只包含第一个单元格中的值,我该如何更改它以包含该范围内所有单元格的值?
    • @db579 使用公式 1:="=" & perfGradeRange.Address
    • 这给了我作为下拉值的范围,而不是范围内容。所以我的下拉菜单有 $A$1:$A$4 选项
    • @db579 使用公式 1:="=" & perfGradeRange.Address。它对我有用。
    • 完美!非常感谢您的耐心和帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多