如何将数组变量传递给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
我也尝试了以下方法,但没有成功:
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适用于那些希望为倾销方式做出贡献的人
答案 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
这不是传统意义上的命名范围,而是使用脚本中的字符串变量来代替它。