Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1316to1320
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 die Xte

Array die Xte
24.06.2013 16:06:47
JACKD
Hallo Gemeinde ich hab langsam den Eindruck ich kapier es nicht..
Ich versuch mich seit 2h an einem Array was übergeben werden soll
Sub feldar()
Dim dFeld As Variant
Dim dFeldNeu() As Variant
With Worksheets("ALT")
dFeld = .Range("F2:F8").Value
ReDim dFeldNeu(UBound(dFeld))
i = 0
For Each Zelle In dFeld
.Range("P" & i + 2) = (Left(Zelle, 4))
i = i + 1
Next
End With
End Sub
Vorab, das Makro macht das was es soll. Aber eben nicht so wie ich es gern hätte =)
Und zwar liesst er ein Datenfeld ein dFeld = .Range("F2:F8").Value
Funktioniert. (Hier sind 8 - Stellige Strings drin)
Jetzt wollte ich die im ersten Schritt mal zerlegen und 2 Vektoren daraus machen
(einmal links & 1 mal rechts) Jedoch bekomme ich die Werte nicht übergeben.
Ist jetzt etwas krakelig über die Zellen
wäre nochmal jemand so nett, mir zu erklären wie ich das gelöst bekomme?
Mit ner Schleife (so wie sie jetzt ist, krieg ichs hin, allerdings hab ich mir sagen lassen das For each "besser" sei (sofern ich das wenigstens verstanden hab))
Grüße und vielen Dank

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array die Xte
24.06.2013 16:14:33
ransi
Hallo Jack
Anhand deiner Beschreibung kann ich nur raten ...
So ?
' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Sub feldar()
    Dim dFeld As Variant
    Dim dFeldNeu() As Variant
    Dim L As Long
    With Worksheets("ALT")
        dFeld = .Range("F2:F8").Value
        Redim dFeldNeu(1 To UBound(dFeld), 1 To 2)
        For L = LBound(dFeld) To UBound(dFeld)
            dFeldNeu(L, 1) = (Left(dFeld(L, 1), 4))
            dFeldNeu(L, 2) = (Right(dFeld(L, 1), 4))
        Next
        .Range("G2:H8") = dFeldNeu
    End With
End Sub


ransi

Anzeige
Schrecklich ..
24.06.2013 16:26:00
JACKD
Gut geraten Ransi..
Ja das ist auch das was ich mir vorgestellt hab..
Sieht auch eigentlich dast so aus wie mein Code (bevor ich die "i's" eingeführt hab
Ich begeb mich mal auf die suche was ich falsch geamcht hab -.-
Danke einstweilen
Grüße

Ja? Ist doch gar nicht so heiß, Jack! ;-) orT
24.06.2013 16:48:48
Luc:-?
(Dazu komme ich viell noch!)
Gruß Luc :-?

AW: Ja? Ist doch gar nicht so heiß, Jack! ;-) orT
24.06.2013 16:59:26
JACKD
Ich weeß.. aber irgendwie erschliesst sich mir das Thema nur Stückweise Luc.?
Und ich hab deinen Text jetzt gefühlte 500 mal gelesen, steig aber nicht so recht dahinter, und hab mir so gedacht, ich probier einfach mal paar dinge.. (und scheitere schon beim ersten Beispiel)
Da kann ich mal ne Frage gleich loswerden.
Gibt es ein gutes Excel VBA Buch? Ohne jetzt auf Glaubensfragen hinaus zu wollen.
Ich find ja die ForDummies Reihe gut (da es sehr plastisch ist) hat das schonmal jemand in Sachen VBA gesichtet?
Grüße

Anzeige
Das Einzige, was ich mir auf dem Gebiet ...
24.06.2013 19:35:58
Luc:-?
…jemals zugelegt hatte, Jack,
war ein ganz schmales Heftchen mit Grundlegendem. Aber das ist auch schon 15-16 Jahre her… ;-)
Weiteres ggf später.
Dito, Luc :-?

