Gegeben sei folgendes Beispiel:
Sub ZuweisungVonGanzenBereichenOderFeldern()
Dim arr
Dim brr()
arr = Range("A1:A100")
ReDim brr(UBound(arr) - 1, 2)
arr(1, 1) = 1000
For i = 0 To 2
For j = 0 To UBound(arr) - 1
brr(j, i) = i * 100 + j + arr(j + 1, 1)
Next
Next
Range("B1:D100") = brr
End Sub
Aus dem Code (getestet mit xl2000) lässt sich ersehen:
- ein Excel-Zellbereich lässt sich einer VBA-Variant-Variablen (hier ist
nicht ein Datenfeld vom Typ Variant gemeint!) zuordnen
- die Größe dieser einzelnen Variable ist gegenüber Arrays nicht gesondert
eingeschränkt (getestet 60000*100 Zellen)
- Dim arr muss für ReDim sein. Ein ReDim ist nicht nötig (aber möglich).
- die umgekehrte Zuweisung von arr zu einem Range funktioniert ebenso (im
Beispiel brr statt arr)
- genauso kann man brr einem Range zuweisen, auch wenn brr() als Datenfeld
dimensioniert/redimensioniert wurde
- während die Indizes (für Zeile und Spalte) von arr jeweils mit 1 beginnen
(in Anlehnung an den Spezialfall Excel-Zellbereich),
beginnen die von brr() mit 0 - ohne Verwendung von Option Base 1
- bei der Zuweisung von brr auf einen Zellbereich wird der Index =0 automatisch
als am Ziel =1 verwendet
- arr ist zweidimensional, brr() wie gewohnt n-dimensional
- bei arr = Range(...) gibt es keine Zuviel- oder Zuwenig-Zuweisung, da arr als
Variant-Variable die übergebenen Daten verwaltet
- bei Range(...) = arr wird überzähligen Zellen #NV zugewiesen; ein zu kleiner
Range(...) schneidet überzählige arr-Einträge ab
- Operationen wie arr = Range(...) * 2 während der Zuweisungen von Arrays zu
und von Einzel-Variablen sind nicht möglich
- dies gilt alles auch für Sub und Function mit Range-Argument-Übergabe (wie
in 0036.htm)
Ein Anwendungsbeispiel: A:D soll wie in F:I nebeneinandergestellt werden:
A B C D E F G H I 1 Key1 Wert1 Key2 Wert2 2 A-100 1 A-101 2 A-100 1 3 A-102 2 A-103 3 A-101 2 4 A-103 3 A-104 4 A-102 2 5 A-105 4 A-107 4 A-103 3 A-103 3 6 A-106 5 A-108 5 A-104 4 7 A-107 6 A-109 6 A-105 4 8 A-108 8 A-110 7 A-106 5 9 A-110 9 A-111 6 A-107 6 A-107 4 10 A-111 10 A-112 6 A-108 8 A-108 5 11 A-114 11 A-113 5 A-109 6 12 A-115 12 A-114 6 A-110 9 A-110 7
Hier der Code, der bei einem "PC Phenom 2,3 Ghz Quadcore - Excel 2000" und je 32.000 Einträgen in A:B und C:D ca. 0,3 Sekunden benötigt:
Option Base 1
Sub Gegenueberstellung()
Dim b(65536, 4)
'unique random data, ascending in each A, B, C, D.
'A and C later being compared
Range("A1").Clear
Range("A2:A32000,C2:D32000") = "=ROUND(RAND()*3,)+1+R[-1]C"
Range("B2:B32000,D2:D32000") = "=R[-1]C+1"
Range("A:D") = Range("A:D").Value
Start = Timer()
a = Range("A:D")
i = 2: j = 2: k = 1: l = 1
Do Until k > 65000 Or l > 65000
If a(i, 1) = a(j, 3) Then
k = IIf(k > l, k, l) + 1
l = k
For m = 1 To 2
b(k, m) = a(i, m)
b(l, m + 2) = a(j, m + 2)
Next m
i = i + 1
j = j + 1
ElseIf a(i, 1) < a(j, 3) Then
k = k + 1
l = l + 1
For m = 1 To 2
b(k, m) = a(i, m)
Next m
i = i + 1
ElseIf a(i, 1) > a(j, 3) Then
k = k + 1
l = l + 1
For m = 3 To 4
b(l, m) = a(j, m)
Next m
j = j + 1
End If
Loop
Range("F:I") = b
Range("A1") = "Time elapsed: " & (Timer() - Start)
End Sub