我想仅在一系列单元格中从文本中创建数据验证列表。
我搜索了公式,但我什么也没找到,所以我决定自己创作,但它不起作用。
我尝试了这些代码:
代码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
第二个代码正在工作,但是当我使用已定义的名称并使用该定义的名称进行数据验证时,它会告诉我验证列表源中存在错误但是当我使用带索引的函数时它会返回所需的结果
还有一些图片可以解释更多:
我想从包含文本的单元格中创建一个列表并在此处应用它:
但没有数字值。
答案 0 :(得分:1)
问题是结果范围是多列,不能用作数据验证列表的来源。如果您无法更改选项表的设计以使其只是一列,则需要找到另一种设置验证列表的方法。
这是使用VBA的解决方案。我将它放在一个可以作为宏按需运行的子中,但是您可以将其放入工作表事件中,该事件会在工作表上的数据发生更改或其他事件时触发。
这只会创建验证列表,因为A列中的数据远远不够。您可能希望将其进一步执行,或者如上所述,将其放入工作表事件中,以便更新验证列表添加新行。
我按如下方式设置了工作表,但您也可以下载我的示例here。
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
如果您有任何问题,请与我们联系。