【问题标题】:Setting cell data validation as list from a variable list将单元格数据验证设置为变量列表中的列表
【发布时间】:2014-09-10 03:10:53
【问题描述】:

我对 VBA 很陌生,我一步一步地拼凑我的发展,在网上搜索答案,但遇到了障碍。

我很难理解数据验证列表代码的创建是如何工作的。开头的“With WrkBook.Range("H3").Validation”是我放置下拉列表的地方?从一个帖子中似乎是“是”,但另一个帖子似乎有“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

【问题讨论】:

    标签: vba excel


    【解决方案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.

    Edit2:基于cmets,无需Split功能

    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包括完整路径。
    但是,如果您将其分配给验证公式,它会自动忽略工作簿名称。
    所以没有必要使用Split Function。那就不用担心撇号了。 HTH。

    【讨论】:

    • 实际上它是同一个工作表,现在,因为我试图保持简单以使其工作。但这将是一个不同的工作表,我将进行数据验证,非常感谢。但无论哪种情况,我都会得到这个:i.imgur.com/Op07yV8.png
    • 好的,去掉“.”现在得到这个(当我调试时它突出显示公式行和上面的行):i.imgur.com/rWpvpmW.png
    • @james9487 Range("A1") 应该是 ListRng。我的错。我也在最后对其进行了测试,并且使用的是普通的 Range 地址,而不是分配变量。
    • 同样的错误:i.imgur.com/N2XnH6K.png 你能解释一下我在哪里指定数据验证列表的插入位置吗(我希望它在我的“摘要”工作表的单个单元格中)?
    • @james9487 不,您将其放入工作表“Misc Ref”的 WrkBook 工作表中。它应该在我的最终工作,尝试和测试。无论如何,我会尝试为您重写整个代码。
    猜你喜欢
    • 2013-07-07
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多