在VBA中创建验证列表

时间:2016-01-05 13:28:01

标签: vba excel-vba excel

我无法弄清楚为什么这不起作用。我有一个子程序,它从另一个Excel工作表上的数据构建验证列表。 我有类似的子程序,可以正常工作但不是这个。

如果我改变

    ReDim CatsValidationList(catsArray.Count)

    ReDim CatsValidationList(100)

或任何数字,然后它工作正常。我知道catsArray已经填充,而且还有一个catsArray.Count的数字。 那么在调整数组大小时,我错过了什么?希望有人可以提供帮助。 sub的完整代码在这里......

Sub all_cats()

'Set some variables
Dim category_list As Range
Dim catRng() As Variant
Dim catsArray As New Collection

'Empty
Range("D15:D1000").Clear
Range("F15:F1000").Clear

'Set range of data
Set category_list = Worksheets("All Cats").Range("B1", Worksheets("All Cats").Range("B10000").End(xlUp))
catRng = category_list

'Populate array with data
On Error Resume Next
For Each ct In catRng
catsArray.Add ct
Next

'Resize array
ReDim CatsValidationList(catsArray.Count)

'Populate array for validation list
For xx = 1 To UBound(CatsValidationList)
CatsValidationList(xx) = Worksheets("All Cats").Range("B" & xx).Value
Next xx

'Build validation list
With Range("D15").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
    Operator:=xlEqual, Formula1:=Join(CatsValidationList, ",")
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = False
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With

End Sub

使用     Public CatsValidationList()As Variant 在顶部

我已经尝试在sub中声明它,我尝试将数字分配给变量。但它并不开心。

提前致谢

它是我编写的一个较大程序的一部分,它编写了来自主数据集的小关键字列表中匹配关键字的验证列表。匹配关键字的子工作正常,我试图以相同的方式为all_cats编写子。它具有调整大小的阵列......     ReDim ValidationList1(stylecats_exact.Count) 还有一点寻找匹配的单词并将它们添加到数组

If child_cat_exact > 0 Then
stylecats_exact.Add Trim(Worksheets("All Cats").Range(catlist_index & cat_item.Row).Value) & " [" & Worksheets("All Cats").Range(catid_index & cat_item.Row).Value & "]"
Else

在all_cats子中不需要。 但是某些地方缺少某些东西,因为我无法用

填充CatsValidationList
ReDim CatsValidationList(catsArray.Count)

除非我输入特定数字

ReDim CatsValidationList(190)

这不好,因为完整列表经常会改变。

我感到困惑...... :(

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的,问题在于验证列表的长度而不是其他任何内容。所以我接受了使用范围的建议,而不是构建一个数组来填充列表。它现在工作正常。 (谢谢罗里) 对于那些来到这里寻找类似问题的类似解决方案的人,我修改了验证位以包含        .Add Type:= xlValidateList,AlertStyle:= xlValidAlertStop,_         运算符:= xlBetween,Formula1:=“=”& category_list

变量category_list引用另一个名为All Cats的工作表的范围。     category_list =“'All Cats'!B2:B”& cat_end_row

我的sub的完整代码如下所示,供其他人参考,并将上述内容放入上下文中。我确信还有其他方法可以更清晰,更有效地编写它,但是现在这对我来说还可以。谢谢StackOverflow

'Set some variables
Dim category_list As String
Dim catRng() As Variant
Dim catsArray As New Collection
Dim cat_end_row As Integer

'Empty
Range("D15:D1000").Clear
Range("F15:F1000").Clear

'Find end row
cat_end_row = Worksheets("All Cats").Range("B1000000").End(xlUp).Row

'Set range of data
category_list = "'All Cats'!B2:B" & cat_end_row

'Build validation list
With Range("D15").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
    Operator:=xlBetween, Formula1:="=" & category_list
    .IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = False
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With