从范围获取文本 - VBA(Excel)

时间:2017-08-08 10:15:03

标签: list excel-vba validation user-defined-functions vba

我想仅在一系列单元格中从文本中创建数据验证列表。

我搜索了公式,但我什么也没找到,所以我决定自己创作,但它不起作用。

我尝试了这些代码:

代码1:

Function ListFromRange(rng As Range) As Range

    Dim cl As Range
    Dim entry As Range

    For Each cl In rng
        If Not IsNumeric(cl.Value) Or cl.Value = "" Then
            If entry Is Nothing Then
                Set entry = cl
            Else
                Set entry = Union(entry, cl)
            End If
        End If
    Next

    Set ListFromRange = entry
End Function

代码2:

Function ListFromRange2(rng As Range) As Variant

    Dim cl As Range
    Dim i As Integer
    Dim entry() As String
    ReDim entry(rng.Count)

    For Each cl In rng
        If Not IsNumeric(cl.Value) Or cl.Value = "" Then
            entry(i) = cl.Value
            i = i + 1
        End If
    Next

    ListFromRange2 = entry
End Function

第二个代码正在工作,但是当我使用已定义的名称并使用该定义的名称进行数据验证时,它会告诉我验证列表源中存在错误但是当我使用带索引的函数时它会返回所需的结果

还有一些图片可以解释更多:

Source Range

我想从包含文本的单元格中创建一个列表并在此处应用它:

Target List

但没有数字值。

1 个答案:

答案 0 :(得分:1)

问题是结果范围是多列,不能用作数据验证列表的来源。如果您无法更改选项表的设计以使其只是一列,则需要找到另一种设置验证列表的方法。

这是使用VBA的解决方案。我将它放在一个可以作为宏按需运行的子中,但是您可以将其放入工作表事件中,该事件会在工作表上的数据发生更改或其他事件时触发。

这只会创建验证列表,因为A列中的数据远远不够。您可能希望将其进一步执行,或者如上所述,将其放入工作表事件中,以便更新验证列表添加新行。

我按如下方式设置了工作表,但您也可以下载我的示例here

Basic Price

Example

Option Explicit

Sub Create_Validation_List()
    Dim rngList As Range, cl As Range
    Dim rngValidationList As Range
    Dim strList As String

    Set rngList = Worksheets("BasicPrice").Range("A2:F3")
    strList = ""
    For Each cl In rngList
        If Not IsNumeric(cl.Value) And Not cl.Value = "" Then strList = strList & "," & cl.Value  'Add to our Validation List
    Next cl
    strList = Mid(strList, 2)   'Chop off leading comma

    'Apply Data Validation to this Range (starting at cell C2 and ending at the last row with data in column A)
    Set rngValidationList = Range("C2:C" & Cells(Rows.Count, "A").End(xlUp).Row)

    Application.EnableEvents = False
    With rngValidationList.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=strList                  'Pass in Validation List created above
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    Application.EnableEvents = True
End Sub

如果您有任何问题,请与我们联系。