将数组变量传递给Excel命名范围以进行数据验证

时间:2019-03-06 14:18:30

标签: excel vba validation named-ranges

如何将数组变量传递给Excel命名范围而不先将其转储到单元格?我希望在数据验证列表中使用这样的动态命名范围。我不想通过数组变量直接在VBA中设置验证列表:

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

因为将Formula1参数的长度限制为255 characters。因此,只要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函数,该函数可用于此case中的命名范围。我尝试将EVALUATE与其他函数的所有组合都返回数组。

更多参考文献:
Fast way to output array into range适用于那些希望为倾销方式做出贡献的人

1 个答案:

答案 0 :(得分:0)

您可以使用逗号分隔的列表(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

在此处找到并稍作修改:How to add data validation to a cell using VBA

这不是传统意义上的命名范围,而是使用脚本中的字符串变量来代替它。