1.8k Aufrufe
Gefragt in Tabellenkalkulation von ahorn38 Experte (3.2k Punkte)
Hallo,

ich habe in einem 3-dimensionalen Array in der dritten Dimension jeweils ein Datum stehen. Ich suche das Element mit dem ältesten Datum. Habe einiges versucht, aber bin noch nicht zum Erfolg gekommen. Hat jemand einen Tipp?

Gruß A.

11 Antworten

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Andreas,

hast du schon mal mit MIN versucht, das älteste Datum zu finden?

Gruß

M.O.
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo,

ich vermute, dass ich keine entsprechende "Abfrage" in einem dreidimensionales array machen kann..??
Ich habe deshalb das dreidimensionale Array in ein zwei- und ein eindimensionales Array "zerlegt" wobei das eindimensionale Array jeweils Datumseinträge hat.
Mit
WorksheetFunction.Max(arrSpeicherD)

habe ich versucht das auszuwerten, erhalte aber als Ergebnis immer "0"...?
Gruß A.
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Andreas,

ich habe das mal getestet und die reine Worksheetfunction gibt bei einem mehrdimensionalen Array 0 zurück. Du müsstest das mit Index kombinieren, damit du die Position im Array erhälst:

Du mußt aber Worksheet funktion.Min nehmen, da du ja das kleinste (= älteste) Datum finden willst. So funktioniert dann die Suche:
a = Application.WorksheetFunction.min(WorksheetFunction.Index(arrTest, 0, 2))
MsgBox a & " - " & arrTest(a, 2)

Die Index-Funktion ist aber auf 65536 Zeilen limitiert.

Bei großen Datenbeständen ist eine Schleife ggf. schneller.

Dim arrTest(4, 2) As Variant
Dim i As Long
Dim a As Long

a = LBound(arrTest)

For i = LBound(arrTest) + 1 To UBound(arrTest)
If arrTest(i, 2) < arrTest(a, 2) Then a = i
Next i

MsgBox "Das älteste Datum befindet sich an Position " & a & " im Array:" & vbLf & arrTest(a, 0) & ";" & arrTest(a, 1) & ";" & arrTest(a, 2)


Gruß

M.O.
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo M.O.
danke für deinen Tipp!! Das Prinzip verstehe ich und es scheint mein Problem genau zu treffen! Allerdings habe ich ein Problem mit den Anpassung an meine (vereinfachte) Struktur.

Meine Datei Spalten "D", "E", "F" hat folgenden Aufbau:
Schulze Giuseppe 21.10.1965
Müller Pietro 13.04.2002


"> Meyer Claudia 17.01.2005
Schulze Giuseppe 21.10.1965
Müller Pietro 13.04.2002



Ich speichere die Datensätze in dem Array und suche den Datensatz mit dem ältesten Datum - also den 2. mit dem 21.10.1965.

Sub Test()

Dim arrSpeicher()
Dim lmgAnz As Long, i As Long, j As Long, lngZähler As Long

For j = 1 To 3
ReDim Preserve arrSpeicher(0 To 2, 0 To lngAnz)
arrSpeicher(0, lngAnz) = Cells(j, 5)
arrSpeicher(1, lngAnz) = Cells(j, 4)
arrSpeicher(2, lngAnz) = Cells(j, 6) ' hier steht das Datum
lngAnz = lngAnz + 1

Next
lngAnz = 0

a = Application.WorksheetFunction.Min(WorksheetFunction.Index(arrSpeicher, 0, 2))
MsgBox a & " - " & arrSpeicher(a, 2)

End Sub


Hier passt jetzt allerdings dein Code nicht dazu, da du offenbar eine andere Array-Struktur hast. Kannst du noch mal helfen? Danke und Gruß! A.
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
... sorry, ich kriege die Kopie der Beispiel-Daten nicht so richtig in Form.
3 Datensätze Spalten "D" bis "F" mit Name, Vorname, Geburtstag:
Meyer Claudia 17.01.2005
Schulze Giuseppe 21.10.1965
Müller Pietro 13.04.2002
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi ihr beiden und all ^^

Andreas,deine Syntax bildet ein 2 dimensionales Array ab
preserve verlangt ein 1 dimensionales array

1 Dimension 0 to 2
2 Dimension 0 To lngAnz

ist eine Dimension zuviel !

gruss nighty
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi Andreas ^^

ich vermute auch das eine worksheetfunction eindimensionale Arrays fordert

gruss nighty
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo,

auch bei einem ganz einfachen eindimensionalen Beispiel kriege ich immer wieder Fehler "2042".
Ich lese die drei Datumswerte
17.01.2005
13.04.2002
21.10.1965
in ein Array:
For j = 1 To 3
ReDim Preserve arrSpeicher( 0 To lngAnz)
arrSpeicher( lngAnz) = Cells(j, 1)
lngAnz = lngAnz + 1

Next

Mit folgendem will ich die Position des ältesten Datum im Array ermittel:
x = Application.Min(arrSpeicherD)
y = Application.Match(x, arrSpeicherD)

x wird noch richtig berechnet, bei y erscheint der Fehler...??? Was mache ich bloß falsch??? A.
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Andreas,

ermittle die Position doch einfach über eine Schleife.
Hier in Anlehnung an deinen Code aus Anwort 4:

Sub Test1()

Dim arrSpeicher()
Dim lngAnz As Long
Dim i As Long
Dim j As Long
Dim lngZähler As Long
Dim a As Variant

lngAnz = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
ReDim arrSpeicher(2, lngAnz - 1)

For j = 0 To lngAnz - 1
arrSpeicher(0, j) = Cells(j + 1, 5)
arrSpeicher(1, j) = Cells(j + 1, 4)
arrSpeicher(2, j) = Cells(j + 1, 6) ' hier steht das Datum
Next j

a = 0

For j = 0 To UBound(arrSpeicher, 2)
If arrSpeicher(2, j) < arrSpeicher(2, a) Then a = j
Next j

MsgBox a & " - " & arrSpeicher(0, a) & " - " & arrSpeicher(1, a) & " - " & arrSpeicher(2, a)

End Sub


Gruß

M.O.
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo M.O.
ja, du hast mich überzeugt! Jetzt passt auch die Struktur und die Auswertung verläuft einwandfrei!!!
Vielen Dank!! Gruß A.
...