在VBA中创建验证列表
我不明白为什么这不起作用。我有一个子例程,它根据另一张Excel工作表上的数据构建验证列表。 我有类似的子程序,可以正常工作,但不是这个 如果我改变在VBA中创建验证列表,vba,excel,Vba,Excel,我不明白为什么这不起作用。我有一个子例程,它根据另一张Excel工作表上的数据构建验证列表。 我有类似的子程序,可以正常工作,但不是这个 如果我改变 ReDim CatsValidationList(catsArray.Count) 到 或者任何数字,那么它工作正常。我知道catsArray已填充,还有一个catsArray.Count的数字。 那么,在调整阵列大小时,我遗漏了什么?希望有人能帮忙。 潜艇的完整代码在这里 Sub all_cats() 'Set some variab
ReDim CatsValidationList(catsArray.Count)
到
或者任何数字,那么它工作正常。我知道catsArray已填充,还有一个catsArray.Count的数字。
那么,在调整阵列大小时,我遗漏了什么?希望有人能帮忙。
潜艇的完整代码在这里
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
与
公共CatsValidationList()作为变量
在顶端
我试着在sub中声明它,我试着给变量赋值。但它并不快乐
提前谢谢
它是我编写的一个更大程序的一部分,该程序在主数据集中的一个小关键字列表中编译匹配关键字的验证列表。匹配关键字的sub工作得很好,我正试图以同样的方式为所有_猫编写sub。它具有一个调整大小的数组。。。
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 sub中不是必需的。
但是有些地方缺少了一些东西,因为我无法用
ReDim CatsValidationList(catsArray.Count)
除非我输入一个具体的数字
ReDim CatsValidationList(190)
这是不好的,因为完整的列表经常会改变
我很困惑……(正如在评论中指出的,问题在于验证列表的长度,而不是其他任何东西。因此我采纳了使用范围而不是构建数组来填充列表的建议。它现在可以正常工作了。(感谢Rory) 对于那些来到这里寻找类似问题的类似解决方案的人,我修改了验证位以包括 .Add类型:=xlValidateList,AlertStyle:=xlValidAlertStop_ 运算符:=xlBetween,公式1:=“=”&类别列表 变量category_列表引用另一个名为All Cats的工作表中的范围。 类别列表=“‘所有类别’!B2:B”&类别结束行 下面是我的sub的完整代码,供其他人参考,并将上面的内容放到上下文中。我相信还有其他更干净、更高效的编写方法,但目前这对我来说还可以。谢谢
'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
您这样做的原因是因为类别列表是动态的,每次都有或多或少的值吗?如果是这样,您可以完全摆脱VBA并使用a作为列表值。问题似乎在于
对于xx=1进行UBound(CatsValidationList)
(可能还有其他).CatsValidationList是一个基于零的数组,您正在使用基于1的计数重新命名它并进行下一步操作。可能只需将选项Base 1
放在模块页面的顶部。请参见.FYI,使用逗号分隔字符串时,验证列表长度的限制为255个字符。如果使用列表集越长,就会出现错误。最好使用一个范围。一般来说,如果在错误恢复下一步时使用,
请确保在错误转到0
或类似值时尽快将其关闭。尝试使用重拨CatsValidationList(catsArray.Count)时收到的错误消息是什么
?感谢您的所有评论和建议。经过一点测试,我发现它实际上是您提到的验证列表长度,Rory。因此,我将研究使用范围。谢谢
'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