2017-08-08 151 views
0

我想仅在单元格范围内根据文本创建数据验证列表。从范围获取文本-VBA(Excel)

我搜索了配方,但我没有找到任何东西,所以我决定做我自己的功能,但它不工作。

我试图这些代码:

代码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

但是,如果没有数量值。

+0

我想你想让你'如果'语句实际上是'如果不是数字(cl.Value)而不是cl.Value =“”然后'。如果你不包括你的逻辑,那么'Not'单独适用于每个语句。在第一行也返回'Range'而不是'Variant'。最后,*你想要做什么**做***?你其实没有说过。目前你的函数返回一个包含非数字值的单元格区域......为什么这是错误的/你还希望它做什么? – Wolfie

+0

验证列表对我的UDF不起作用,您在图像中看到的是对整行的验证,因此包含数值。 – Tima

+0

好的,你是否按照上面的建议更新了你的逻辑?那你确定你正在清理并更新下拉列表中的值吗?IsNumeric(“12,300”)没有办法返回false,所以你的逻辑没问题,它必须是你没有显示哪个失败的其他代码。 – Wolfie

回答

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 

让我知道如果您有任何问题。

+0

这很有趣,但我不能将'基本价格 - 品牌'范围放在另一张表中,实际上这个范围必须与我试图制作数据的表格相邻验证列表和它们的行数是相同的,同样,表中的每一行都有一个数据验证列表,用于“基本价格 - 品牌”范围内同一行中的品牌,而不是整行范围内的行,无论如何,我明白了您的观点代码并将根据我的需要进行一些调整。谢谢 – Tima

+1

当然,您可以将基本价格品牌范围放在任何需要的地方,只需将范围重定向到代码中的该位置即可。让我知道你是否需要任何帮助。 –