将单元格数据验证设置为变量列表中的列表

时间:2014-09-10 03:10:53

标签: excel vba excel-vba

对于VBA而言,这是一个很新的事情,我正在将我的发展拼凑在一起,在网上寻找答案但是遇到了麻烦。

我很难理解数据验证列表代码的创建是如何工作的。开始"使用WrkBook.Range(" H3")。验证"是我放下拉列表的地方?似乎'是'从一个帖子,但另一个似乎有" With"后跟包含列表的实际范围。其次," Formula1:= ......"我相信也是列表的位置。但是,我似乎只能将列表中包含的第一个单元格包含在列表中。提前感谢您的帮助。

Dim WrkBook As Worksheet
Dim LastCellRowNumber As Integer
Dim ListRng As Range
Dim Rng As Range

Set WrkBook = Worksheets("Misc Ref")

'Find
WrkBook.Activate
Range("A100000").Select
Range(Selection, Selection.End(xlUp)).Select

LastCellRowNumber = ActiveCell.Row

ActiveSheet.Cells(LastCellRowNumber, 1).Select

    Set ListRng = WrkBook.Range(Cells(2, 1), Cells(LastCellRowNumber, 1))

    With WrkBook.Range("H3").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=WrkBook.ListRng
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

1 个答案:

答案 0 :(得分:1)

在这一行:

 Set ListRng = WrkBook.Range(Cells(2, 1), Cells(LastCellRowNumber, 1))

您已经设置或指定了WrkBook工作表对象中引用的范围对象 因此,您不必在分配 Formula1 参数时使用WrkBook.ListRng
此外, Formula1 参数被假定为字符串形式的源范围的地址。

所以它应该是这样的:

Formula1:= "=" & ListRng.Address

如果放置验证列表的工作表与源列表的工作表不同,则会失败。所以你可能想要添加:

Formula1:= "=" & ListRng.Address(, , xlA1, True)

这也将为您提供工作表名称。 HTH。

编辑2:根据评论而无需使用拆分功能

Sub test()
    Dim r As Range, lrow As Long
    With Sheets("Misc Ref")
        lrow = .Range("A" & .Rows.Count).End(xlUp).Row
        Set r = .Range("A2:A" & lrow)
    End With
    'Debug.Print "=" & r.Address(, , xlA1, True)
    With Sheets("Summary").Range("H10").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=" & r.Address(, , xlA1, True)
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
End Sub

地址属性外部参数设置为True包括完整路径。
但是,如果将其分配给验证公式,它会自动忽略工作簿名称 因此无需使用 拆分功能 。那么无需担心撇号。 HTH。