Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1300to1304
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 zweidimensional

Array zweidimensional
06.03.2013 00:03:00
Andi
Hi,
ich stehe gerade etwas auf dem Schlauch was Arrays betrifft.
In Spalte A stehen manchmal Zahlen und manchmal Buchstaben. In Spalte C stehen Werte dazu (allerdings stehen auch manchmal Werte in Spalte C obwohl in der gleichen Zeile in Spalte A keine Zahl steht).
Ich möchte nun alle Zahlen der Spalte A und die entsprechenden Werte der Spalte C in ein Array laden.
Die Länge des Arrays ist variabel bzw. sollte es sein.
Kann mir hier jemand einen Tipp geben?
Das Problem an ReDim ist ja, dass ich eine bestimmte Länge angeben muss, damit ich das Array befüllen kann bzw. eine "Zeile" hinzuzufügen.
Mfg. Andi

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array zweidimensional
06.03.2013 01:02:02
Erich
Hi Andi,
meinst du so etwas?
 ABCDEF
15 Q 5Q
212 W 12W
3adaD E 1,5U
4  R 0,02569444P
5WAHR T   
6SDF Z   
71,5 U   
806.03.2013 I   
9: O   
1000:37 P   
11  Ü   


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Die Ausgabe erfolgt ab Zelle E1. Ein wenig verwundert, dass das Datum in A8 nicht als Zahl erkannt wird,
die Uhrzeit in A10 aber wohl. Bei der Zuweisung
arrA = Cells(1, 1).Resize(Cells(Rows.Count, 1).End(xlUp).Row, 3)
wird die Uhrzeit in einen Double-Wert arrA(10,1) umgewandelt, das Datum wird zum Variant/Date arrA(8,1).
Und hier der Code: Option Explicit Sub MatrixNum() Dim arrA, ii As Long, aa As Long, arrE() arrA = Cells(1, 1).Resize(Cells(Rows.Count, 1).End(xlUp).Row, 3) For ii = 1 To UBound(arrA) If Application.IsNumber(arrA(ii, 1)) Then aa = aa + 1 ' Anzahl Zahlen in A Next ii ReDim arrE(1 To aa, 1 To 2) ' ReDim Ergebnismatrix aa = 0 For ii = 1 To UBound(arrA) If Application.IsNumber(arrA(ii, 1)) Then ' Fülle Ergebnismatrix aa = aa + 1 arrE(aa, 1) = arrA(ii, 1) arrE(aa, 2) = arrA(ii, 3) End If Next ii Cells(1, 5).Resize(UBound(arrE), 2) = arrE ' Ausgabe End Sub Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Array zweidimensional
06.03.2013 01:34:21
Daniel
Hi
probiers mal so:
dim DeinArray
dim Zelle as Range
dim Bereich as Range
dim ze as long
set Bereich = Columns(1).SpecialCells(xlcelltypeconstants, 1)
Redim DeinArray(1 to Bereich.Cells.count, 1 to 2)
For each Zelle in Bereich
ze = ze + 1
DeinArray(ze, 1) = Zelle.Value
DeinArray(ze, 2) = Zelle.Offset(0, 2).Value
Next
Gruß Daniel

Erich füllt das Datenfeld wie ...
08.03.2013 02:37:26
Luc:-?
…wahrscheinlich gewünscht, Daniel,
dein Code wählt alles (außer wohl Leerzellen; nebenbei, auch FmlErgebnisse → OK für SpecialCells?).
Was haltet ihr von folgender Alternative…?
Option Explicit
Rem Vs1.0 -Luc:-? -cd:20130308 -1pub:dito(herber) -lupd:dito
Function Pair4Num(ByVal Bezug1, ByVal Bezug2, Optional ByVal lfdNr As Boolean)
Dim ze As Long, zl As Long, arBer1, arBer2, arPaar(), zw
On Error Resume Next
With WorksheetFunction
arBer1 = .Transpose(Bezug1)
If IsError(LBound(arBer1, 2)) Then Else arBer1 = .Transpose(arBer1)
arBer2 = .Transpose(Bezug2)
If IsError(LBound(arBer2, 2)) Then Else arBer2 = .Transpose(arBer2)
If IsError(LBound(arBer1, 2)) And IsError(LBound(arBer2, 2)) Then _
Else Pair4Num = CVErr(xlErrRef): Exit Function
End With
zl = LBound(arBer1)
For Each zw In arBer1
If IsNumeric(zw) And Not IsEmpty(zw) Then
ReDim Preserve arPaar(ze)
If lfdNr Then
arPaar(ze) = Array(ze, zw, arBer2(zl))
Else: arPaar(ze) = Array(zw, arBer2(zl))
End If
ze = ze + 1
End If
zl = zl + 1
Next zw
Pair4Num = arPaar
End Function
Wenn man nicht das Endergebnis der Fkt in einer For Each-Schleife aufruft, sondern sie direkt darin verwendet (zB For Each p In Pair4Num(Bezug1, Bezug2, True) ), gibt's einen interessanten Effekt, der in der im Web zugänglichen Literatur nirgendwo beschrieben wird. Nur im Herber-Forumsarchiv wurde das vor Jahren schon mal erwähnt… ;-)
Gruß Luc :-?
(Bin erst mal wieder da!)

