Auslesen eines Arrays für Informatikunterricht
#1
Hi Leute,

wir gehen in unserem Informatikunterricht gerade Felder durch und ich habe eine dickes Problem.

Ich kann doch in Excel ein Feld so bilden:

ReDim Aray(1 To 5, 1 To 3)

oder auch einfach nur so:

Dim Aray As Variant

Dann die Wertezuordnung:

Aray = Range("A1:C5").Value

In dem kleinen Range Bereich von A1 bis C5 habe ich ein paar Testwerte hineingeschrieben. Im Lokalfenster kann ich dann sehen, das diese Testwerte dem Aray auch tatsächlich zugeordnet wurden. Doch wie lese ich die Dinger dann einzeln wieder aus? Egal was ich mache es funktioniert
einfach nicht.



Code:
Sub Auslesen()
Dim Aray As Variant

ReDim Aray(1 To 5, 1 To 3)
Aray = Range("A1:C5").Value


'Meine Fehlversuche:
'#Debug.Print Aray(1)(Aray(1, 2)).Value
'#Debug.Print Aray(1)(1, 2).Value

'#Debug.Print Aray(1)(Aray(1, 2).Value).Value
'#Debug.Print Aray(1)(1)(2).Value

'#Debug.Print Aray(1)(1).Value

'#Debug.Print Aray(1, 2).Value

'#Debug.Print Aray(1, 2).Value
End Sub

Es muss doch möglich sein, dass ich für die einzelnen Werte wieder eine weitere Zuordnung mach kann oder?
Top
#2
Hallo,

die Feldvariable Aray hat keine Eigenschaft Value.
Lass es einfach weg.

Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • Schülerin
Top
#3
Hallo Uwe,

du hast mir viel Zeit gespart. Vielen Dank. Habe aber noch eine Frage:
Wenn ich mir dem Befehl

Aray = Range("A1:C5")

dem Feld einen ganzen Block zuweisen kann, warum kann ich dann nicht mit
Aray(1) = Range("A9:C9") 'Fehler

dem Array wieder eine neue Zeile zuweisen, bzw. wie würde denn so etwas gehen?
P.S. habe dazu gerade noch den Artikelverweis auf diese schon einmal im Forum gestellte
Frage gelesen. Komme mit Deinem Code wegen mangelnder Kenntnisse nicht weiter.
Aray = Range("A1:C5") 'O.K
Debug.Print Aray(1, 2) 'O.K

Aray(1) = Range("A9:C9") 'Fehler, geht nicht
Top
#4
Hallo,

nach

Aray = Range("A1:C5").Value 'da solltest Du das Value nicht weglassen

ist die Variable 2-dimensional, also gibt es kein Aray(1).
Aber z.B.

Aray(1, 1) = Range("A9:C9").Value

ginge durchaus. Aber das willst Du sicher nicht wirklich (siehe Lokalfenster), Wink

Gruß Uwe
Top
#5
Hallo,

Du willst dann bestimmt noch wissen, wie man das dann abfragt. Wink

Code:
Sub Auslesen()
  Dim Aray As Variant
  Aray = Range("A1:C5").Value
  Debug.Print Aray(1, 2)
  Aray(1, 1) = Range("A9:C9").Value
  Debug.Print Aray(1, 1)(1, 1)
  Debug.Print Aray(1, 1)(1, 2)
  Debug.Print Aray(1, 1)(1, 3)
End Sub

Gruß Uwe
Top
#6
Hallo Uwe,
Felder werden für mich plötzlich immer rätselhafter,
deshalb mal meinen Versuchscode:

Code:
Sub Auslesen()
Dim Aray As Variant

ReDim Aray(1 To 5, 1 To 3)

'Ganzen Block zuweisen
Aray = Range("A1:C5")
'Kontrolle eines zugewiesenen Feldwertes
Debug.Print Aray(1, 2)

'Neuen einzelnen Wert zuweisen
Aray(1, 2) = Range("A20")
'Alles Ausgeben
Range("E1:G5") = Aray

