Sub ArrayAusTabelle()
Dim arVar
arVar = Range("A1:A3") 'erzeugt ein 2-dimensionales ARRAY !
MsgBox arVar(1, 1) & vbLf & arVar(2, 1) & vbLf & arVar(3, 1), , "Array-Inhalte:"
End Sub
Gruß, NoNet
AW: Array aus Tabelle erzeugen
Wolli
Hallo NoNet,
sehr cool, das geht! Macht ja auch Sinn, eine 2dimensionale Tabelle in ein 2dimensionales Array zu überführen. Kann man dem Feld die zweite Dimension auch irgendwie wieder abgewöhnen, wenn ein eindimensionales Array gefragt ist?
Nochmals Dank + Gruß, Wolli
AW: Array aus Tabelle erzeugen
Ramses
Hallo
Das ist ein eindimensionales Array, weil du nur eine Spalte zuweist
Tabelle1 Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
... und lass mal DIESES Makro laufen
Option Explicit
Sub ArrayAusTabelle() Dim arVar() As Variant arVar = Range("A1:B3") 'erzeugt ein 2-dimensionales ARRAY ! MsgBox arVar(1, 1) & vbLf & arVar(2, 1) & vbLf & arVar(3, 2), , "Array-Inhalte:" End Sub
Gruss Rainer
@Ramses : Widersrpuch...
NoNet
Hallo Ramses,
Das ist ein eindimensionales Array, weil du nur eine Spalte zuweist
Da möchte ich doch mal ganz dezent widersprechen :
Nur weil Du eine Spalte zuweist, ist das kein eindimensionales Array !
Excel VBA interpretiert RANGES wohl immer als 2-dimensionales ARRAY (Ausnahme : eine einzelne Zelle !), da RANGES 2 Ausprägungen haben : Anzahl Zeilen / Anzahl Spalten.
Teste doch mal diesen Code :
Sub ArrayAusTabelleTest()
Dim arVar1, arVar2, arVar3
arVar1 = Range("A1") 'kein Array
arVar2 = Range("A1:A2") '2-dimensionales Array
arVar3 = Range("A1:B1") '2-dimensionales Array
'Fehler :
MsgBox arVar1(1) 'Fehler, da arVar1 kein ARRAY ist
MsgBox arVar2(1) 'Fehler, da arVar2 ein 2-dimensionales ARRAY ist
MsgBox arVar3(1) 'Fehler, da arVar3 ein 2-dimensionales ARRAY ist
'OK :
MsgBox arVar1
MsgBox arVar2(1, 1)
MsgBox arVar3(1, 1)
End Sub
Gruß, NoNet
Du hast recht, NoNet! Allerdings kennt xl...
Luc:-?
...3 "Ausprägungen" sprich Vektortypen...
Für Bereichsbezüge: (Bspp {=A1:B3} bzw {=A1:A3})
stets 2dimensional — Zeilenvektor [1,spaltenanzahl], Spaltenvektor [zeilenanzahl,1]
Für Feldbezüge: (aus Formeln als Argument einer Fkt – Bspp {=--A1:B3} bzw {=--A1:A3})
Zeilenvektor stets 1dimensional [elementeanzahl], Spaltenvektor 2dimensional [elementeanzahl,1]
Ein VBA-Vektor hat demggüber (wenn nicht anders eingestellt/deklariert) standardmäßig die Dimensionen [elementeanzahl-1] bzw [elementeanzahl-1,0].
Ein VBA-Variant, der ein Array enthält, kann auch asymmetrisch sein, d.h., aus Vektoren {bzw Matrizen} unterschiedl Dimension bestehen. Deshalb wdn seine Elemente anders indiziert ([i{,n}][j{,m}][k{,l}]...).
Gruß Luc :-?
Das möchte ich so nicht stehen lassen...
Ramses
Hallo Luc
XlKategorie hin- oder her oder räumliche Orientierung eines Vektors/Matrize hin- oder her.
Ein Array ist in der EXCEL/Informatik-Sprache ein Datenfeld.
Wenn nichts an das Array/Datenfeld übergeben wird ist es nulldimensioniert und somit nicht existent. Wenn nur ein Eintrag übergeben wird ist es eindimensional. Wenn dem Datenfeld mehrere Werte zugwiesen werden die über eine logische Indexierung der Anordnung abgefragt werden zugeordnet werden ist es mehrdimensional,... welch grotesker Ausdruck :-)
Ich denke dieses Beispiel
http://de.wikipedia.org/wiki/Feld_%28Datentyp%29
erklärt sehr gut, was ein- bzw. mehrdimensional ist.
Da im Eingangsgenannten Beispiel Range("A1:A3") nur einzelne in direkter Folge zugewiesene Werte an Datenfelder im Array übergeben werden, ist es eben eindimensional, egal wie die Daten herausgeholt/abgefragt werden.
Wenn der Bereich Range("A1:C1") zugewiesen wird, dann ist er auch ein- und nicht mehrdimensional nur weil die Werte in mehrere Spalten abgelegt werden.
Fact ist daher wohl:
Die Anordnung der Datenfelder und deren zugewiesener Elemente definiert den Begriff Ein-/Mehrdimensional, nicht die Art der Abfrage.
Gruss Rainer
Trotzdem funktioniert...
Luc:-?
Function DFeld(Bezug As Range): DFeld = Bezug: End Function
hervorragend bei Übernahme eines 2dimensionalen Zellbereichs in ein Datenfeld, Rainer...
Wenn man anders vorgehen will, muss man beachten, dass VBA anders indexiert als xl, nämlich alle Zeilen pro Spalte ggüber alle Spalten pro Zeile wie man in folgendem Bsp mit For Each sehen kann...
Function DaFeld(Bezug As Range)
Dim c As Long, cc As Long, r As Long, rc As Long, _
z As Long, x As Range, mx()
cc = Bezug.Columns.Count: rc = Bezug.Rows.Count
ReDim mx(rc - 1, cc - 1)
For Each x In Bezug
r = z \ cc: c = z Mod cc
mx(r, c) = x
z = z + 1
Next x
DaFeld = mx
End Function
Wie das Ganze im Speicher organisiert wird, ist für den "normalen" Nutzer wohl eher irrelevant... ;-)
Gruß Luc :-?
PS: ...und mit physikalischer Mehrdimensionalität hat das wirklich nichts zu tun, da bin ich deiner Meinung... ;-)
Was für ein geiles Scharmützel!
Danke für den Code, Luc - ich brauche also demnach eine Funktion, die meinen Bereich häppchenweise in eine (für mich: eindimensionale) Feldvariable einliest und anschließend das Feld dem Variant-Wert zuweist. Bei mir sieht die so aus:
Function Bereich_in_Variant(Bereich As Range) As Variant
Dim Feld() As Variant, lngI As Long
If Bereich.Columns.Count > 1 Then
Bereich_in_Variant = CVErr(2015)
Else
ReDim Feld(Bereich.Rows.Count)
For lngI = 1 To Bereich.Cells.Count
Feld(lngI) = Bereich.Cells(lngI)
Next lngI
Bereich_in_Variant = Feld
End If
End Function
Gibt es echt keinen Kniff, mit dem ich die erste Spalte aus einem 2dimensionalen Feld herausziehen kann?
Gruß, Wolli
Wo soll andere Dimension sein?
Tino
Hallo,
für mich ist es eindimensional solang diese aus einer Spalte besteht.
Gruß Tino
Unter Dimension verstehe ich hier die...
Luc:-?
...Abbildungsform, Tino,
nämlich die Anzahl unterschiedlicher Indizes, um ein Element einer Datenmenge zu identifizieren, denn damit wird man in der Praxis konfrontiert, weniger mit der Theorie. Und xl indiziert eben nur horizontal ausgerichtete Datenfeldbezüge (eine Datenreihe) 1dimensional, d.h., mit nur einem Index. Alle anderen (Bereichsbezüge generell) haben stets mind 2 "Dimensionen", d.h., sie benötigen 2 Indizes, auch, wenn einer nur 1 bzw 0 ist, sonst erhältst du einen Zugriffsfehler. Streng genommen kennt xl also nur Zeilenvektoren, alle anderen sind Sonderfälle von Matrizen mit der 2.Dimension 0, die für Bereichsbezüge wg der xl-Art der Zellindizierung als 1 erscheint. Die folgd Abb soll das mal verdeutlichen...
Dabei soll die Anwendung von BEREICH.VERSCHIEBEN nur demonstrieren, dass tatsächlich ein _
Datenfeld erzeugt wurde, das keinerlei Beziehung zum ursprgl Zellbereich mehr hat. Dabei hat die udFkt DFeld (jetzt) folgd Aussehen...
Function DFeld(Bezug As Range, Optional ByVal x As Long, _
Optional ByVal y As Long) As Variant
Dim c As Long, r As Long, ec As Long, _
z As Long, df, dv(), dz
On Error GoTo fx
df = Bezug
If x = xlErrNull And _
Err.Number
Daraus kann man ersehen, dass die Umwandlung eines Bereichsbezuges in ein Datenfeld [ geht übrigens auch per MxFml mit {=WENN(ISTZAHL(Q1:T10);--Q1:T10;Q1:T10)} ] ebenso wie die Indizierung eines Einzelelements sehr einfach ist. Schwierig wird's aber, wenn ein einzelner Vektor aus einer echten Datenfeldmatrix wiedergegeben wdn soll. Da muss man dann auch noch (zumindest bei For Each) die abweichende Indexabruffolge von VBA berücksichtigen, sonst erhält man (wie Ramses[?]) kein brauchbares Ergebnis...
Gruß Luc :-?
AW: Unter Dimension verstehe ich hier die...
Tino
Hallo,
ich sehe dies anders, in meinem Kopf ist die erste Dimension die vertikale Datenreihe und
die Horizontale Datenreihe die zweite Dimension.
Range("A1:A3") hat für mich eine Dimension, weil nur eine Vertikale Datenreihe vorhanden ist.
Range("A1:B3") hat für mich zwei Dimensionen, weil noch eine Horizontale vorhanden ist.
oder auch
Redim Arr(2) eine Dimension
Redim Arr(2,1) zwei Dimensionen
oder auch
Redim (0 to 2)
Redim (0 to 2, 0 to 1)
usw...
Gruß Tino
Deine Sicht nutzt dir nichts,...
Luc:-?
...Tino,
weil die BillyBoys das genau andersrum gesehen haben und die haben ja schließlich die Vorlage geliefert... ;-)
Schon die Wortwahl ist ja (im Deutschen) missverständlich (wie auch Anderes wie bspw SumProduct ⇒ Übersetzung falsch SummenProdukt → richtig ProduktSumme, denn es handelt sich um eine Summe von Produkten, nicht um ein Produkt von Summen). Mit Dimensionen sind hier eigentl Abmessungen (in Analogie zu Konstruktionszeichnungen), nicht reale Dimensionen gemeint, also letztlich die "Dimension" der Koordinaten eines Datenfeldes. Ob nun ein horizontaler Vektor nur eine Koordinatendimension benötigt oder ein vertikaler, ist willkürlich festgelegt. Eine Datenbank ist "horizontal" ausgerichtet, d.h., die Datenfelder reihen sich in dieser Richtung. Damit erfolgt ihre Indizierung vertikal. In xl ist das genau andersherum, obwohl die meisten Tabellen ja dem klassischen DB-Listenaufbau folgen dürften und es deshalb auch viel mehr Zeilen als Spalten gibt.
Ein zellbereichsloser horizontaler Datenvektor ist in Xl stets 1dimensional*, alle anderen Typen wdn als (formal) 2dimensionale Matrizen abgebildet (sämtliche Bereichsbezüge fallen hierunter!). Wenn du diese xlBesonderheit nicht beachtest, wirst du keinen Erfolg haben! VBA und xl sind für die Praxis, nicht für die IT-Theorie ged[m]acht (für Letztere gibt's Besseres...)!
Aber offensichtlich hast du damit noch keine ausreichenden Erfahrungen sammeln können... ;-)
Gruß Luc :-?
*Anmerk: Überprüfe das mal mit UBound(...)! Die Indizes entsprechen hier Spalten! Sonst musst du UBound(..., 1) für Zeilen- und UBound(..., 2) für Spaltendimensionsobergrenze verwenden. Wenn's anders wäre, müsste ich nicht mit If IsError(UBound(..., 2)) Then... arbeiten, um Procs dimensionsflexibel zu gestalten...
meine Sicht hat bisher immer funktioniert.;-) o.T.
Tino
Dann hast du noch nichts "Richtiges"...
Luc:-?
...geschrieben, Tino...
Möge St.Bill deinen Glauben erhalten... ;-)
Gruß Luc :-)
PS: Manch Einer ist halt beratungsresistent, da kann man sich noch soviel Mühe geben... /:-|
AW: Dann hast du noch nichts "Richtiges"...
Tino
Hallo,
ich habe es schon hinbekommen eine msgbox mir anzeigen zu lassen, ist doch schon mal was.
An Dein Level komme ich natürlich nicht.
Gruß Tino
...Jetzt auch noch Tiefstapeln...! ;-) Gruß owT
Luc:-?
:-?
Hallo NoNet
Nur weil du einen Bereich als ganzes zuweist, heisst das in meinen Augen noch lange nicht, dass es dann zweidimensional ist :-)
Für das zweidimensionale fehlt mir einfach die bildliche Breite, heisst eine zweite Spalte
Option Explicit
Sub ArrayAusTabelle() Dim arVar() As Variant arVar = Array(Range("A1"), Range("A2"), Range("A3")) MsgBox arVar(2) End Sub
Gruss Rainer
In der Mathematik schreibt man die Elemente...
Luc:-?
...von Spaltenvektoren ggf untereinander. Wie soll xl das machen? Am Einfachsten wohl, indem es die "räumliche" Orientierung des Vektors in einer 2.Dimension angibt. "Bildliche Breite" ist da irrelevant — das ist keine xlKategorie! Im Übrigen hatte ich das in meinem Beitrag schon dar- bzw klargestellt...
Gruß Luc :-?
|