Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1308to1312
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

Array Problem

Array Problem
04.05.2013 02:58:25
Mustafa
Hallo zusammen,
ich bin gerade dabei den Umgang mit Arrays zu erlernen.
Ich lese den Bereich A2-A(letzte benutzte Zeile) mit folgendem Code in ein Array ein.

With Wks1
LngLetzteZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
Bereich1 = .Range(.Cells(2, 1), .Cells(LngLetzteZeile, 1)).Value
End With

Meine Frage diesbezüglich ist folgende:
Wie kann ich die einzelnen Werte in diesem Array ansprechen.
Danke im Voraus für alle helfenden.

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Normalerweise mit (zix, six) für zix => ...
04.05.2013 04:33:24
Luc:-?
…Zeilen- und six ⇒ SpaltenIndex, Mustafa.
Da die Werte aus einem Bereichsbezug stammen, wdn die Indizes wahrscheinl mit 1 beginnen (sonst 0). Außerdem liest VBA Datenfelder (Arrays ) unterschiedlicher Herkunft ggf auch unterschiedl aus → bei Bereichen Spalte vor Zeile, sonst umgekehrt (bei Schleifen zu beachten!). Desweiteren gibt's auch noch Variablen vom Typ Variant, die, falls sie Datenfelder enthalten, ggf alle stufenweise einzeln indexiert wdn müssen → (Ix1)(Ix2)(…) im Ggsatz zu sonst (Ix1, Ix2, …).
Real 1dimensionale VektorDFelder gibt's übrigens nur bei diesen (mit horizontaler Ausrichtung), sonst sind sie und alle echten Bereichsvektoren stets (mindestens) 2dimensional.
Morrn, Luc :-?

Anzeige
AW: Normalerweise mit (zix, six) für zix => ...
04.05.2013 05:01:03
Mustafa
Hallo Luc:-?
ich habe mal folgendes Probiert:
Sub testarray()
Dim bereich
Dim lngletzte As Long
Dim wks As Worksheet
Dim wert As Long
Set wks = Worksheets("Tabelle1")
With wks
lngletzte = .Cells(.Rows.Count, 1).End(xlUp).Row
bereich = .Range(.Cells(1, 1), Cells(lngletzte, 1)).Value
End With
For wert = LBound(bereich) To UBound(bereich)
Cells(wert, 2) = bereich(wert)
Next
End Sub
aber immer wieder steigt der aus mit dem fehler :
Indey ausserhab des gültigen Bereichs
wo ist da mein fehler drin ?

Gelöst :-)
04.05.2013 05:46:52
Mustafa
Danke dir für die Hilfe und ausführliche Erläuterung Luc :-?
nachdem ich den code so geändert habe funktionierte es:
Sub testarray()
Dim bereich
Dim lngletzte As Long
Dim wks As Worksheet
Dim wert As Long
Set wks = Worksheets("Tabelle1")
With wks
lngletzte = .Cells(.Rows.Count, 1).End(xlUp).Row
bereich = .Range(.Cells(1, 1), Cells(lngletzte, 1)).Value
End With
For wert = LBound(bereich) To UBound(bereich)
Cells(wert, 2) = bereich(wert, 1)
Next
End Sub

Anzeige
With und Punkte
04.05.2013 08:18:29
Erich
Hi Mustafa,
das Ausgangsproblem ist wohl gelöst, aber da können bei diesem Code weitere entstehen.
In der Zeile
bereich = .Range(.Cells(1, 1), Cells(lngletzte, 1)).Value
fehlt vor dem 2. Cells der Punkt. Damit muss Cells(lngletzte, 1) nicht zum Blatt wks gehören,
sondern zu dem Blatt, in dem der Code steht oder
dem gerade aktiven Blatt, wenn der Code in einem normalen Modul steht. So sollte es sein:
bereich = .Range(.Cells(1, 1), .Cells(lngletzte, 1)).Value
Evtl. ein weiteres Problem: Die With-Klammer endet vor der For-Schleife. In welchem Blatt soll
Cells(wert, 2) = bereich(wert, 1)
ausgeführt werden?
Besser wäre

