Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1416to1420
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

Namen mit Kriterien finden (VBA)

Namen mit Kriterien finden (VBA)
24.03.2015 08:12:55
MCO
Guten Morgen!
Ich knobel schon seit einiger Zeit an einer Tabelle, die Namen u. Stati (Statusse) zu Personen enthält.
Sie sieht wie folgt aus

Namen
 ABC
4NamenStandAufgaben-index
5aw42081,6995464392
6bw42081,9830385857
7cm42081,3848782723
8dwP42078,1547464353
9eÄ42080,9156163582
10fm42080,2894387148
11gwPio42078,1231585557
12hw42073,9174876032
13im42081,7925270965
14jwP42073,1494335123
Excel-Inn.de
Hajo-Excel.de
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 18.19 einschl. 64 Bit


Gesucht ist der Eintag mit Stats "m" mit dem kleinsten Aufgabenindex.
Ich hätte den Wert aber gern per VBA, ohne Schleife. Leider bin ich nicht fähig die Formel zu erstellen.
Kann mir jemand helfen?
Danke,
Gruß, MCO

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Namen mit Kriterien finden (VBA)
24.03.2015 08:24:00
ChrisL
Hi
Ich denke das wäre sinngemäss folgende Formel:
http://www.excelformeln.de/formeln.html?welcher=286
Da es sich um eine Array-Formel handelt, kommt dies in VBA einer Schleife gleich.
Ohne Schleife sehe ich wenig Chancen, ausser du filterst, kopierst, sortierst...
Vielleicht hat noch jemand anders eine Idee, aber persönlich würde ich hier eine Schleife einsetzen.
cu
Chris

AW: Namen mit Kriterien finden (VBA)
24.03.2015 08:56:36
MCO
Hallo Chris!
Danke für den Ansatz, einen ähnlichen hab ich schon verfolgt.
Bei der Umsetzung wird klar, dass die Bedingung 0 und den jeweiligen Eintrag wiedergibt, was aber bei MIN bedeutet (kleinster Eintrag gesucht), dass nix wiedergegeben wird.
Daher mußte ich die Werte noch künstlich umrechen (mit 1/Wert) um wieder nach MAX suchen zu können.
Die fertige Formel sieht dann so aus:
=INDEX(A5:A89;VERGLEICH("m"&MAX((B5:B89="m")*(1/C5:C89));B5:B89&1/C5:C89;0))
Als notlösung muß ich dann mal in der Tabelle suchen lassen und nur den Zellwert in VBA verwenden....
Vielen Dank für den Anstoss!
Gruß, MCO

Anzeige
das ist sie wieder, (m)eine AGGREGAT()-Formel ...
24.03.2015 09:22:49
neopa
Hallo MCO,
... kombiniert mit VERWEIS() kann sie auch als {}-freie Lösung geschrieben werden.
Der gesuchte Name ergibt sich kurz und schmerzlos, einfach so:
=VERWEIS(9;1/(C1:C99=AGGREGAT(15;6;C1:C99/(B1:B99="m");1));A:A)
Man könnte die Formel zwar noch kürzer schreiben, aber wegen dem VERWEIS()-MATRIXformelteil sollte der auszuwertende Bereich auf das max. notwendige beschränkt bleiben.
Gruß Werner
.. , - ...

3 Versionen
24.03.2015 10:17:20
MCO
Hallo Werner!
Sehr beeindruckend! An die Verwendung dieser Formel muß ich mich erstmal gewöhnen...
Mittlerweile hab ich dann schon 3 Varianten, die mich zum Ergebnis führen:

liste
 HI
1Axel  
2Axel Axel

verwendete Formeln
Zelle Formel Bereich N/A
H1{=INDEX(Namen;VERGLEICH("m"&MAX((Stand="m")*(1/C5:C89));Stand&1/C5:C89;0))}$H$1 
H2=INDEX(Namen;SUMMENPRODUKT(--(Stand="m");--(1/C5:C89=MAX((Stand="m")*(1/C5:C89)));ZEILE(INDIREKT("1:"&ANZAHL2(Namen)))))  
I2=VERWEIS(9;1/(INDIREKT("C5:C"&ANZAHL2(Namen))=AGGREGAT(15;6;INDIREKT("C5:C"&ANZAHL2(Namen))/--(Stand="m");1));Namen)  
{} Matrixformel mit Strg+Umschalt+Enter abschließen
Matrixformeln sind durch geschweifte Klammern {} eingeschlossen
Diese Klammern nicht eingeben!!


definierte Namen  
Name Bezieht sich auf Tabelle Z1S1-Formel
Namen=liste!$A$5:$A$89 =liste!R5C1:R89C1
Stand=liste!$B$5:$B$89 =liste!R5C2:R89C2
Excel-Inn.de
Hajo-Excel.de
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 18.19 einschl. 64 Bit


Danke für deine Unterstützung!
Gruß, MCO

