it-swarm.com.de

Erstellen eines Arrays aus einem Bereich in VBA

Ich habe ein scheinbar grundlegendes Problem, kann aber keine Ressourcen finden, die es angehen.

Einfach ausgedrückt, ich möchte nur den Inhalt eines Zellbereichs (alle eine Spalte) in ein Array laden.

Ich bin in der Lage, dies mittels zu erreichen

DirArray = Array(Range("A1"), Range("A2"))

Aber aus irgendeinem Grund kann ich das Array nicht erstellen, wenn ich es so ausdrücke:

DirArray = Array(Range("A1:A2"))

Mein tatsächlicher Bereich ist viel länger (und kann in der Länge variieren), sodass ich die Zellen nicht auf diese Weise einzeln aufzählen muss. Kann mir jemand sagen, wie man einen ganzen Bereich richtig in ein Array lädt?

Mit dem letzteren Code:

MsgBox UBound(DirArray, 1)

Und

MsgBox UBound(DirArray)

Geben Sie 0 zurück, während bei ersteren 1 ausgegeben wird.

25
basaltanglia

Definieren Sie einfach die Variable als Variante und machen Sie sie gleich:

Dim DirArray As Variant
DirArray = Range("a1:a5").Value

Der Befehl Array ist nicht erforderlich.

39
vacip

Mit Value2 bietet einen Leistungsvorteil. Gemäß Charles Williams Blog

Range.Value2 funktioniert genauso wie Range.Value, außer dass das Zellenformat nicht überprüft und in Datum oder Währung konvertiert wird. Und das ist wahrscheinlich der Grund, warum es beim Abrufen von Zahlen schneller als .Value ist.

So

DirArray = [a1:a5].Value2

Bonus Lesung

  • Range.Value : Gibt einen Variantenwert zurück oder legt diesen fest, der den Wert des angegebenen Bereichs darstellt.
  • Range.Value2 : Der einzige Unterschied zwischen dieser Eigenschaft und der Value-Eigenschaft besteht darin, dass die Value2-Eigenschaft die Datentypen Currency und Date nicht verwendet.
17
brettdj

Wenn wir es einfach so machen:

Dim myArr as Variant
myArr = Range("A1:A10")

das neue Array hat zwei Dimensionen. Womit es nicht immer angenehm ist, zu arbeiten:

enter image description here

Um die beiden Dimensionen zu umgehen, können wir die integrierte Excel-Funktion „Transponieren“ verwenden, wenn eine einzelne Spalte in ein Array verschoben wird. Damit werden die Daten in einer Dimension:

enter image description here

Wenn wir die Daten in einer Reihe haben, wird eine einzelne Transponierte den Job nicht erledigen. Wir müssen die Transponierungsfunktion zweimal verwenden:

enter image description here

16
Vityata

Zusätzlich zu den vorgeschlagenen Lösungen und für den Fall, dass Sie einen 1D-Bereich bis 1D-Array haben, bevorzuge ich es, ihn über eine Funktion wie die folgende zu verarbeiten. Der Grund ist einfach: Wenn Ihr Bereich aus irgendeinem Grund auf einen Elementbereich reduziert ist, gibt Value, soweit ich weiß, kein Variantenarray zurück, sondern nur eine Variante, und Sie können keine Variante zuweisen Variable zu einem varianten Array (zuvor deklariert).

Ich musste einen variablen Größenbereich in ein doppeltes Array konvertieren, und als der Bereich eine Zellengröße hatte, konnte ich keinen konstruierten Wert wie range (). Verwenden, sodass ich mit einer Funktion wie der folgenden fortfahre.

Public Function Rng2Array(inputRange As Range) As Double()

    Dim out() As Double    
    ReDim out(inputRange.Columns.Count - 1)

    Dim cell As Range
    Dim i As Long
    For i = 0 To inputRange.Columns.Count - 1
        out(i) = inputRange(1, i + 1) 'loop over a range "row"
    Next

    Rng2Array = out  
End Function
1
Paolo