Sub testarray()
Dim bereich
Dim lngletzte As Long
Dim wks As Worksheet
Dim wert As Long
Set wks = Worksheets("Tabelle1")
With wks
lngletzte = .Cells(.Rows.Count, 1).End(xlUp).Row
bereich = .Range(.Cells(1, 1), .Cells(lngletzte, 1)).Value
For wert = LBound(bereich) To UBound(bereich)
.Cells(wert, 2) = bereich(wert, 1)
Next
End With
End Sub
'oder (wenn Ausgabe auf einem anderen Blatt)
Sub testarray()
Dim bereich
Dim lngletzte As Long
Dim wert As Long
With Worksheets("Tabelle1")
lngletzte = .Cells(.Rows.Count, 1).End(xlUp).Row
bereich = .Range(.Cells(1, 1), .Cells(lngletzte, 1)).Value
End With
With Worksheets("Tabelle2")
For wert = LBound(bereich) To UBound(bereich)
.Cells(wert, 2) = bereich(wert, 1)
Next
End With
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich und: Schönes Wochenende allerseits!

Anzeige
Na, also! War doch gut so! Aber auch ...
04.05.2013 16:59:06
Luc:-?
…Erichs Anmerkungen beachten, Mustafa!
Gruß + schöWE, Luc :-?

AW: Na, also! War doch gut so! Aber auch ...
05.05.2013 22:31:42
Mustafa
Hallo Erich und Luc:-? ,
der Code war nur ein Test wo das With etc. keinerlei Auswirkung oder Bedeutung hatte, da eh alles in ein und dem selben TB lief.
Aber trotzdem vielen dank euch beiden für die Info, ich werde mir Mühe geben auch in meinen Testcodes stets auf das richtige TB zu verweisen um später keine selbsteingebauten Fehler in meinen Codes zu haben.
PS: In diesem Forum werden sie geholfen :-)
Gruß aus der Domstadt Köln.

Ach, übrigens, meine Klammeranmerkung ...
06.05.2013 23:37:57
Luc:-?
bei Schleifen zu beachten, gilt für For Each-Zyklen, in denen nebenher ein Index für Übernahme der Datenfeld-Elemente in Matrix-Elemente gebildet wdn soll, Mustafa.
Außerdem kann der erwähnte 1dimensionale Datenfeldvektor nur dann auf dem TabBlatt ausgegeben wdn, wenn seine Elemente aus Skalaren (0dimensional) bestehen. Ansonsten können nur 2dimensionale (also vertikale) Vektoren, deren Elemente max 1dimensional sind (Skalare und horizontale Datenfeldvektoren) direkt auf das TabBlatt ausgegeben wdn, denn nur diese können als normale (x,y)-xlMatrix dargestellt wdn. Alle anderen Datenfeldstrukturen erzeugen auf dem TabBlatt einen F-Wert, obwohl sie in VBA-Prozeduren durchaus sinnvoll sein und auch verarbeitet wdn können.
Gruß Luc :-?

Anzeige
Es ging...
07.05.2013 01:23:02
Mustafa
mir bei dem Versuch auch um eine Auswertung via VBA.
Da ich hier über das Forum mitbekommen habe das Berechnungen über Arrays schneller laufen als über direkte Zellbezüge, wollte ich die zur Berechnung erforderlichen Werte in Arrays einlesen und über diese dann die Berechnungen durchführen.
Mit eurer Hilfe habe ich es jetzt auch erfolgreich eingebunden in meinen Code.
Nochmals danke für die ausführliche Einweisung in die Funktionsweise von Arrays.
So habe ich dieses Forum kennen gelernt und versuche mein erlerntes auch hier zum besten zu geben.
Was den Vorteil hat, das ich immer wieder neues dazulerne und nicht einroste.
Gruß Mustafa

Anzeige
Bist'n dankbarer 'Kunde', stets wach, schnell ...
07.05.2013 01:37:44
Luc:-?
…und omnipräsent, Mustafa! ;-)
Gute Nacht! Luc :-?

OT: Bin nachtschichtler :-)
07.05.2013 01:44:40
Mustafa
also stets nur ab 23 Uhr hier antreffbar, nicht wie manch einer den ich hier tags wie nachts mal lesen kann :-)
Aber wenn ich eine Frage stelle oder zu einem Frage versuche eine Antwort zu liefern dann bleibe ich auch ständig am Ball, ich denke das gehört zu diesem Forum, wie das A und O zum Alphabet.
Gruß Mustafa

Wenn das mal alle so sähen...! ;-) owT
07.05.2013 01:49:31
Luc:-?
:-?

Na, da wir hier so nett plaudern, noch eine ...
07.05.2013 14:58:29
Luc:-?
…Zugabe, Mustafa;
mal als Bsp, wie man auch noch ein Datenfeld erzeugen könnte, das dann aber immer ein horizontal-gerichteter (also 1dimensionaler) Vektor ist, dessen Elemente ebenfalls aus beliebigen Datenfeldern bestehen können.
Rem Erzeugt DatenFeld aus Ausdruck-Ergebnissen bzw Bereichen
'   o/m ZwischenSpeicherg desselben; Arg1: fehlt/leer keine,
'   =0 alleinige ZwiSpeicherg in einer Formel, sonst mehrere
'   separate ZwiSpeichrgg (0
'   m.Speichrg) - Dezimale f.DF-Elem-Indizrg, enthält DF nur
'   1 Elem, gilt Arg2 nur dafür, auch ±0.0/0,0 als Text mögl
'   f.Zusfass v.Arg3-Vektt zu Mx (anderenfalls kn d.Ergebnis
'   nicht m.ZFml abgebildet wdn); Arg3: DF-Elemente (Skalar/
'   Vektor/Matrix), fehlt bewirkt Ergebn aus ZwiSpeicherg lt
'   Argg1/2 (o.erneute ZwiSpeicherg)! B.DirektAufruf in Sub-
'   proz fehlendes Arg1 als Null bzw ggf 0/""/Empty (f.Lösch
'   gesamt ZwiSpeicherInhalts), Arg2 als Null/Empty angeben,
'   da ds eigtl opt sind, aber vor Arg3ff nicht sein dürfen!
'   Falls d.FktsErgebn nur ein 1elementiger Vektor ist, wird
'   es zwecks EinsatzUniversalität in 1 Skalar (bzw 1zlText)
'   umgewandelt (ist zB b.xlFktt ZEILE/SPALTE nicht d.Fall)!
'   Vs1.8 -LSr -cd:20130423 -1pub:20130507herber -lupd:20130506t
Function Collect(ByVal ZwiSpIx, ByVal AuswElem, ParamArray Ausdruck())
Static dTz As String, ZwiSp As Variant
Dim relMix As Long, relNix As Long, relPix As Long, relSix As Long, _
isMxPos As Boolean, isNoExp As Boolean, isNoInst As Boolean, _
isNoPos As Boolean, isNoRest As Boolean, isSecSt As Boolean, _
elVec, erg, tmZwiSp, zwErg As Variant
On Error GoTo fx
If dTz = "" Then dTz = Application.International(xlDecimalSeparator)
isNoExp = IsMissing(Ausdruck): isNoPos = IsMissing(AuswElem)
If Not isNoPos And (IsNull(AuswElem) Or _
IsEmpty(AuswElem)) Then isNoPos = True
If IsMissing(ZwiSpIx) Or IsNull(ZwiSpIx) Then
isNoRest = True: isNoInst = True
ElseIf IsError(ZwiSpIx) Then
Err.Raise CLng(ZwiSpIx)
ElseIf ZwiSpIx = "" Or IsEmpty(ZwiSpIx) Then
isNoRest = True: isNoInst = True: ZwiSp = Empty
ElseIf IsNumeric(ZwiSpIx) Then
Let isNoInst = ZwiSpIx = 0: isNoRest = isNoExp
If Not isNoInst Then
relSix = Abs(ZwiSpIx) - 1
If Not isNoRest Then
If IsEmpty(ZwiSp) Then
ReDim ZwiSp(relSix)
ElseIf IsArray(ZwiSp) Then
If relSix > UBound(ZwiSp) Then ReDim Preserve ZwiSp(relSix)
Else: tmZwiSp = ZwiSp: ReDim ZwiSp(relSix): ZwiSp(0) = tmZwiSp
End If
If CLng(ZwiSpIx)  0: isMxPos = Abs(CDbl(AuswElem))  relPix
If IsArray(zwErg) Then
If CBool(relPix) Then
If LBound(zwErg) = UBound(zwErg) Then _
erg = zwErg(LBound(zwErg)) Else erg = zwErg
With WorksheetFunction
If isMxPos And IsArray(erg) Then
On Error Resume Next
If IsError(LBound(erg, 2)) Then
tmZwiSp = erg(LBound(erg))
If IsError(LBound(tmZwiSp)) Then
On Error GoTo fx: Err.Raise xlErrRef
Else: On Error GoTo fx
relPix = .Min(.Max(LBound(erg), relPix - 1 + LBound(erg)), _
UBound(erg))
tmZwiSp = erg(relPix)
relMix = .Min(.Max(LBound(tmZwiSp), CLng(Split(AuswElem, _
dTz)(1)) - 1 + LBound(tmZwiSp)), UBound(tmZwiSp))
End If
Collect = erg(relPix)(relMix)
Else: On Error GoTo fx                              'noch testen !!!
relMix = .Min(.Max(LBound(erg, 2), CLng(Mid(CStr(Abs(AuswElem) - _
relPix), 3)) - 1 + LBound(erg, 2)), UBound(erg, 2))
relPix = .Min(.Max(LBound(erg), relPix - 1 + LBound(erg)), _
UBound(erg))
Collect = erg(relPix, relMix)
End If
ElseIf IsArray(erg) Then
relPix = .Min(.Max(LBound(erg), relPix - 1 + LBound(erg)), UBound(erg))
Collect = erg(relPix)
Else: Collect = erg
End If
End With
ElseIf Replace(Replace(AuswElem, dTz, "."), "-", "") = "0.0" Then
On Error Resume Next
isSecSt = Left(AuswElem, 1)  "-": tmZwiSp = Ausdruck(relPix)
If IsError(LBound(tmZwiSp, 2)) Then
On Error GoTo fx
Else: On Error GoTo fx
If LBound(tmZwiSp, 2) = UBound(tmZwiSp, 2) Then Else Err.Raise xlErrRef
End If
relMix = UBound(tmZwiSp) - LBound(tmZwiSp): ReDim tmZwiSp(relMix, relPix)
For relPix = relPix To UBound(Ausdruck)
relNix = 0: ReDim Preserve tmZwiSp(relMix, relPix)
For Each elVec In Ausdruck(relPix)
If relNix > relMix Then Exit For
tmZwiSp(relNix, relPix) = elVec
relNix = relNix + 1
Next elVec
If Not IsEmpty(elVec) Then Exit For
Next relPix
If UBound(tmZwiSp, 2)  xlErrNA:   Collect = CVErr(xlErrNA)
Case Else:           Collect = CVErr(Err.Number)
End Select
End If
End Function
Das ist quasi eine Vorabversion einer meiner neuesten Kreationen (die allerdings doch schon etliche Entwicklungsstufen durchlaufen hatte bis sie einigermaßen zufriedenstellend fktionierte), mit der man beliebige Datenfelder (bspw aus Ausdrücken)* und Bereiche „einsammeln“ kann. Ihre volle Kapazität erreicht sie iaR nur bei Verwendung in Subprozeduren. Als UDF in ZellFmln folgt sie meinen zuvor gegebenen Hinweisen zu DFeldern — sie kann auf Grund der primären 1Dimensionalität des ParamArray-Vektors entweder nur mehrere Skalare oder nur einen Vektor bzw Matrix als Argument3 im TabBlatt wiedergeben (merke: mit Angabe eines Bereichs als Arg eines ParamArrays belegt man stets nur ein Element desselben, niemals mehrere [mit seinen EinzelZellen]!). Deshalb habe ich das Arg2 vorgesehen, mit dem man eine WiedergabeAuswahl treffen kann (INDEX-Fkt würde nicht wirken, da sie als Arg1 schon einen F-Wert bekäme). Außerdem lassen sich auch mehrere vertikal orientierte Vektoren zu einer klassischen Matrix vereinen (Arg2="0,0" bzw "-0,0").
Bei Verwendung in einer Subroutine könnten so auch Bereiche mehrerer Blätter in einem Variablen-Variant gehalten wdn (noch nicht getestet!). Im TabBlatt wäre das nur sinnvoll, wenn nacheinander aus dem erzeugten Variant gewählt wdn kann. Deshalb habe ich noch Arg1 hinzugefügt, mit dem eine quasi Zwischenspeicherungsebene für das FktsErgebnis festgelegt wdn kann, so dass man in gleicher Fml darauf zurückgreifen kann.
Falls du an der UDF interessiert bist und noch fragen hast oder dir beim Testen etwas auffällt, kannst du dich ja noch mal melden.
* Ein Ausdruck und damit ein vom ZellBereich losgelöstes Datenfeld entsteht schon durch die Notation --A1:B2 und kann deshalb von neueren xlFktt, die zwingend einen Bereichsbezug verlangen, wie RANG, ZÄHLENWENN u.a. nicht verarbeitet wdn — von Collect aber schon!
Viel Spaß, Luc :-?

