Hi Leute,
ich benötige eure Hilfe. Ich beginne derzeit, mich aufgrund der deutlich besseren Performance, mich mit Arrays zu beschäftigen und lese und youtube viel.
Anbei habe ich ein Problem, welches ich nicht gelöst bekomme. Ich habe Daten in F6, die ich in ein Array einlese und dann eigentlich um eine Spalte innerhalb des Arrays erweitern möchte, um Daten hinzuzufügen. Das Problem im Anhang ist nur ein Zwischenziel, ab da möchte ich dann selbst erstmal weitertüfteln.
Ich verstehe nicht, wieso mein Array beim Einlesen der Daten in der zweiten Dimension immer auf 2 geschrumpft wird - ich dimensioniere es doch auf 3. Entsprechend erscheint immer ein Fehler, wenn ich anschließend Daten hinzufügen möchte. Mit dem Redim Preserve-Befehl habe ich schon rumprobiert - da komme ich allerdings auch nicht weiter.
Ich hoffe, ihr könnt mir nicht nur die Lösung, sondern vll auch einen Denkanstoß liefern.
Danke!
Schau mal:
https://www.snb-vba.eu/VBA_Arrays_en.html
Deine Makro Name interferiert mit einer Variabele Name: verzichte darauf; verwende "M_" & name: 100% sicher
Code:
Sub M_snb()
sn = Range("F6").CurrentRegion.Resize(, 3)
For j = 1 To UBound(sn)
sn(j, 3) = InStr(" HAGHX THBH", UCase(sn(j, 2))) \ 2
Next
End Sub
Hallo,
mir scheint du hast ein falsches Verständnis von den Dimensionen eines Array. Du brauchst nur ein zweidimensionales Array. Es hat 19 "Zeilen" und 3 "Spalten". Zum besseren Verständnis habe ich dir das mal anhand deines Wunschergebnisses dargestellt:
Tabelle1 | J | K | L | M | N | O | P |
6 | Meißner | GH | 2 | | arr(1, 1) = Meißner | arr(1,2) = GH | arr(1, 3) = 2 |
7 | Heimann | X | 3 | | arr(2, 1) = Heimann | arr(2,2) = X | arr(2, 3) = 3 |
8 | Mecklenborg | TH | 5 | | arr(3, 1) = Mecklenburg | arr(3, 2) = TH | arr(3, 3) = 5 |
Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8
Wenn du daraus die richtigen Schlüsse ziehst, wirst du merken, dass du das befüllen nicht mit deiner Methode machen kannst. Jetzt muss ich noch mal weg, wenn sich bis dahin niemand eingeklinkt hat, können wir das vertiefen, wenn ich zurück bin.
Das Ergebnis nun auch sichtbar:
Code:
Sub M_snb()
sn = Range("F6").CurrentRegion.Resize(, 3)
For j = 1 To UBound(sn)
sn(j, 3) = InStr(" HAGHX THBH", UCase(sn(j, 2))) \ 2
Next
cells(1,10).resize(ubound(sn),3)=sn
End Sub
Hallo EasY,
habe dein Makro mal so geändert, das es funktioniert:
Code:
Option Explicit
Sub arra()
Dim arr(19, 2) As Variant
Dim i As Long
For i = 0 To 18
arr(i, 0) = Cells(i + 6, 6)
arr(i, 1) = Cells(i + 6, 7)
Select Case arr(i, 1)
Case "HA"
arr(i, 2) = 1
Case "GH"
arr(i, 2) = 2
Case "X", "x"
arr(i, 2) = 3
Case "TH"
arr(i, 2) = 5
Case ""
arr(i, 2) = 6
Case "BH"
arr(i, 2) = 7
End Select
Next i
ActiveSheet.Range("J6:L" & UBound(arr) + 4) = arr
End Sub
Hey hey
@snb
Danke für den Hinweis bezüglich des Namens - das werde ich ändern.
Ansonsten verstehe ich dein Makro (wie so oft) nicht. Das, was du hier immer ablieferst ist echt abgefahren, Hut ab!
@klaus-dieter
Danke auch dir für deine Ausführungen. Die Dimensionen habe ich tatsächlich verstanden. Dass das Array bei der Befüllmethode schrumpft und nicht geeignet ist, wusste ich nicht.
Welche Methode für das Szenario gäbe es denn dann noch? Eine for-next-schleife würde die Geschwindigkeit wieder drosseln.
Oder ginge es so wie snb geschrieben hat so, dass ich beim festlegen der currentregion den Bereich gleich um eine Spalte vergrößere? Kann gerade nicht testen - bin auf Arbeit :)
Edit: jetzt warst du schneller. Ich schaue mir dein Makro nachher zu Hause an und teste.
Hallo EasY,
jetzt haben wir wohl knapp aneinander vorbei geschrieben. Sieh dir mal meinen Vorschlag unter #5 an.
Es hat geklappt - tatsächlich auch mit dem resize vor dem Befüllen. Klasse :)
Jetzt mache ich mich an eine Sortierung und wühle mich durch quicksort. Das wird interessant
Gruß
Sortieren in Excel ist schneller als quicksort.
Also: verwende Excel zum sortieeren.