Excel VBA - 访问使用命名范围填充的数组

时间:2017-11-08 18:16:56

标签: arrays excel vba validation

我一直在努力解决数组问题,请参阅此处:(Excel VBA - Arrays for Data Validation Reference

我想尝试简化以确定它是否更有意义。

假设我有一组范围,每个都有一个名字; Range1,Range2等我将每个命名范围设置为一个数组; MyArray1,MyArray2等我然后把这些数组放在一个数组中; ContainerArray

我有另一个名为ReferenceArray的数组,它基于命名范围; RangeRef;其中包含值Ref1,Ref2,Ref3

参考阵列填充数据验证列表1。

问题陈述:

如果用户选择(例如)数据验证列表1中的Ref1,我想触发数据验证列表2以填充ContainerArray中的相应数组(因此它将填充MyArray1中的值)... < / p>

类似的东西:

If Data Validation List 1.Selection = ReferenceArray(i) then
    Data Validation List 2 Options = ContainerArray(i)
Endif

感谢任何帮助。提前谢谢!

2 个答案:

答案 0 :(得分:0)

如果你google&#34;数组阵列&#34;您将找到有关如何完成此操作的大量信息,包括以下示例:How do I set up a "jagged array" in VBA?

但是,根据我在其他主题的评论,为什么要使用VBA呢?没有充分理由,这根本不是一个好方法。你过度复杂了。使用动态命名范围,查看我在其他主题中链接的示例。

答案 1 :(得分:0)

我整理了一个解决方案,虽然没有使用命名范围,只是简单地使用在vba中创建的数组。但就我想要的引用而言,它没有问题! :)

Sub Test()

    Dim Array_DV1 As Variant
    Array_DV1 = Array("Array X", "Array Y", "Array Z")

        Range("DV_1").Offset(1, 0).Select
        With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, Formula1:=Join(Array_DV1, ",")
            .IgnoreBlank = True
            .InCellDropdown = True
        End With

    Dim Array_X As Variant
    Array_X = Array("X1", "X2", "X3")

    Dim Array_Y As Variant
    Array_Y = Array("Y1", "Y2", "Y3", "Y4")

    Dim Array_Z As Variant
    Array_Z = Array("Z1", "Z2", "Z3", "Z4", "Z5")

        Dim Array_XYZ As Variant
        Array_XYZ = Array(Array_X, Array_Y, Array_Z)

        For i = LBound(Array_DV1) To UBound(Array_DV1)

            If Range("DV_1").Offset(1, 0).Value = Array_DV1(i) Then

                Range("DV_2").Offset(1, 0).Select
                With Selection.Validation
                    .Delete
                    .Add Type:=xlValidateList, Formula1:=Join(Array_XYZ(i), ",")
                    .IgnoreBlank = True
                    .InCellDropdown = True
                End With

            End If

        Next

End Sub

备注:如果用户在第一个dv列表中选择了不同的选项,代码将需要更新此代码的内容。