2015-06-05 3 views
0

Цель Мне нужно создать раскрывающийся список для прокрутки и выбора элемента. Элементами являются контракты компании, хранящиеся в наших каталогах. Их тысячи.Excel Список валидации, созданный из большого массива

Попытки Моя первая попытка была использовать подводную лодку, которая идет через наш каталог и записывает имя папки для каждого контракта в column L на 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, а затем непосредственно с помощью array «s values для заполнения списка будет лучше.

Я использовал этот пост в качестве ссылки: 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 заполнен правильно (я напечатал имя папки 1403 s в column, чтобы проверить), но я получил error во время создания списка (используя тот же код, который был опубликован ранее, который работал с меньшим массивом). У кого-нибудь есть идея, почему?

EDIT: ошибка 1004 (от французского): ошибка, определяемая приложением или объектом.

+0

Если никто не может ответить, не стесняйтесь помочь мне сделать это первым способом (сохраняя имена в скрытом столбце и используя это для заполнения списка). Мне просто нужно понять, как обращаться к именованным ячейкам (вместо заполнения из L3 в L X я хотел бы заполнить из именованной ячейки до конца списка.) –

+0

Какое сообщение об ошибке вы получаете и с какой строки? – 314UnreadEmails

+0

Ошибка 1004 (от французского): ошибка, определяемая приложением или объектом. Я добавил его к вопросу. это происходит в '.Add Type: = xlValidateList, AlertStyle: = xlValidAlertStop, _ Operator: = xlBetween, Formula1: = Join (liste,", ")' –

ответ

3

This page говорит, что существуют разные пределы в зависимости от того, как создается список.

Ограничения на количество элементов, которые будут отображаться в выпадающем списке проверки данных: список может отображать до 32 767 элементов из списка на листе. Если вы введете элементы в диалоговое окно проверки данных (список с разделителями), предел составляет 256 символов, включая разделители. Если вам нужно больше предметов, вы можете создать зависимый выпадающий список, разбитый по категориям.

+0

Заполняет ли он массив, попадая в категорию «ввод данных в поле проверки данных»? Это не кажется вероятным. В любом случае, создавая зависимый выпадающий список, как они показывают его, действительно не соответствует моим потребностям, так как количество контрактов (длина списка) меняется.Я мог бы порождать список из значений с листа с помощью VBA - если бы я знал, как ссылаться на меняющийся диапазон от этого типа команды: 'Formula1: =" = Feuil2! $ A $ 3: $ A $ 10 "' Вместо того, чтобы идти от 'A3' на' A10' Я мог бы ссылаться на именованную ячейку и другую ячейку с именем. Ты знаешь как? –

+0

Я думал, что вы смогли заставить его работать, используя «столбец L на листе f_param» или была ли проблема с этим? – ChipsLetten

+0

Заполнение его с помощью массива создает текстовый список так же, как и ввод данных, поэтому я подозреваю, что ограничение ограничено размером текстового списка. Используя диапазон на листе, список просто показывает адрес используемого диапазона. – ChipsLetten

Смежные вопросы