Anzeige
@Luc - Effekt?
09.03.2013 09:45:06
Erich
Hi Luc,
nach dem "interessanten Effekt" habe ich ein wenig gesucht, aber nichts Auffälliges gefunden,
auch nicht hierbei:

Sub Effekt()
Dim pp, qq
pp = Pair4Num(Range("A1:A10"), Range("C1:C11"), True)
For Each qq In Pair4Num(Range("A1:A10"), Range("C1:C11"), True)
Next qq
End Sub
Was für einen Effekt meinst du?
Ich wünsch dir ein schönes WoEnd!
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Das ist ja auch zu wenig, ...
09.03.2013 12:53:09
Luc:-?
…Erich;
du solltest qq wenigstens auch mal in der Schleife anzusprechen versuchen, um irgendetwas damit zu machen. Dann merkst du das schnell. Das ist so ähnlich wie meine Frage neulich. Hatte das schon mal vor Jahren angesprochen. Damals hat nur Renée, die sich ja nun leider schon den wohl 2.Winter nicht mehr gemeldet hat { :-( }, begriffen, was ich meine… ;-)
Dir wünsche ich natürlich auch ein schönes WE, Erich!
Gruß Luc :-?

Anzeige
Ich begreif's immer noch nicht...
09.03.2013 13:55:46
Erich
Hi Luc,
auch hierbei sehe ich keinen interessanten Effekt:

Sub aaaaa()
Dim pp, qq, ss As Double, tt As Double
pp = Pair4Num(Range("A1:A10"), Range("C1:C11"), True)
For Each qq In Pair4Num(Range("A1:A10"), Range("C1:C11"), True)
If IsNumeric(qq(1)) Then ss = ss + qq(1)
tt = tt + Application.Sum(qq)
Next qq
MsgBox ss
MsgBox tt
End Sub
Hilf mir bitte auf die Sprünge! :-)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Aber das hatte ich doch gemeint, ...
09.03.2013 15:07:07
Luc:-?
…Erich,
wobei natürlich sein kann, dass das für dich schon lange kein interessanter Effekt mehr ist. Aber such doch mal in der einschlägigen Literatur, wo so etwas überhaupt mal erwähnt wird. Indizierte Laufvariablen kommen da mE schlichtweg nicht vor (übrigens eines meiner Kriterien zur Beurteilung eines VBA-Fachbuchs)…
Interessant wäre natürlich, ob das auch mit gewissen Objekten geht, aber da wird wohl, falls existent, die Item-(bzw Cells-)Eigen­schaft Vorrang haben.
Den anderen Effekt bemerkst du, wenn du qq(0) verwendest. Damit hast du quasi einen Index für den Durchlauf, etwas, was so mancher sonst in diesem Schleifentyp vermisst. Natürlich ist dabei klar, dass das übliche Vorgehen letztlich unver­zichtbar ist und hier nur auf eine andere Ebene (d.h., in eine externe Fkt) verlagert wurde. Aber solche Hilfsmittel sind ja unter Pgmierern durchaus üblich, um sich an anderer Stelle die Arbeit zu erleichtern.
Das Ganze natürlich mal abgesehen davon, dass man so auch beliebige Teil­ergeb­nisse leicht ermitteln könnte — das ggf auch für deutlich mehr Vektoren. In einer Variante habe ich wohl max 19-20 zugelassen und auch noch ebensoviele Sofort-Zusammen­fas­sungs­arten von Summe bis zu statis­tischen Fktt mit und ohne lfdNr. Mit einer anderen Variante konstruiere ich Matrizen in Form von Vektoren, die aus Vektoren bestehen (ähnlich wie hier), aber nicht in Zellbereichen abgebildet wdn können. Egal wie groß der Bereich für die MatrixFml gewählt wird, es erscheint immer #WERT!. Mit verschie­denen Methoden können bei Bedarf und Verbin­dung zur Daten­quelle die Original­daten angezeigt wdn → eine Schutz­möglichkeit vor unauthori­sierter Kopie, falls sich die Pgmm in einem AddIn befinden, auf das der Kopierer ebenfalls keinen Zugriff hat. Sicher gibt's noch mehr sinnvolle Anwendungs­möglich­keiten für so etwas… ;-)
Dank für die Aufmerksamkeit und, falls interessiert, viel Spaß bei weiter­führenden Versuchen! ;-)
Luc :-?
PS@robert: Kommt dir davon nicht etwas bekannt vor…? ;-)
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige