Мне кажется, проблема в том, что диалог проверки данных принимает только следующие «списки»:
фактический список вещей, введенный непосредственно в поле «Источник»
буквенная ссылка диапазона (например, $ Q $ 42: $ Q $ 50)
именованная формула, которая сама по себе разрешается в ссылку на диапазон
Последний из них является ключевым - невозможно, чтобы функция VBA возвращала массив, который можно использовать для проверки, даже если вы вызываете его из именованной формулы.
Вы можете написать функцию VBA, которая возвращает ссылку на диапазон, и вызвать , что из именованной формулы.Это может быть полезно как часть следующего метода, который приближает способность делать то, что вы на самом деле хотите.
Во-первых, где-то есть фактический диапазон, который вызывает ваш произвольный массив, возвращающий VBA UDF.Скажем, у вас есть эта функция:
Public Function validationList(someArg, someOtherArg)
'Pretend this got calculated somehow based on the above args...
validationList = Array("a", "b", "c")
End Function
И вы назвали ее из $ Q $ 42: $ Q $ 50 в качестве формулы массива.Вы получите три ячейки с «a», «b» и «c» в них, а остальные ячейки будут иметь ошибки # N / A, потому что возвращаемый массив будет меньше, чем диапазон, который называется UDF.Пока все хорошо.
Теперь, есть еще одна UBA VBA, которая возвращает только "занятую" часть диапазона, игнорируя ячейки с ошибками # N / A:
Public Function extractSeq(rng As Range)
'On Error GoTo EH stuff omitted...
'Also omitting validation - is range only one row or column, etc.
Dim posLast As Long
For posLast = rng.Count To 1 Step -1
If Not IsError(rng(posLast)) Then
Exit For
End If
If rng(posLast) <> CVErr(xlErrNA) Then
Exit For
End If
Next posLast
If posLast < 1 Then
extractSeq = CVErr(xlErrRef)
Else
Set extractSeq = Range(rng(1), rng(posLast))
End If
End Function
Вы можете затемвызовите это из именованной формулы, например, так:
=extractSeq($Q$42:$Q$50)
и именованная формула вернет ссылку на диапазон, в которой Excel примет допустимый список проверки.Неуклюжий, но без побочных эффектов!
Обратите внимание на использование ключевого слова «Set» в приведенном выше коде.Это не ясно из вашего вопроса, но это может быть единственной частью всего этого ответа, который имеет значение для вас.Если вы не используете «Set» при попытке вернуть ссылку на диапазон, VBA вместо этого вернет значение диапазона, которое нельзя использовать в качестве списка проверки.