Anzeige
wieso 3? wozu hier INDIREKT() ? ...
24.03.2015 11:33:51
neopa
Hallo MCO,
... für die Lösung ist INDIREKT() hier nicht erforderlich und gehört mE für derartige Lösungen eher in die "Tonne".
Bleibt (momentan) also nur die Formel in H1 und mein Formelvorschlag, wenn man mal davon absieht, dass die Lösung in H2 auch mit INDEX() anstelle INDIREKT() realisierbar wäre.
Was ist aber, wenn im Zellauswertungsbereich der Spalte C (bei Werten Stand"m") nur ein 0 Wert oder eine Leerzelle steht? Dann versagt momentan auch die Formel H1. Bleibt von den bisherigen Formeln also momentan nur (m)eine übrig.
Und für den Fall, das ein "Aufgaben-Index" bei Stand="m" einen 0 Wert ausweist, müßtest Du Dich noch äußern, ob der in die Auswertung als MIN-Wert gehen soll oder nicht. Je nach dem finde ich für meine AGGREGAT()-Formel dann dafür bei Bedarf auch noch eine Lösungsergänzung.
Übrigens ist Dein momentaner Ansatz über Bereichsnamen sowieso inkonsequent (warum keinen Bereichsnamen für "Aufgaben-Index") und im vorliegender Form, wie bereits aufgezeigt, auch nicht ausreichend dynamisch genug (wäre zwar einfach möglich, ist aber mE hier auch gar nicht notwendig).
Gruß Werner
.. , - ...

Anzeige
AW: wieso 3? wozu hier INDIREKT() ? ...
26.03.2015 08:40:59
MCO
Hallo Werner!
Du hast sicher recht mit deinen Einwänden.
die Formellösung habe ich mittlerweile komplett verworfen, da der "Stand" auf verschiedene Variablen hin geprüft werden soll, auch in Kombination.
Da würde eine Formel so unmenschlich lang werden, dass ich es in VBA umgesetzt habe.
Die "Inkonsequenz" werde ich mir aber abgewöhnen und sofort einen Namen für den Bereich vergeben. :-)
Velen Dank!
Gruß, MCO

AW: Namen mit Kriterien finden (VBA)
24.03.2015 11:03:09
Daniel
Hi
wenn du das wirklich mit VBA ohne Schleife machen willst dann so:
1. Tabelle nach AufgabenIndex aufsteigend sortieren
2. mit der FIND-Funktion nach "m" in Statusspalte suchen (.Find findet den ersten Eintrag, durch die Sortierung ist das dann der mit dem kleinsten Index:
dim Zelle as range
dim Ergebnis as string
With Range("A4:C14")
.sort Key1:=.Cells(1, 3), order1:=xlascending, Header:=xlyes
set Zelle = .columns(2).Find(what:="m", lookat:=xlwhole, searchdirection:=xlnext)
if Zelle is nothing then
Msgbox "kein Eintrag für ""m"" vorhanden"
Else
Ergebnis = Zelle.Offset(0, -1).Value
Msgbox Ergebnis
End if
end with
Gruß Daniel

Anzeige
Danke schön...
26.03.2015 08:53:48
MCO
Danke für die Rückmeldung!
In der Praxis müssen noch ein paar Sachen dazu,
Nach jeder Verwendung wird der Index des namens erhöht, damit ändert sich die Reihenfolge, also muß jedesmal neu gefiltert werden.
Außerdem wird das Kriterium als Variable gesetzt, die auch Mehrfachauswahl enthält, es muß also der
kleinste wert von x/y/z gefunden werden.
Der Funktionsaufruf sieht dann so aus:
Public Sub nächster_VK(aufgabe_nr As String, bereich As Range)
Dim krit As Variant
Dim verk As String
On Error Resume Next
Select Case aufgabe_nr
Case "BH": krit = Array("DAG", "Ä")
Case "1":  krit = Array("DAG", "Ä", "m", "muV")
Case "2":  krit = Array("w", "wPio", "wuV")
Case "P2":  krit = Array("w", "wPio", "wuV", "wP", "Kind")
Case "3":  krit = Array("DAG", "Ä", "m", "muV", "w", "wPio", "wuV", "wP")
Case "P3":  krit = Array("DAG", "Ä", "m", "muV", "mP", "Kind")
End Select
Set ws = Sheets("liste")
'ws.Select
ws.Range("A4").AutoFilter field:=2, Criteria1:=krit, Operator:=xlFilterValues 'Filtern mit  _
array
'Sheets(2).Select
zeil = ws.Range("Namen").Rows.Count + Range("Namen").Row - 1
Wert = WorksheetFunction.Aggregate(5, 5, ws.Range("C5:C" & zeil))'kleinster Wert in sichtbaren  _
Zellen
Set gef = ws.Range("C5:C" & zeil).SpecialCells(xlCellTypeVisible).Find(what:=Wert, lookat:= _
xlWhole)
msgbox ws.Cells(gef.Row, "A") 'name
Gruß, MCO
Anzeige

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige