Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1084to1088
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Datenarray in Variant / Programmiertechnik

Datenarray in Variant / Programmiertechnik
Wolli
Hallo zusammen,
ich habe drei Zeichenketten in A1:A3 stehen und möchte diese in als Array in eine Variant-Variable packen. Hintergrund ist (neben allgemeiner Neugier), dass die Range.Consolidate-Methode als "Sources"-Parameter eine Quellenliste als Variant verlangt. Diese Liste pflege ich im Tabellenblatt und möchte sie in die Funktion hineinnehmen.
Die einzige Lösung, die mir bekannt ist, wäre
x = Array(Range("A1"), Range("A2"), Range("A3"))
Ist das vielleicht eleganter / mit einer Schleife zu lösen? Oder MUSS ich von vornherein mit einem Datenfeld arbeiten?
Danke für Anregungen, Grüße, Wolli
Array aus Tabelle erzeugen
06.07.2009 12:34:16
NoNet
Hallo Wolli,
vielleicht hilft Dir dieses Beispiel weiter :
VBA-Code:
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

 AB
1a1
2b2
3c3


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... ;-)

Alles klar!
Wolli

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...
Userbild
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...
Userbild
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 SummenProduktrichtig 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 Spalten­dimensions­obergrenze 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:-?

:-?
Abgelehnt :-)
Ramses

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 :-?
(noch offen)
Wolli

.
Anzeige
AW: Array aus Tabelle erzeugen
06.07.2009 12:49:11
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
06.07.2009 13:14:48
Ramses
Hallo
Das ist ein eindimensionales Array, weil du nur eine Spalte zuweist
Tabelle1

 AB
1a1
2b2
3c3


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
Anzeige
@Ramses : Widersrpuch...
06.07.2009 13:35:01
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

Anzeige
Du hast recht, NoNet! Allerdings kennt xl...
06.07.2009 14:23:11
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 :-?
Anzeige
Das möchte ich so nicht stehen lassen...
06.07.2009 15:36:54
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
Anzeige
Trotzdem funktioniert...
06.07.2009 17:23:38
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... ;-)

Anzeige
Alles klar!
08.07.2009 13:22:35
Wolli
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

Anzeige
Wo soll andere Dimension sein?
06.07.2009 16:17:13
Tino
Hallo,
für mich ist es eindimensional solang diese aus einer Spalte besteht.
Gruß Tino
Unter Dimension verstehe ich hier die...
07.07.2009 01:41:38
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...
Userbild
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 :-?

Anzeige
AW: Unter Dimension verstehe ich hier die...
07.07.2009 07:56:00
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...
Userbild
Gruß Tino
Anzeige
Deine Sicht nutzt dir nichts,...
07.07.2009 13:35:20
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 SummenProduktrichtig 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 Spalten­dimensions­obergrenze 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.
07.07.2009 13:58:33
Tino
Dann hast du noch nichts "Richtiges"...
07.07.2009 17:57:19
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"...
07.07.2009 18:12:38
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
10.07.2009 02:54:07
Luc:-?
:-?
Abgelehnt :-)
06.07.2009 14:53:03
Ramses
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...
06.07.2009 15:08:57
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 :-?
(noch offen)
06.07.2009 12:50:05
Wolli
.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige