Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1076to1080
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

Min und Max mit Bedingung ohne Array

Min und Max mit Bedingung ohne Array
07.06.2009 08:16:45
Tino
Hallo,
ich bräuchte mal eure Hilfe.
Ich bin auf der Suche nach einer geeigneten Formel, die mir den Min bzw. Max Wert von bestimmten Stationen wieder geben kann.
Habe dies mit dieser Array Formel gelöst.
 CDEFG
1  Station001002
2  Min0,6 
3  Max1,1 
4StationWert   
5001    
60010,6   
70010,7   
80010,8   
90010,9   
100011   
110011,1   
12002    
130020,7   
140020,8   
15002    
160021   
170021,1   
180021,2   

Formeln der Tabelle
ZelleFormel
F2{=MIN(WENN(($C:$C=F$1)*($D:$D<>""); $D:$D))}
F3{=MAX(WENN(($C:$C=F$1)*($D:$D<>""); $D:$D))}
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen

Diese ist aber nicht akzeptabel, weil die Spalten C und D theoretisch bis zur letzten Zeile gefüllt sein kann und es bis zu 18 Stationen geben kann, daher ist diese Array- Lösung recht langsam.
Kennt Ihr eine andere Formel die etwas schneller den Min und Max Wert mit diesen Bedingungen ermitteln kann?
Gruß Tino

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
dynamisch oder 1 malig ?
07.06.2009 09:03:50
ransi
HAllo Tino
Soll das Ganze dynamisch sein oder ist das für eine einmalige Auswertung ?
ransi
ist eine einmalige Sache...
07.06.2009 09:19:34
Tino
Hallo,
, danach kann ich die Werte mit VBA fest machen.
Ich habe jetzt schon versucht, weil die Spalten nach Station Sortiert sind, dies mit Indirekt einzuschränken, dies wird dadurch auch etwas schneller, aber gefällt mir immer noch nicht so richtig.
 EF
1Station001
2Min0,6
3Max1,1

Formeln der Tabelle
ZelleFormel
F2{=MIN(WENN((INDIREKT("C"&VERGLEICH(F$1;$C:$C;-1)&":C"&VERGLEICH(F$1;$C:$C;1))=F$1)*(INDIREKT("D"&VERGLEICH(F$1;$C:$C;-1)&":D"&VERGLEICH(F$1;$C:$C;1))<>""); INDIREKT("D"&VERGLEICH(F$1;$C:$C;-1)&":D"&VERGLEICH(F$1;$C:$C;1))))}
F3{=MAX(WENN((INDIREKT("C"&VERGLEICH(F$1;$C:$C;-1)&":C"&VERGLEICH(F$1;$C:$C;1))=F$1)*(INDIREKT("D"&VERGLEICH(F$1;$C:$C;-1)&":D"&VERGLEICH(F$1;$C:$C;1))<>""); INDIREKT("D"&VERGLEICH(F$1;$C:$C;-1)&":D"&VERGLEICH(F$1;$C:$C;1))))}
Enthält Matrixformel:
Umrandende
{ } nicht miteingeben,
sondern Formel mit STRG+SHIFT+RETURN abschließen!
Matrix verstehen

Auch die Funktionen DBMIN und MAX habe ich schon getestet, sind aber auch nicht schneller.
Gruß Tino
Anzeige
Dictionary
07.06.2009 09:39:49
ransi
HAllo Tino
Teste mal :
C:D voll mit Werten, 10000 Unikate in C:C
Tabelle1

 CDEF
1   1
2   0
3   99999999
4    
51   
6199999999  
710  
87298965121  
97529958218  
104873813641  
11450493222  


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit


Public Sub test()
Dim arr
Dim MyDic
Dim L As Long
Dim T As Double
T = Timer
arr = Range("C5:D1048576") 'Den Bereich anpassen z.B.
Set MyDic = CreateObject("Scripting.Dictionary")
For L = 1 To UBound(arr)
    If Not MyDic.exists(arr(L, 1)) Then
        MyDic(arr(L, 1)) = arr(L, 2) 'Unikate sammeln
        Else: 'Max-Werte suchen
        If arr(L, 2) > MyDic(arr(L, 1)) Then MyDic(arr(L, 1)) = arr(L, 2)
    End If
Next
'
Range("F1").Resize(1, MyDic.Count) = MyDic.keys 'Unikate ausgeben
Range("F3").Resize(1, MyDic.Count) = MyDic.items 'Max-Werte ausgeben
For L = 1 To UBound(arr) 'Min-Werte suchen
    If arr(L, 2) <> "" Then _
        If arr(L, 2) < MyDic(arr(L, 1)) Then MyDic(arr(L, 1)) = arr(L, 2)
Next
Range("F2").Resize(1, MyDic.Count) = MyDic.items 'Min-Werte ausgeben
MsgBox Timer - T
'Aufräumen
Erase arr
Set MyDic = Nothing
End Sub

Lauzeit knapp unter 6 sekunden.
ransi
Anzeige
AW: Dictionary
07.06.2009 10:12:29
Tino
Hallo,
sieht sehr gut aus, muss mal schauen wie ich es hinbiege damit er mir die Liste
in F1 bis zum Ende (W1) richtig einsortiert.
Danke für Deine Unterstützung, damit kann ich weiter basteln.
Gruß Tino
AW: Dictionary
07.06.2009 10:20:29
ransi
HAllo Tino
Einfach das dictionary nach den gewollten werten nochmal absuchen ;-)
Die Wertepaare sind ja genau der Sinn eines Dictionarys.
' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit


