почему валидация VBA с большим списком перестала работать после повторного открытия файла? - PullRequest
0 голосов
/ 07 сентября 2018

Код работает нормально, как я и ожидал. Он создает выпадающий список из строки с 257 символами, 88 пунктов, разделенных запятой. Однако после сохранения файла я не могу открыть его успешно. Код (расположенный в листе объектов Excel, а не в модуле) также теряется. Я действительно ценю ваш вклад.

Смена 88 на 87, все работает нормально.

Sub test_function()
Dim myList As String
myList = "" 

For a = 0 To 88
    myList = myList & CStr(a) & ","
Next a

'for debug
MsgBox Len(myList) & ":" & myList

ThisWorkbook.Application.Sheets("DC_setup").Range("A1:A10").Select

With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=myList
    .IgnoreBlank = True
    .InCellDropdown = True
    .ShowInput = True
    .ShowError = False
End With
End Sub

1 Ответ

0 голосов
/ 07 сентября 2018

Ваш список проверки данных "формула" слишком длинный.

Вы можете сделать его очень, очень коротким - используя имя вместо списка значений через запятую:

  1. Добавьте новый лист в рабочую книгу, введите «Значения» в ячейку A1
  2. Добавьте все допустимые значения в столбце A, начиная со строки 2
  3. Выберите «Формат таблицы» на ленте «Домой»; при появлении запроса убедитесь, что таблица включает в себя все ячейки в столбце A, которые имеют значение, а также заголовок (необходимо установить флажок «моя таблица имеет заголовки»).
  4. Из ленты «Инструменты таблицы» измените имя таблицы, например, tblLegalValues.
  5. На ленте «Формулы» откройте Диспетчер имен и нажмите кнопку «Создать».
  6. Определите имя в рабочей области - назовите его, например, legalValues, ссылаясь на =tblLegalValues[Values]
  7. Составьте список проверки данных =legalValues
  8. (необязательно) скрыть лист

Теперь не только вы получаете все необходимые значения без каких-либо проблем. Если вы добавляете или удаляете значения из таблицы tblLegalValues, проверка данных автоматически обновляется!


Если ваш список проверки данных на самом деле представляет собой целые числа от 0 до 88, тогда вам не нужен какой-либо список; измените тип проверки на xlValidateWholeNumber, сохранив оператор xlBetween и сделав Formula1=0 и Formula2=88.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...