'Bis hierhin gings, zumindest vom Ergebnis so wie ich mir
'das jetzt vorstellte, du meintest aber es wäre irgendetwas falsch oder so.

'Doch dann:
'Jetzt nochmal mit Zuweiseung einer ganzen Zeile:
'im Lokalfenster erscheint dann auch plötzlich so etwas
'wie ein Feld im Feld??
Aray(1, 1) = Range("A9:C9").Value
Range("J1:L5") = Aray

End Sub
Top
#7
Hallo,

es ist so wie Du sagst, da wird ein neues (Unter)Feld angelegt.

Falls Du das hier noch nicht gelesen hast, solltest Du das unbedingt nachholen. Wink

Gruß Uwe
Top
#8
Hallo Uwe,

Deinen Code muss ich vorhin einfach übersehen haben. Der hilft mir schon sehr weiter um die ganze
Angelegenheit korrekt zu schreiben. Auch vielen Dank für die beigefügte Internetadresse.
Was die zeilenweise Zuordnung auf einen Schlag betrifft gehe ich davon aus, dass so etwas
einfach nicht geht.

Falls doch, meldet euch!

Auf jeden vielen Dank!
Top
#9
Hallo Schülerin,

wenn Du ein Array zeilenweise füllst, kannst Du es auch zeilenweise ändern. Ausgeben kann man es bei Bedarf auch komplett. Dazu musst Du das Array 2x transponieren.
Wenn Du so ein Array mit ein oder mehrmals transponieren "auf einen Ritt" erzeugen willst, wird das nix Sad Excel ist da vielleicht etwas eigenwillig.

Code:
Sub test_1()
Dim arrZeilen(1 To 2)
arrZeilen(1) = Range("a1:c1").Value
arrZeilen(2) = Range("a2:c2").Value
Range("e1:g2") = WorksheetFunction.Transpose(WorksheetFunction.Transpose(arrZeilen))
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#10
Was André hier schreibt, ist völlig richtig, Schülerin,
denn er deutet mit seiner Antwort an, dass es zwei Typen von Arrays in VBA gibt, was das von Uwe verlinkte Tutorial verschweigt.
Ein zeilen(bzw spalten-)weise gefülltes Array ist eines vom 2.Typ, mitunter als „Arrays in Arrays“ bzw von MS als Variant mit einem Array bezeichnet, das in den meisten objekt­orientierten Programmier­sprachen der Standard-Array-Typ ist, allerdings dort zumeist auch ein Objekt. Um ein solches Array auf einen TabBlatt-Zellbereich abbilden zu können, müssen alle seine (Primär-)Elemente Arrays gleicher Elemente­anzahl enthalten, sonst würde auch das 2malige Transpose nicht helfen, das bewirkt, dass die so gebildete, für Xl irreguläre Matrix normiert und damit abbildbar wird.
Der große Vorteil dieser Art von Array ist, neben dem bereits von André Erwähnten, dass es auch zeilen(- bzw spalten-)weise ausgegeben werden kann. Das wird in Andrés Bsp bspw mit arrZeilen(1) bewerkstelligt. Ein einzelnes (Sekundär-)Element muss man dagegen mit bspw arrZeilen(1)(1) aufrufen, was diesen Array-Typ auch aufruf­optisch vom VBA-Standard­typ, arrVBA(1, 1), unterscheidet.
Man kann auf diese Weise die komplexesten Arrays bilden, aber nur das hier gezeigte normalerweise auch auf ein TabBlatt abbilden (er erlaubt aber auch gewisse Daten­anordnungen in mehreren Ebenen, quasi als Daten­stapel), was bei einem Array 1.Typs auch nur bis zur 2Dimensionalität möglich wäre (n-dimensionale Tensoren dieses Typs lassen sich generell nicht in Xl abbilden, wenn man sie nicht zu Typ2 umformt).
Gruß, Castor
Top


Gehe zu:


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