Vorab, das, was du hier machst, sollte ...
25.06.2013 04:27:08
Luc:-?
…und wird wohl auch fktionieren, Jack,
aber du willst wohl erst ein neues DFeld als Vektor, dessen Elemente ebenfalls aus Vektoren bestehen, kreieren. Hierbei kann man so vorgehen, wie Ransi es zeigt, aber dadurch entsteht eine reguläre Matrix, deren Spalten bzw Zeilen nicht oW isoliert wdn können, weshalb ich dir hier mal eine Alternative zeige:
Sub feldar()
Const adQBer$ = "F2:F8", adZBer$ = "P2:Q8"    'QBer nur als Vektor!
Dim i As Long, dFeld, dFeldNeu(), Elem As Variant, Wsh As Worksheet
On Error Resume Next
Set Wsh = Worksheets("ALT")
dFeld = Wsh.Range(adQBer).Value
If IsError(LBound(dFeld, 2)) Or UBound(dFeld, 2)  LBound(dFeld, 2)) Then
dFeld = WorksheetFunction.Transpose(dFeld)
If UBound(dFeld, 2)  LBound(dFeld, 2)) Then GoTo ex
End If
ReDim dFeldNeu(UBound(dFeld, 1) - LBound(dFeld, 1), 0)
For Each Elem In dFeld
dFeldNeu(i, 0) = Array(Left(Elem, 4), Right(Elem, 4))
i = i + 1
Next Elem
Wsh.Range(adZBer) = dFeldNeu
ex: Set Wsh = Nothing
End Sub
Allerdings kannst du so nicht einen Vektor der linken und einen der rechten Zellwerte des Quellbereichs isolieren, um sie zB „auf einen Rutsch“ in getrennte (hier) Spalten zu speichern. Aber das Speichern in voneinander getrennte Zeilen wäre möglich, zB: Wsh.Range("P2:Q2") = dFeldNeu(0, 0) und Wsh.Range("S2:T2") = dFeldNeu(1, 0)… Für den erstgenannten Fall müssten die Teil-Arrays andersherum organisiert wdn. Also bspw so …
    …
ReDim dFeldNeu(1)
For Each Elem In dFeld
dFeldNeu(0) = dFeldNeu(0) & " " & Left(Elem, 4)
dFeldNeu(1) = dFeldNeu(1) & " " & Right(Elem, 4)
Next Elem
With WorksheetFunction
dFeldNeu(0) = .Transpose(Split(LTrim(dFeldNeu(0))))
dFeldNeu(1) = .Transpose(Split(LTrim(dFeldNeu(1))))
End With
Wsh.Range(adZBer) = dFeldNeu
…
Mit Wsh.Range("P2:P8") = dFeldNeu(0) könnte man so diese Zellen mit den linken Textteilen belegen und für die rechten zB Wsh.Range("T2:T8") = dFeldNeu(1) wählen.
Morrn, Luc :-?

Anzeige
AW: Vorab, das, was du hier machst, sollte ...
25.06.2013 09:47:02
JACKD
Moin Moin der Herr Luc: =)
Danke für deine Anmerkung.
Und ja, es Funktioniert was ich mache. Aber wie du schon festgestellt hast, wollte ich das anders lösen =)
Die Lösung mit deinem Array finde ich schön. (mal davon abgesehen dass du mir paar Synataxfehler eingebaut hast um mich zu testen :-D )
Allerdings schreibt er es nicht in die Tabelle.

Wsh.Range(adZBer) = dFeldNeu

macht gar nix.. der Bereich bleibt leer ... Hab ich auch schonmal gehabt das Problem, konnte es aber nicht lösen
Vielleicht fällt dir ja was dazu ein?
Grüße und vielen Dank

Anzeige
Tut mir leid, da ist beim Ändern 'ne Klammer ...
25.06.2013 18:26:04
Luc:-?
…stehen geblieben, die beim nächsten Befehl mit übernommen wurde, Jack;
allerdings hat der Code auch erst jetzt den VBE „gesehen“… ;-)
Tja, das eigentliche Problem entsteht dadurch, dass quasi eine irreguläre Matrix erzeugt wird. In einer Fktsprozedur geht das mitunter trotzdem bei ungleicher Ausrichtung von Primär- und SekundärVektor(en) (habe so etwas stets für und mit UDFs entwickelt, die außerdem Elemente enthielten – ggf auch extern in der ZellFml –, die das dann garantierten); offensichtlich fktioniert das aber nicht in SubProzz bei DirektEintrag in einen Bereich. Hier müssten tatsächlich alle mit dFeldNeu(i, 0) = Array(Left(Elem, 4), Right(Elem, 4)) entstehenden HorizontalVektoren sofort in einen ZielTeilBereich eingetragen wdn, also bspw innerhalb der Schleife vor i-Erhöhung mit Wsh.Range(adZBer).Rows(2 * i + 1) = dFeldNeu(i, 0). Der rote Teil kann entfallen, wenn der Zielbereich lückenlos gefüllt wdn soll. Anderenfalls sollte noch die Konstante adZBer auf "P2:Q12" geändert wdn. Wsh.Range(adZBer) = dFeldNeu entfällt dann natürlich! In der anderen Variante dürften dann auch nur die beiden Einzelvektoren separat ausgebbar sein. Das kannst du ja mal testen.
Übrigens hatte ich hier noch eine Ergänzung zum anderen Thread geschrieben. Allerdings wird das wohl auch nur bei regulären Vektoren/Matrizen so fktionieren. Mit der UDF Collect sollte es aber immer klappen, wenn sie richtig argumentiert wird.
Gruß Luc :-?