Public Sub test()
Dim arr
Dim MyDic
Dim L As Long
Dim T As Double
Dim out
out = Range("F1:W3")
T = Timer
arr = Range("C5:D1048576") 'Den Bereich anpassen z.B.
Set MyDic = CreateObject("Scripting.Dictionary")
For L = 1 To UBound(arr)
    If Not MyDic.exists(arr(L, 1)) Then
        MyDic(arr(L, 1)) = arr(L, 2) 'Unikate sammeln
        Else: 'Max-Werte suchen
        If arr(L, 2) > MyDic(arr(L, 1)) Then MyDic(arr(L, 1)) = arr(L, 2)
    End If
Next
'##########
For L = 1 To UBound(out, 2)
    out(3, L) = MyDic(out(1, L))
Next
'##########

For L = 1 To UBound(arr) 'Min-Werte suchen
    If arr(L, 2) <> "" Then _
        If arr(L, 2) < MyDic(arr(L, 1)) Then MyDic(arr(L, 1)) = arr(L, 2)
Next
'##########
For L = 1 To UBound(out, 2)
    out(2, L) = MyDic(out(1, L))
Next
'##########
Range("F1:W3") = out
MsgBox Timer - T
'Aufräumen
Erase arr
Set MyDic = Nothing
End Sub

ransi
Anzeige
Funktioniert, danke. oT.
07.06.2009 10:45:37
Tino
Bei mir nicht...... ?
07.06.2009 11:02:13
robert
hi,
habe euren beitrag verfolgt, bei mir schreibt er nichts in den bereich F1:W3
warum nicht ?
danke und gruß
robert
Danke ! jetzt ist mir klar warum...owT
07.06.2009 11:29:06
robert
AW: ist eine einmalige Sache...
07.06.2009 09:45:45
Gerd
Hallo Tino!
danach kann ich die Werte mit VBA fest machen.
Min; Max; Match gibt es auch in VBA.
Gruß Gerd
dies ist mir bekannt...
07.06.2009 10:17:43
Tino
Hallo Gerd,
dies ist mir schon bekannt, aber es geht um die Geschwindigkeit wie diese Werte ermittelt werden.
Mit dem Vorschlag von Ransi kann ich leben.
Gruß Tino
Anzeige
AW: warum nicht Pivot-Tabelle?
07.06.2009 11:40:54
Daniel
Hi
die Pivot-Tabelle ist für solche Auswertungen eigentlich optimal und mit wenigen Klicks erstellt.
Gruß, Daniel
AW: warum nicht Pivot-Tabelle?
07.06.2009 12:05:01
Tino
Hallo,
Hintergrund ist ich muss Maschinen Taktzeiten ermitteln.
Zurzeit arbeiten die Abteilungen mit einer Stoppuhr und machen alles von Hand zu Fuß
(ist kein Witz),
obwohl die Daten zur Auswertung alle zur Verfügung stehen,
aber keiner weis wie er mit diesen Daten umgehen soll oder kann.
Die Daten die ich bekomme werden von einer Auswertung aus einem Webinterface erstellt und liegen als temporär geöffnete .csv Datei vor.
Ich baue nun ein Add-In, um die Daten direkt in der geöffneten Datei zu analysieren.
Da hier alles irgendwelchen Normen unterliegt, muss auch die Auswertung zum Schluss ein ganz bestimmtes aussehen haben.
Gruß Tino
Anzeige
AW: warum nicht Pivot-Tabelle?
07.06.2009 13:40:03
Daniel
Hi
wenn du sowieso ein Add-Inn schreibst, dann kannst du doch auch eine UDF schreiben, die Geschwindigkeitsoptimiert den Max-Wert für jede Maschine ermittelt.
hier mal ein Beispiel die Funktion MaxWenn(), sie funktioniert wie SummeWenn mit den gleichen Parametern, nur das halt der Max-Wert ermittlelt wird.
Public Function MaxWenn(Suchbereich As Range, Suchwert As Variant, Wertebereich As Range) As _ Double Dim arrSuche Dim arrWerte Dim i As Long arrSuche = Intersect(Suchbereich, Suchbereich.Parent.UsedRange).Value arrWerte = Intersect(Wertebereich, Wertebereich.Parent.UsedRange).Value For i = 1 To UBound(arrSuche) If arrSuche(i, 1) = Suchwert Then If IsNumeric(arrWerte(i, 1)) Then If arrWerte(i, 1) > MaxWenn Then MaxWenn = arrWerte(i, 1) End If End If Next End Function


dadurch, daß der Suchbereich automatisch an den real benutzten Zellbereich angepasst wird (die Zeilen mit INTERSECT), kannst du in dieser Formel auch problemlos die Zellbezüge für ganze Spalten verwenden, ohne daß es wie bei den Matrix-Formeln extrem langsam wird, weil wirklich nur den benötigte Bereich durchgearbeitet wird.
Gruß, Daniel
ps. die entsprechende MIN-Funktion kannst du mit diesem Beispiel sicherlich selber erstellen.

Anzeige
AW: warum nicht Pivot-Tabelle?
07.06.2009 14:05:44
Tino
Hallo,
funktioniert auch ganz gut ist aber auch wieder wesentlich langsamer wie mit dem dictionary.
Da die Tabellen immer gleich aufgebaut sind nur die Anzahl der Einträge variiert
(dies kann man leicht feststellen) ist die Version von Ransi bestens geeignet.
Danke trotzdem für Deine Unterstützung und wünsche allen noch einen schönen Sonntag.
Gruß Tino
AW: warum nicht Pivot-Tabelle?
13.06.2009 08:45:59
Hans
sorry, nur ein test
hans
AW: warum nicht Pivot-Tabelle?
13.06.2009 09:42:42
Hans
sorry, ein test
hans

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige