【问题标题】:Pass array variable to Excel named range for data validation list将数组变量传递给 Excel 命名范围以进行数据验证列表
【发布时间】:2019-08-26 22:29:54
【问题描述】:

这个问题没有令人满意的答案。我很乐意投票 任何包含变通方法的新响应。

如何在不事先将其转储到单元格的情况下将数组变量传递给 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 为那些愿意为倾销方法做出贡献的人

【问题讨论】:

  • 简短回答:不能那样做。见answers.microsoft.com/en-us/office/forum/…
  • 您甚至不能将名称用作数据验证的值列表。如果您将={1,2,3} 插入您名字的Refers To,您可以使用它。 G。作为工作表中的矩阵公式,但不适用于数据验证。
  • 请在用户声音中为此投票! excel.uservoice.com/forums/…
  • @ScottCraner 在找到解决方法之前无法完成。请检查此stackoverflow.com/a/39351425/1903793 作为击败通常认为不可能的 Excel 限制的示例。感谢您为我们应对最终让我兴奋的挑战奠定了坚实的基础:-)

标签: excel vba validation named-ranges


【解决方案1】:

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

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

【讨论】:

  • 我看不出你的回答有什么好处。你有什么建议?先将数组转储到单元格,然后将转储的数据用作动态命名范围?
  • 我编辑了我的答案,希望更多地应用于您对帖子所做的编辑。
  • 我寻求从 VBA 数组变量中填充 DV 列表项的可能性。我的问题是如何避免将数组写入单元格的中间步骤(即使在隐藏的工作表中)。请检查您的概念是否需要将项目放在单元格中?如果是,那么遵循这条路径不会让我们更接近解决方案。
  • 不幸的是,如果您尝试验证命名范围,那么工作表中必须有一个范围需要验证。否则,您可以尝试在要验证的单元格上使用 For Each 循环作为 Change Event 的一部分,以循环遍历数据数组以进行验证并从那里运行您的过程。
  • DV 列表不仅用于检查用户是否输入了正确的数据,DV 还用于生成下拉列表以建议用户正确的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
相关资源
最近更新 更多