Anzeige
Da muss ich...
08.05.2013 02:29:11
Mustafa
mir ja eine ruhige "Minute" gönnen um diesen "sehr leichten" Code einmal auf die schnelle zu entschlüsseln :-)
Aber ich fürchte aus der ruhigen Minute können bei dem Code auch mal ganz schnell ein paar Stunden bis Tage werden.
Aber es ist eine sehr interessante Sache wenn man weiss was man damit alles anstellen kann.
Mit sicherheit wird sich etwas finden wo ich deinen Code mal einbinden und ausgiebig testen kann.
Gruß Mustafa

Na, dann gönne sie dir mal, ...
08.05.2013 12:59:26
Luc:-?
…Mustafa,
hast ja möglicherweise nachts auch noch Zeit dafür… ;-)
Wenn du die UDF mal in einer ZellFml einsetzt, musst du natürlich genau überlegen, was du als Argg1+2 angibst, vor allem, wenn du sie mehrfach in einer ZFml verwendest – mal mit (mehreren) Argg3 mal ohne diese. Da kann man sich leicht vertun und muss ggf auch ein bisschen probieren. Aber man lernt dadurch gut den Umgang mit Datenfeldern (Arrays ) und was da so alles möglich bzw nicht möglich (in Bezug auf Xl, nicht unbedingt VBA!) ist. Manches Datenfeld in Xl wird nämlich extern gesteuert (nicht durch die Fkt/Fml selbst – häufig bei INDEX der Fall), das kann man unter VBA kaum nachbilden (hier muss alles die Fkt machen), ist dieser Steuerung mit einer UDF in ZellFmln aber natürlich in gewisser Weise doch unterworfen.
Übrigens, richtig interessant wird's, wenn man eine ZellFml mit einer UDF evaluiert (macht wohl sonst niemand!)… Allerdings gibt's dabei auch Größenbeschränkungen (gerade auch bei DFeldern), weshalb man nicht alles evaluieren kann.
Gruß Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige