26.02.2018, 11:27 (Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2018, 12:19 von badalamente.)
Hallo Liebe Comunity,
ich stelle mich kurz vor.
Meine Nickname ist badalamente und komme aus der schönen Pflaz. Zurzeit bin ich studen an einer TU und befasse mich mit Excel.
Besitze einige VBA Kentnisse in Access und sehr wenige in Excel.
Folgende Ausgangslage:
Name Nachname Strecke Zeit Strecke/ Nachname Zeit
Name
x y 1 00:02 1
x y 1 00:02 x y 00:02
x y 1 00:03 x g ##
x g 1 00:02 a b 0:04
x g 1 00:01 2
a b 1 00:04 c c 0:05
a b 1 00:04
c d 2 00:05
c d 2 00:05
c d 2 00:04
Ziel: Über einen Makro / Vba code eine Tablle erzeugen die für jede Strecke den zugehörigen Teilnehmer mit Name, Nachname und am häufigsten gelaufen Zeit (Modal funktion) angibt.
Die Ausgangstabelle wird ständig geändert und ist sehr lang (Viele Zeilen). Über ein Button soll die Prozedur von alleine laufen.
Wie kann ich das realisieren ? hat jmd Vorschläge ?
Schöne Grüße
26.02.2018, 12:53 (Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2018, 12:53 von Ego.)
Hallo b...,
noch einige Fragen:
1. Wie wird die Ausgangstabelle erstellt.
2. Kann das Programm davon ausgehen, dass die Zeilen nach Strecke, Name, Nachname und Zeit sortiert ist.
3. Was soll ausgeben werden wenn mehrere Zeiten gleich häufig vorkommen.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Dim Bereich As Range
Dim Arr As Variant
Dim Dic As Object
Dim DicMax As Object, e As Variant
Dim i As Long
Dim a As String, b As String, c As String
'Daten einlesen
With ThisWorkbook.Worksheets("Tabelle1")
Set Bereich = .Range("A2:D" & .Range("A" & .Rows.Count).End(xlUp).Row)
Arr = Bereich.Value
End With
Set Dic = CreateObject("Scripting.Dictionary")
Set DicMax = CreateObject("Scripting.Dictionary")
For i = LBound(Arr, 1) To UBound(Arr, 1)
a = Trim(Arr(i, 1)) & "|" & Trim(Arr(i, 2)) & "|" & Trim(Arr(i, 3))
b = Format(Arr(i, 4), "hh:mm")
c = a & "|" & b
'Unikate zählen
If Dic.Exists(c) Then
Dic(c) = Dic(c) + 1
Else
Dic(c) = 1
End If
'Maximum je Strecke und Teilnehmer
If DicMax.Exists(a) Then
If DicMax(a)(0) < Dic(c) Then DicMax(a) = Array(Dic(c), b)
Else
DicMax(a) = Array(Dic(c), b)
End If
Next i
'Ergebnis ausgeben
With ThisWorkbook.Worksheets("Tabelle2")
.UsedRange.ClearContents
.Range("A1:E1").Value = Array("Name", "Nachname", "Strecke", "Anzahl", "Zeit")
i = 2
For Each e In DicMax.Keys
.Range("A:E").Rows(i).Value = Array(Split(e, "|")(0), Split(e, "|")(1), Split(e, "|")(2), DicMax(e)(0), DicMax(e)(1))
i = i + 1
Next e
End With
'Aufräumen
Dic.RemoveAll
DicMax.RemoveAll
Set Dic = Nothing
Set DicMax = Nothing
Set Arr = Nothing
Set Bereich = Nothing
End Sub
1. Wie wird die Ausgangstabelle erstellt.
2. Kann das Programm davon ausgehen, dass die Zeilen nach Strecke, Name, Nachname und Zeit sortiert ist.
3. Was soll ausgeben werden wenn mehrere Zeiten gleich häufig vorkommen.
Hi Ego,
danke schon einmal dafür, mir helfen zu wollen.
1) Die Tabelle wird aus einem anderm System importiert
2) Ja, dass Programm (EXCEL) kann davon ausgehen dass die Zeile nach Strecke, Name, Nachname und Zeit sortiert ist.
3) das ist egal. Kann "###" sein.
@ Bamberg,
auch dir danke.
Ich werde mir den Code anschauen und Ihn erst einmal sezieren müssen :19: .
Werde mich dann noch einmal melden.
ich habe mir den Code angeschaut und folgendes Problem entdeckt:
Die maximale Zeit mehrerer Datensatzgruppen wird nicht ermitellt. Es wird immer nur der erste Zeitwert ausgegeben
Beispiel Augangstabelle :
Name Nachname Strecke Zeit x y 1 04:12:12
x y 1 00:02:00
x y 1 00:01:00
x y 1 00:03:00 a b 1 00:01:00
a b 1 00:03:00 (eigentlich müsste dieser Wert - 00:03:00 - in der Ergebnistabelle erscheinen)
Ergebnistabelle:
Name Nachname Strecke Zeit x y 1 04:12:12 (das Ergbnis stimmt) a b 1 00:01:00 (das Ergebnis stimmt nicht)
in deiner ersten Anfrage hattest du nach der häufigsten Zeit gefragt und jetzt suchst du die grösste Zeit. Was willst du wirklich?
Wenn alle Zeiten in einer Gruppe nur einmal vorkommen, ist auch die erste Zeit eine der Zeiten die am häufigsten vorkommt.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.