繁体   English   中英

Excel VBA-数组作为命名范围的并集:奇数行为

[英]Excel VBA - array as union of named ranges : odd behaviour

尽管重复了两次完全相同的操作方式,但我努力工作了几个小时才试图理解为什么我的代码无法正常工作:

这适用于一组命名范围:

Dim MyArr() As Variant
Dim RangeName As Variant
RangeName = Array("oneNamedRange", "anotherNamedRange", "onemoreNamedRange")
MyArr = Union(Range(RangeName(0)), Range(RangeName(1)), Range(RangeName(2)))

现在,如果我尝试获取另一个数据集,例如:

Dim MyProcess() As Variant
RangeName = Array("nr1", "nr2", "nr3", "nr4", "nr5", "nr6", "nr7")
MyProcess = Range(RangeName(0)) ' Ok
MyProcess = Range(RangeName(1)) ' Ok
MyProcess = Range(RangeName(2)) ' Ok
MyProcess = Range(RangeName(3)) ' Ok
MyProcess = Range(RangeName(4)) ' Ok
MyProcess = Range(RangeName(5)) ' Ok
MyProcess = Range(RangeName(6)) ' Ok

MyProcess = Union(Range(RangeName(0)), Range(RangeName(1))) ' Ok, got my 2D array
MyProcess = Union(Range(RangeName(0)), Range(RangeName(2))) ' NOK
MyProcess = Union(Range(RangeName(0)), Range(RangeName(3))) ' NOK
MyProcess = Union(Range(RangeName(0)), Range(RangeName(4))) ' NOK
MyProcess = Union(Range(RangeName(0)), Range(RangeName(5))) ' NOK
MyProcess = Union(Range(RangeName(0)), Range(RangeName(6))) ' NOK

MyProcess = Union(Range(RangeName(0)), Range(RangeName(0)), Range(RangeName(0))) ' NOK gives only 1D
MyProcess = Union(Range(RangeName(1)), Range(RangeName(1)), Range(RangeName(1))) ' NOK gives only 1D
MyProcess = Union(Range(RangeName(0)), Range(RangeName(1)), Range(RangeName(1))) ' NOK gives only 2D out of 3
MyProcess = Union(Range(RangeName(0)), Range(RangeName(1)), Range(RangeName(2))) ' NOK gives only 2D out of 3

看起来Union或Application.union在VBA中工作异常。 我还检查了命名范围(大小,名称..),但找不到任何线索。

在提供的范围的任何情况下,我都能找到任何好的子过程来从命名范围设置数组吗?

这是我解决问题的方法:

Private Function dBToArray(ByVal NamedRanges As Variant, Optional ByVal oSht As Worksheet = Nothing)

    Dim I As Long
    Dim J As Long
    Dim NbData As Long
    Dim NbRanges  As Long
    Dim MyValue As Variant
    Dim MyArray() As Variant

    ' ---------------
    ' CHECK ARGS
    ' ---------------
    If IsMissing(oSht) Then
        MsgBox "info : Parameter arg not passed"
    End If

    If oSht Is Nothing Then
         Set oSht = ActiveWorkbook.Sheets("dB")
    End If

    If ws_exists(oSht.Name) = False Then
        MsgBox "WS Non Exists"
        Exit Function
    End If

    NbData = Range(NamedRanges(0)).Count ' e.g. ID_process count
    NbRanges = UBound(NamedRanges)
    ReDim MyArray(1 To NbData, 1 To NbRanges) As Variant

    ' Parse the dB ranges
    For I = 1 To NbData
         For J = 1 To NbRanges
             MyValue = oSht.Range(NamedRanges(J - 1)).Value
             ' Debug.Print Chr(10) & Time & " - I: " & I & "," & "J: " & J & ", Val = " & MyValue(I, 1)
              MyArray(I, J) = MyValue(I, 1)
         Next J
     Next I



    ' Return the multiDim array
    dBToArray = MyArray

    ' Free some mem
    Set MyValue = Nothing
    Erase MyArray

End Function

用法

Dim RangeName As Variant
Dim MyArrayFromdBSheet() As Variant

RangeName = Array("ID", "PROCESS_NAME", "PROCESS_CPY", "PROCESS_START", "PROCESS_END")
MyArrayFromdBSheet = dBToArray(RangeName)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM