Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

[VBA] Array erweitern
#1
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!


Angehängte Dateien
.xlsm   ArrayTest Forum.xlsm (Größe: 15,36 KB / Downloads: 5)
Antworten Top
#2
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#3
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

JKLMNOP
6MeißnerGH2arr(1, 1) = Meißnerarr(1,2) = GHarr(1, 3) = 2
7HeimannX3arr(2, 1) = Heimannarr(2,2) = Xarr(2, 3) = 3
8MecklenborgTH5arr(3, 1) = Mecklenburgarr(3, 2) = THarr(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.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#4
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
[-] Folgende(r) 1 Nutzer sagt Danke an snb für diesen Beitrag:
  • EasY
Antworten Top
#5
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
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#6
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.
Antworten Top
#7
Hallo EasY,

jetzt haben wir wohl knapp aneinander vorbei geschrieben. Sieh dir mal meinen Vorschlag unter #5 an.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
[-] Folgende(r) 1 Nutzer sagt Danke an Klaus-Dieter für diesen Beitrag:
  • EasY
Antworten Top
#8
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ß
Antworten Top
#9
Hallo EasY,


hier ein Paar Links zum Thema QuickSort:

QuickSort-Feld

QuickSort-Bereich

QuickSort-Spezial
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
[-] Folgende(r) 1 Nutzer sagt Danke an Klaus-Dieter für diesen Beitrag:
  • EasY
Antworten Top
#10
Sortieren in Excel ist schneller als quicksort.
Also: verwende Excel zum sortieeren.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
[-] Folgende(r) 1 Nutzer sagt Danke an snb für diesen Beitrag:
  • EasY
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste