2012-11-06 15 views
5

Ich versuche, den Wert mehrerer nicht zusammenhängender Bereiche in ein Array zu kopieren. Ich schrieb Code wie folgt:Excel VBA, wie Sie den Wert mehrerer nicht zusammenhängender Bereiche in ein Array kopieren

summaryTempArray = .range("A2:D9,A11:D12,A14:D15").Value 

Aber es kopiert nur den ersten Teil (A2: D9). Dann habe ich Folgendes versucht und bekomme den Fehler "Method Union of Object _Global Failed" - gibt es einen Fehler in der Art, wie ich Union verwende?

summaryTempArray = Union(.range("A2:D9"), .range("A11:D12"), .range("A14:D15")).Value 
+0

Verwenden Sie nur Split angewendet auf die Adresse des Bereichs, Trennzeichen wird "," –

Antwort

9

Sie wissen nicht, was Sie mit Ihrem union falsch war, aber es würde den gleichen Bereich erstellt haben, die Sie in Ihrem ersten Versuch angegeben.

Das Problem ist, Sie haben jetzt mehrere Bereiche. Was Sie können und soweit ich weiß, muss ich jetzt ansprechen.

Hier ist ein Beispiel, das in einer Reihe von allen Bereichen lösen wird, ohne jede Zelle einzeln hinzufügen, aber jeden Bereich einzeln auf die Zusammenfassung Array hinzufügen:

Public Sub demo() 
    Dim summaryTempArray() As Variant 
    Dim i As Long 

    With Tabelle1 
    ReDim summaryTempArray(1 To .Range("A2:D9,A11:D12,A14:D15").Areas.Count) 

    For i = 1 To .Range("A2:D9,A11:D12,A14:D15").Areas.Count 
     summaryTempArray(i) = .Range("A2:D9,A11:D12,A14:D15").Areas(i) 
    Next i 
    End With 

End Sub 

Hoffnung, das hilft.

2

Ich glaube, Jook's Lösung ist so gut, wie Sie bekommen werden, wenn es wichtig ist, die Quellbereiche in ein Array zu bekommen. Ich denke jedoch, dass die Lösung Anweisungen zum Extrahieren von Werten aus einem unregelmäßigen Array enthalten sollte. Dies ist nicht schwierig, aber die Syntax ist unklar.

Ich kann Ihre Union Anweisung auch nicht zum Scheitern bringen. Ich nehme an, dass es etwas über den Kontext gibt, der den Fehler verursacht, den ich nicht duplizieren kann.

Der folgende Code zeigt, dass die beiden Bereiche identisch sind und nur der erste Teilbereich in ein Array geladen wird, wie Sie berichtet haben. Es endet mit einem alternativen Ansatz, der zufriedenstellend sein könnte.

Option Explicit 
Sub Test() 

    Dim CellValue() As Variant 
    Dim rng As Range 

    With Worksheets("Sheet1") 

    Set rng = .Range("A2:D9,A11:D12,A14:D15") 
    Debug.Print rng.Address 
    Set rng = Union(.Range("A2:D9"), .Range("A11:D12"), .Range("A14:D15")) 
    Debug.Print rng.Address 
    ' The above debug statements show the two ranges are the same. 

    Debug.Print "Row count " & rng.Rows.Count 
    Debug.Print "Col count " & rng.Columns.Count 
    ' These debug statements show that only the first sub-range is included the 
    ' range counts. 

    CellValue = rng.Value 

    Debug.Print "Rows " & LBound(CellValue, 1) & " to " & UBound(CellValue, 1) 
    Debug.Print "Cols " & LBound(CellValue, 2) & " to " & UBound(CellValue, 2) 
    ' As you reported only the first range is copied to the array. 

    rng.Copy Destination:=Worksheets("Sheet2").Range("A1") 
    ' This shows you can copy the selected sub-ranges. If you can copy the 
    ' required data straight to the desired destination, this might be a 
    ' solution. 

    End With 

End Sub