Передать переменную массива в именованный диапазон Excel для списка проверки данных - PullRequest
2 голосов
/ 06 марта 2019

Как передать переменную массива в именованный диапазон Excel без предварительного сброса его в ячейки?Я хочу, чтобы такой динамический именованный диапазон использовался в списке проверки данных.Я не хочу устанавливать список проверки непосредственно в VBA через переменную массива:

Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:=Join(ReturnArr, ",")

из-за ограничения длины параметра Formula1 до 255 символов .Таким образом, приведенный выше код работает нормально, пока Len(Join(ReturnArr, ",")) не превышает 255 символов.

Я пробовал это:

Option Explicit

Function ReturnArr() As Variant
    Dim Arr(0 To 2)
    Arr(0) = "Spinosaur"
    Arr(1) = "T-Rex"
    Arr(2) = "Triceratops"

    ReturnArr = Arr
End Function

Затем я добавляю именованный диапазон, указывающий на массив, возвращающий функцию:
enter image description here

Пока все в порядке.Я создал список проверки данных.enter image description here

Я также безуспешно пробовал следующие пути:

  • транспонирование массива: ReturnArr = Application.Transpose(Arr)
  • INDEX(ReturnArr(),,1)
  • именованный диапазон с =OFFSET(ReturnArr(),0,0,ROWS(ReturnArr()),1)
  • Я опустился до такого низкого уровня, что использовал одну ячейку, и я поместил формулу =OFFSET(ReturnArr(),0,0,ROWS(ReturnArr()),1) в ячейку A1 и сослался на неес INDIRECT("$A$1")
  • Я экспериментировал с недокументированной секретной функцией EVALUATE, которая работает с именованными диапазонами, как в этом случае .Я попытался EVALUATE со всеми комбинациями других функций, возвращающих массив.

Дополнительные ссылки:
Быстрый способ вывода массива в диапазон для тех, кто хотел бы внести свой вклад в сбрасывание

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете заполнить проверку данных без именованного диапазона, используя список, разделенный запятыми (A, B, C). Затем вы можете поместить функцию Array вместо массива в приведенном ниже коде, и это создаст список проверки в указанной вами ячейке.

Public Sub DataValidation()
Dim ws As Worksheet
Dim range1 As Range, rng As Range
'change Sheet1 to suit
Set ws = ThisWorkbook.Worksheets("Sheet1")

Set rng = ws.Range("A1")

Dim Arr(0 To 2)
Arr(0) = "Spinosaur"
Arr(1) = "T-Rex"
Arr(2) = "Triceratops"

With rng.Validation
    .Delete 'delete previous validation
    Dim arrVal As String
    For Each arrItem In Arr()
        arrVal = arrVal & ", " & arrItem
    Next
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=arrVal
End With
End Sub

Найдено здесь и слегка изменено: Как добавить проверку данных в ячейку с помощью VBA

Это не использует именованный диапазон в традиционном смысле, но вместо него использует строковую переменную из скрипта.

...