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

ich habe in Spalte "C" verschiedene Uhrzeiten im Format "[h]:mm"abgespeichert:
15:00
15:00
16:00
17:00
17:00
17:00
18:00
18:00
16:00
Ich möchte alle Uhrzeiten nur einmal (ohne Duplikate) in einem Speicher arrTemp sammeln:
[code]For lngZeile = 2 To Z
    If IsError(Application.Match(Cells(lngZeile, 3), arrTemp, 0)) Then     ' schließt vorhandene Datensätze aus
        ReDim Preserve arrTemp(0 To lngAnz)
        arrTemp(lngAnz) = Cells(lngZeile, 3)
        lngAnz = lngAnz + 1
    End If
Next[/code]

Der Code liefert mir als Speicherinhalt aber folgende Liste:
0,625
0,666666667
0,708333333
0,75
0,666666667
Darin dürfte doch die 0,666666667 aber nur einmal vorkommen...?

Weiß jemand was ich falsch mache? Danke für jeden Tipp.
VG A.

7 Antworten

0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo ahorn38,

ist eine der beiden 16:00 Zeiten vielleicht nicht genau 16:00, sondern noch der Bruchteil einer Minute mehr?
Die Darstellung bliebe formatierungsbedingt auf 16:00 und wenn es nur ein sehr kleiner Bruchteil ist, bleibt die 0,666666667 unverändert.

Gruß
computerschrat
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo,
das hatte ich auch schon vermutet, trifft aber nicht zu. Ich hatte den Speicher als Liste ausgegeben und beide Dezimalzahlen mit "Idendität" überprüft = WAHR. Dann habe ich noch die 16:00 Uhr auf die andere Zeile kopiert, was auch nicht zum Erfolg geführt hat.
Wirklich mysteriös.....?
Gruß A.
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo,

ich habe die Daten
0,625
0,666666667
0,708333333
0,75
0,666666667
0,791666667
0,375
0,416666667
0,458333333
0,3125
0,416666667
0,569444444
0,583333333
0,708333333
0,645833333
0,6875
0,805555556
0,5625
0,71875
0,541666667
0,458333333
0,333333333
0,4375
0,770833333
0,354166667

 jetzt einmal komplett in eine separate Datei kopiert und dort den Code

ausgeführt - und siehe da es funktioniert einwandfrei, d.h. es werden nur Werte in das Array aufgenommen die vorher nicht enthalten waren.
D.h. doch, daß vorher irgend etwas im Format der Daten nicht gepaßt hat - aber wie kann man das korrigieren?
VG A.
[code]Sub test()
Dim arrX()

m = 1
ReDim arrX(0)
lngAnz = 0
For lngZeile = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    If IsError(Application.Match(Cells(lngZeile, 1), arrX, 0)) Then     ' schließt vorhandene Datensätze aus
        ReDim Preserve arrX(0 To lngAnz)
        arrX(lngAnz) = Cells(lngZeile, 1)
        Cells(m, 2) = arrX(lngAnz)
         m = m + 1
        lngAnz = lngAnz + 1
    End If
Next
End Sub
[/code]
0 Punkte
Beantwortet von
[quote]D.h. doch, daß vorher irgend etwas im Format der Daten nicht gepaßt hat - aber wie kann man das korrigieren?
[/quote]

Hallo Andreas,

auf die Schnelle ungetestet. Weiß daher leider nicht ob's dir hilft. Aber ersetze mal überall im Code [i]Cells(lngZeile, 1)[/i] durch [i]Cells(lngZeile, 1).Value2[/i]

Damit greifst du direkt auf die Dezimaldaten der Uhrzeit zu. Ein falsches Format oder eine Texteingabe müsste dabei ignoriert werden, da Text ja den Value 0 hat. Hab leider grad keine Zeit zum Testen.

Gruß Mr. K.
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Andreas,

hier noch eine andere Möglichkeit, die du mal in deiner Orginaldatei testen kannst:

[code]Sub test2()

Dim arrAlle()
Dim arrX()
Dim lngLetzte As Long
Dim lngAnz As Long
Dim a As Long
Dim x As Long
Dim bDoppel As Boolean

lngAnz = 0
lngLetzte = Cells(Rows.Count, 1).End(xlUp).Row
arrAlle = Range(Cells(1, 1), Cells(lngLetzte, 1))
ReDim arrX(0)

For a = 1 To lngLetzte
 bDoppel = False
 For x = LBound(arrX) To UBound(arrX)
   'Zeiten in String umwandeln und vergleichen
   If Format(arrAlle(a, 1), "hh:mm") = Format(arrX(x), "hh:mm") Then
     bDoppel = True
     Exit For
   End If
 Next x
 If bDoppel = False Then
  ReDim Preserve arrX(lngAnz)
  arrX(lngAnz) = arrAlle(a, 1)
  lngAnz = lngAnz + 1
 End If

Next a

For i = 0 To UBound(arrX)
 Cells(1 + i, 2) = arrX(i)
Next i

End Sub[/code]

Ist zwar nicht ganz so kurz, wie dein Code, aber ein Versuch ist es ja wert.

Gruß

M.O.
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo Mr.K.
die Spur war sicher richtig. Ich habe im Überwachungsfenster einmal beide Werte verglichen und festgestellt, daß die Dezimalzahlen bis auf die letzte Stelle identisch sind die Typen aber "Variant/Object/Range" und zum anderen "Variant/Double" sind. Dein Tipp hat da leider nicht funktioniert, trotzdem DANKE!!

Hallo M.O.
danke daß du dir so viel Aufwand für mein Problem gemacht hast - es hat sich aber gelohnt! Funktioniert perfekt und hat mich vor Nervenzusammenbruch gerettet. Vielen DANK!

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

kein Problem, ich bin am Vergleich von Zeiten auch fast schon verzweifelt ;-).

Gruß

M.O.
...