【问题标题】:Excel Validation list created from a large array从大型数组创建的 Excel 验证列表
【发布时间】:2015-06-05 14:37:38
【问题描述】:

目标 我必须为用户创建一个下拉列表以滚动并选择一个项目。这些项目是公司的合同,存储在我们的目录中。有成千上万。

尝试 我的第一次尝试是使用一个子目录,它遍历我们的目录并将每个合约文件夹的名称写入column L on sheet f_param。然后我使用以下代码创建验证列表:

With f_param.Range("cell_titreprojet").Validation
    .delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=Paramètres!$L$3:$l$1406"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With

效果很好,但我觉得将名称存储在array 中,然后直接使用arrayvalues 填充列表会更好。

我用这篇文章作为参考:Excel Validation Drop Down list using VBA

我成功地使用以下代码从包含 10 个项目的目录创建了验证列表:

Sub Example2()
Dim objFSO As Object
Dim objFolder As Object
Dim objSubFolder As Object
Dim i As Integer
Dim liste() As String


'Create an instance of the FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Get the folder object
Set objFolder = objFSO.GetFolder("O:")
i = 0
'loops through each file in the directory and stores their path
For Each objSubFolder In objFolder.subfolders
    If IsNumeric(Left(objSubFolder.Name, 1)) Then
        'print folder path
        ReDim Preserve liste(i)
        i = i + 1
    End If
Next objSubFolder


With Feuil2.Range("A1").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
        Operator:=xlBetween, Formula1:=Join(liste, ",")
End With
End Sub

问题

当我从目录 O:(测试过的 10 个文件夹)更改为 H:(这是我想要的那个)时,array 被正确填充(我在column 中打印了 1403 个文件夹名称到检查),但我在创建列表期间收到了error(使用之前发布的相同代码,该代码适用于较小的数组)。有谁知道为什么?

编辑:错误是 1004(大致翻译自法语):由应用程序或对象定义的错误。

【问题讨论】:

  • 如果没人能回答,请随时帮我做第一种方式(将名称存储在隐藏列中并使用它来填充列表)。我只需要了解如何引用命名单元格(而不是从 L3 填充到 L X 我想从命名单元格填充到列表末尾。)
  • 您收到什么错误消息以及来自哪一行?
  • 错误为 1004(大致翻译自法语):由应用程序或对象定义的错误。我将它添加到问题中。它发生在.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=Join(liste, ",")
  • 起初我以为是因为一个列表不能那么长,但由于我成功创建它时它来自 excel 工作表值(我放在 L 列中的那些),那不会是问题。

标签: vba excel


【解决方案1】:

This page 表示根据列表的构建方式有不同的限制。

数据验证下拉列表中显示的项目数量存在限制:该列表最多可显示工作表上列表中的 32,767 个项目。如果您在数据验证对话框(分隔列表)中键入项目,则限制为 256 个字符,包括分隔符。 如果您需要更多的项目,您可以创建一个相关的下拉列表,按类别细分。

【讨论】:

  • 使用数组填充是否属于“在数据验证框中键入”类别?这似乎不太可能。无论哪种方式,以他们显示的方式创建一个依赖下拉列表确实不符合我的需求,因为合同的数量(列表的长度)会有所不同。我可以使用 VBA 从工作表中的值生成列表 - 如果我知道如何从这种类型的命令中引用不同的范围:Formula1:="=Feuil2!$A$3:$A$10" 而不是从A3A10 我可以引用一个命名的单元格,并且另一个命名的单元格。你知道怎么做吗?
  • 我认为您可以使用“工作表 f_param 上的 L 列”使其正常工作,还是有问题?
  • 使用数组填充它会创建一个文本列表,其方式与键入数据的方式相同,因此我怀疑限制在文本列表的大小附近。使用工作表上的范围,列表仅显示正在使用的范围的地址。
  • 你可能是对的。我最终放弃了这个想法并使用 Application.FileDialog(msoFileDialogFolderPicker) 让他们从那里挑选它。它更简单也更好,因为 1000 多个项目的下拉列表一开始就很糟糕。
猜你喜欢
  • 1970-01-01
  • 2022-11-27
  • 2013-11-12
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多