Anzeige
Geneigter Leser, vgl auch ...
25.06.2013 18:40:58
Luc:-?
hier!
Luc :-?

Und ich dachte
26.06.2013 14:16:35
JACKD
... schon du willst mich testen Luc =)
Werd das bei Gelegenheit mal testen (und mich dann vertrauensvoll) wieder an dich wenden
einstweilen vielen Dank
Grüße

Übrigens fktioniert das auch so wie ...
26.06.2013 02:55:48
Luc:-?
…ursprünglich vorgegeben, Jack;
ich hatte nur nicht gewärtigt, dass Xl solche Fälle unabhängig von der Ausrichtung der Vektoren richtig behandelt → sind die Sekundärvektoren horizontal, wird der Primärvektor als vertikal interpretiert, denn er ist ja nicht wirklich eigenständig, sondern stellt eben die Gesamtheit der Sekundärvektoren dar. Hier kommt es also eher darauf an, dass er wirklich 1dimensional deklariert wird, alsdo ReDim dFeldNeu(UBound(dFeld, 1) - LBound(dFeld, 1)) und demzufolge natürlich dFeldNeu(i) = Array(Left(Elem, 4), Right(Elem, 4)). Allerdings stellt sich Xl hierbei im Ggsatz zu Fktsprozz immer noch stur, so dass die Ausgabezeile With WorksheetFunction: Wsh.Range(adZBer) = .Transpose(.Transpose(dFeldNeu)): End With lauten muss. Dadurch wird wohl auch in eine reguläre Matrix transformiert. (Übrigens, in der 2.Variante - mit SofortAusgabe - muss es ggf natürlich adZBer$ = "P2:Q14" heißen!)
In der alternativen 2.Variante mit EndAusgabe entfällt so dass .Transpose für dFeldNeu(0) und (1), während die Ausgabezeile dann Wsh.Range(adZBer) = WorksheetFunction.Transpose(dFeldNeu) lauten muss.
Mit einer UDF sieht's da etwas günstiger aus, wenn sie in einer ZellFml verwendet wird → P2:Q8:{=TdFeld(F2:F8)} für …
Function TdFeld(ByVal Bezug)
Dim i As Long, dFeld, dFeldNeu(), Elem As Variant
On Error Resume Next
If TypeName(Bezug) = "Range" Then dFeld = Bezug.Value Else dFeld = Bezug
If IsError(LBound(dFeld, 2)) Or UBound(dFeld, 2)  LBound(dFeld, 2) Then
dFeld = WorksheetFunction.Transpose(dFeld)
If UBound(dFeld, 2)  LBound(dFeld, 2) Then TdFeld = CVErr(xlErrNull): Exit Function
End If
ReDim dFeldNeu(UBound(dFeld, 1) - LBound(dFeld, 1))
For Each Elem In dFeld
dFeldNeu(i) = Array(Left(Elem, 4), Right(Elem, 4)): i = i + 1
Next Elem
TdFeld = dFeldNeu
End Function
Morrn, Luc :-?

Anzeige
Das wäre dann auch der einzige Fall ...
27.06.2013 04:21:26
Luc:-?
…eines 1dimensionalen vertikalen DFeldVektors, Jack & Interessenten;
also ein (Primär-)Vektor, dessen Elemente ebenfalls (Sekundär-)Vektoren sind und dadurch in ihrer Gesamtheit eine irreguläre Matrix bilden, deren Zeilen oder Spalten einzeln abrufbar sind.
Morrn, Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige