2014-10-04 40 views
0

我strugglying幾個小時試圖理解爲什麼我的代碼不工作,儘管兩次重複做着完全相同的方式:Excel的VBA - 數組作爲名爲範圍的聯盟:古怪的行爲

這個工程上的一組

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 

貌似聯盟或Application.union工程奇怪的VBA。我也檢查了命名的範圍(大小,名稱),但找不到任何線索。

我可以找到任何好的子過程來設置從命名範圍的數組,在提供的範圍的任何情況下工作?

+0

第一聯(後),下一個迭代應該使用'聯盟(myProcess,[rangeToAdd])' – 2014-10-04 16:07:17

+0

MyProcess是一個數組,我猜不能添加任何東西。下一個「聯合」用於迭代測試目的,單獨嘗試每個範圍,然後添加2個範圍等。 – hornetbzz 2014-10-04 16:14:27

+0

Tim的工作解決方案是[there] [1]。 THX [1]:http://stackoverflow.com/a/23894096/461212 – hornetbzz 2014-10-04 18:26:06

回答

0

這是我如何解決我的問題:

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)