Registriert seit: 21.10.2014
Version(en): 2013
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?
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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:1 Nutzer sagt Danke an Kuwer für diesen Beitrag 28
• Schülerin
Registriert seit: 21.10.2014
Version(en): 2013
21.10.2014, 15:20
(Dieser Beitrag wurde zuletzt bearbeitet: 21.10.2014, 15:27 von Schülerin.)
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
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
21.10.2014, 15:33
(Dieser Beitrag wurde zuletzt bearbeitet: 21.10.2014, 15:34 von Kuwer.)
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), Gruß Uwe
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
Hallo, Du willst dann bestimmt noch wissen, wie man das dann abfragt. 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
Registriert seit: 21.10.2014
Version(en): 2013
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
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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. Gruß Uwe
Registriert seit: 21.10.2014
Version(en): 2013
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!
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
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 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)
Registriert seit: 11.10.2014
Version(en): 12/2007&14/2010
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 objektorientierten Programmiersprachen 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 Elementeanzahl 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 aufrufoptisch vom VBA-Standardtyp, 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 Datenanordnungen in mehreren Ebenen, quasi als Datenstapel), 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
|